Читайте также: |
|
В состав пакета java.io включен класс File, определяющий различные методы для операций с файлами (удаление файлов, вывод списка каталогов и пр.), но не предоставляет никаких способов для организации чтения и записи данных в файл. В Java последовательный ввод/вывод осуществляется в рамках потоков, а произвольный доступ осуществляется при помощи класса RandomAccessFile.
Поток (stream) – это объект, из которого или в который данные могу последовательно считываться/записываться. Основными классами, предназначенными для чтения и записи байтовых потоков являются InputStream и OutputStream, а классы Reader и Writer для чтения и записи потоков символов Unicode.
Пример 10.1. Демонстрирует множество методов класса File, оперирующих файлом или каталогом в целом, но не его содержимым.
package Delete.java;import java.io.*; /** * класс содержит метод delete() и программу, * удаляющую заданный файл или каталог. **/public class Delete { /** * основной метод main() самостоятельной программы. После * проверки аргументов для удаления вызывается метод Delete.delete() **/ public static void main(String[] args) { if (args.length!= 1) { // проверка аргументов System.err.println("формат команды: java Delete <файл или каталог>"); System.exit(0); } // вызов метода delete() с отображением сообщений об ошибках. try { delete(args[0]); } catch (IllegalArgumentException e) { System.err.println(e.getMessage()); } } /** * Метод, выполняющий удаление. Вызывается в методе main(), или * других программах. Перед удалением происходит проверка * возможности с выводом сообщений и исключений * IllegalArgumentException. **/ public static void delete(String filename) { // создание объекта File для связи с именем файла File f = new File(filename); // проверка существования файла или каталога и возможность удаления if (!f.exists()) fail("Delete: нет файла или каталога: " +filename); if (!f.canWrite()) fail("Delete: защищен: " + filename); // находятся ли в каталоге файлы if (f.isDirectory()) { String[] files = f.list(); if (files.length > 0) fail("Delete: каталог содержит файлы: " + filename); } // попытка удалить boolean success = f.delete(); // генерация исключения при ошибке выполнения удаления. if (!success) fail("Delete: удаление не удалось"); } /** вспомогательный метод генерации исключения */ protected static void fail(String msg) throws IllegalArgumentException { throw new IllegalArgumentException(msg); }}
Пример 10.2. Осуществление копирования содержимого файла в другой файл. Пример использует класс FileInputStream для чтения байтов из исходного файла и класс FileOutputStream для копирования этих байтов в другой файл.
package FileCopy.java;import java.io.*; /** * Класс организует копирование файлов и определяет метод copy(), * который может использоваться для копирования в других программах. **/public class FileCopy { /** Метод main(), вызывающий метод copy(). */ public static void main(String[] args) { if (args.length!= 2) // проверка аргументов System.err.println("формат: java FileCopy <исходный> <конечный>"); else { // вызов метода copy() для копирования try { copy(args[0], args[1]); } catch (IOException e) { System.err.println(e.getMessage()); } } } /** * метод, осуществляющий множество проверок перед копированием */ public static void copy(String from_name, String to_name) throws IOException { File from_file = new File(from_name); // получение объекта File из String File to_file = new File(to_name); // проверка наличия файла и доступа к нему if (!from_file.exists()) abort("нет файла: " + from_name); if (!from_file.isFile()) abort("нельзя копировать: " + from_name); if (!from_file.canRead()) abort("не доступен для чтения: " + from_name); // если задан каталог, то в качестве имени файла используется исходное if (to_file.isDirectory()) to_file = new File(to_file, from_file.getName()); // если файл существует, то проверяется доступ для записи if (to_file.exists()) { if (!to_file.canWrite()) abort("не доступен для записи: " + to_name); // запрос на разрешение перезаписи System.out.print("перезаписать файл " + to_file.getName() + "? (Y/N): "); System.out.flush(); // ответ пользователя BufferedReader in= new BufferedReader(new InputStreamReader(System.in)); String response = in.readLine(); // если «нет», копирование отменяется if (!response.equals("Y") &&!response.equals("y")) abort("файл не перезаписан"); } else { // если файла с именем нет, то поиск каталога с этим именем String parent = to_file.getParent(); // каталог if (parent == null) // текущий parent = System.getProperty("user.dir"); File dir = new File(parent); // преобразование в файл if (!dir.exists()) abort("каталог не существует: "+parent); if (dir.isFile()) abort("не является каталогом: " + parent); if (!dir.canWrite()) abort("не доступен для записи: " + parent); } // операция копирования FileInputStream from = null; // поток чтения из файла FileOutputStream to = null; // поток для записи в файл try { from = new FileInputStream(from_file); // создание потока ввода to = new FileOutputStream(to_file); // создание потока вывода byte[] buffer = new byte[4096]; // для хранения содержимого int bytes_read; // количество байтов в буфере // считывание в буфер и вывод, пока не достигнем конца файла while((bytes_read = from.read(buffer))!= -1) // чтение до EOF to.write(buffer, 0, bytes_read); // запись } // обязательное закрытие потоков finally { if (from!= null) try { from.close(); } catch (IOException e) {; } if (to!= null) try { to.close(); } catch (IOException e) {; } } } /** вспомогательный метод для генерации исключений */ private static void abort(String msg) throws IOException { throw new IOException("FileCopy: " + msg); }}
Пример 10.3. Использует класс FileViewer для чтения содержимого текстового файла и его отображения в GUI. Вместо байтового потока применяется символьный поток ввода FileReader. Метод actionPerformed() обрабатывает события GUI и создает объект FileDialog для организации выбора пользователем файла.
package FileViewer.java;import java.awt.*;import java.awt.event.*;import java.io.*; /** * класс создает и отображает окно, содержащее TextArea * с содержимым текстового файла. **/public class FileViewer extends Frame implements ActionListener { String directory; // каталог, принимаемый по умолчанию FileDialog TextArea textarea; // область для отображения содержимого /** вспомогательный конструктор: окно просмотра открывается пустым */ public FileViewer() { this(null, null); } /** отображается файл текущего каталога */ public FileViewer(String filename) { this(null, filename); } /** * конструктор объекта FileViewer для отображения файла * из заданного каталога **/ public FileViewer(String directory, String filename) { super(); // создание рамки // уничтожение окна addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); } }); // создание области TextArea для отображения содержимого textarea = new TextArea("", 24, 80); textarea.setFont(new Font("MonoSpaced", Font.PLAIN, 12)); textarea.setEditable(false); this.add("Center", textarea); // нижняя панель для 2 кнопок Panel p = new Panel(); p.setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 5)); this.add(p, "South"); // создание 2 кнопок с обработкой событий при нажатии Font font = new Font("SansSerif", Font.BOLD, 14); Button openfile = new Button("Open File"); Button close = new Button("Close"); openfile.addActionListener(this); openfile.setActionCommand("open"); openfile.setFont(font); close.addActionListener(this); close.setActionCommand("close"); close.setFont(font); p.add(openfile); p.add(close); this.pack(); // определение каталога if (directory == null) { File f; if ((filename!= null)&& (f = new File(filename)).isAbsolute()) { directory = f.getParent(); filename = f.getName(); } else directory = System.getProperty("user.dir"); } this.directory = directory; // запомнить каталог для FileDialog setFile(directory, filename); // загрузка и отображение файла } /** * загрузка и отображение **/ public void setFile(String directory, String filename) { if ((filename == null) || (filename.length() == 0)) return; File f; FileReader in = null; // считывание и отображение содержимого текстового файла // потоком FileReader вместо FileInputStream. try { f = new File(directory, filename); // создание объекта file in = new FileReader(f); // поток для чтения символов char[] buffer = new char[4096]; // чтение 4K за 1 прием int len; // количество символов textarea.setText(""); // очистка while((len = in.read(buffer))!= -1) { // считывание String s = new String(buffer, 0, len); // преобразование в строку textarea.append(s); // отображение строк } this.setTitle("FileViewer: " + filename); // заголовок окна textarea.setCaretPosition(0); // к началу файла } // отображение ошибок catch (IOException e) { textarea.setText(e.getClass().getName() + ": " + e.getMessage()); this.setTitle("FileViewer: " + filename + ": исключение ввода/вывода"); } // обязательное закрытие потока ввода! finally { try { if (in!=null) in.close(); } catch (IOException e) {} } } /** * обработка нажатий кнопок **/ public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (cmd.equals("open")) { // если "Open" // создание диалогового окна для выбора файла FileDialog f = new FileDialog(this, "Open File", FileDialog.LOAD); f.setDirectory(directory); // каталог по умолчанию // ожидание ответа пользователя f.show(); directory = f.getDirectory(); // запомнить каталог setFile(directory, f.getFile()); // загрузка файла f.dispose(); // закрытие окна диалога } else if (cmd.equals("close")) // если "Close" this.dispose(); // закрытие окна } /** * Метод FileViewer может использоваться в других классах или * самостоятельно за счет метода main(). **/ static public void main(String[] args) throws IOException { // создание FileViewer Frame f = new FileViewer((args.length == 1)?args[0]:null); // подготовка к выходу при закрытии FileViewer f.addWindowListener(new WindowAdapter() { public void windowClosed(WindowEvent e) { System.exit(0); } }); // открытие окна f.show(); }}
Пример 10.4. Использует поток GrepReader, который считывает строки текста из заданного потока Reader и возвращает только те строки, которые содержат заданную подстроку, осуществляя построчную фильтрацию.
package GrepReader.java;import java.io.*; /** * этот подкласс BufferedReader фильтрует строки * не содержащие образец **/public class GrepReader extends BufferedReader { String pattern; // строка-фильтр /** передача строки базовому классу и ее запоминание */ public GrepReader(Reader in, String pattern) { super(in); this.pattern = pattern; } /** * фильтр вызывает метод readLine() для выбора строк **/ public final String readLine() throws IOException { String line; do { line = super.readLine(); } while ((line!= null)&& line.indexOf(pattern) == -1); return line; } /** * использование класса GrepReader для * вывода строк файла с заданным содержанием **/ public static class Test { public static void main(String args[]) { try { if (args.length!= 2) throw new IllegalArgumentException("уточните аргументы"); GrepReader in=new GrepReader(new FileReader(args[1]), args[0]); String line; while((line = in.readLine())!= null) System.out.println(line); in.close(); } catch (Exception e) { System.err.println(e); System.out.println("формат: java GrepReader$Test" + " <образец> <файл>"); } } }}
Пример 10.5. Демонстрирует организацию поиска, открытия и копирования информации из текстового файла. Создана в среде NetBeans.
/*
* NewJFrame.java
*
* Created on 25.10.2010, 23:38:36
*/
package jfilechooserdemo;
import java.io.*; // чтение потоков
public class NewJFrame extends javax.swing.JFrame {
public NewJFrame() {
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
fileChooser = new javax.swing.JFileChooser();
PopupMenu = new javax.swing.JPopupMenu();
jMenuItem5 = new javax.swing.JMenuItem();
jMenuItem6 = new javax.swing.JMenuItem();
jMenuItem7 = new javax.swing.JMenuItem();
jScrollPane1 = new javax.swing.JScrollPane();
textarea = new javax.swing.JTextArea();
jMenuBar1 = new javax.swing.JMenuBar();
jMenu1 = new javax.swing.JMenu();
jMenuItem1 = new javax.swing.JMenuItem();
jMenu2 = new javax.swing.JMenu();
jMenuItem2 = new javax.swing.JMenuItem();
jMenuItem3 = new javax.swing.JMenuItem();
jMenuItem4 = new javax.swing.JMenuItem();
fileChooser.setDialogTitle("Это мое диалоговое окно открытия");
jMenuItem5.setText("Копировать");
jMenuItem5.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem5ActionPerformed(evt);
}
});
PopupMenu.add(jMenuItem5);
jMenuItem6.setText("Вставить");
jMenuItem6.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem6ActionPerformed(evt);
}
});
PopupMenu.add(jMenuItem6);
jMenuItem7.setText("Вырезать");
jMenuItem7.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem7ActionPerformed(evt);
}
});
PopupMenu.add(jMenuItem7);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
textarea.setColumns(20);
textarea.setRows(5);
textarea.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseReleased(java.awt.event.MouseEvent evt) {
textareaMouseReleased(evt);
}
});
jScrollPane1.setViewportView(textarea);
jMenu1.setText("File");
jMenuItem1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F1, 0));
jMenuItem1.setMnemonic('O');
jMenuItem1.setText("open");
jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem1ActionPerformed(evt);
}
});
jMenu1.add(jMenuItem1);
jMenuBar1.add(jMenu1);
jMenu2.setText("Edit");
jMenuItem2.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_C, java.awt.event.InputEvent.CTRL_MASK));
jMenuItem2.setText("Cop");
jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem2ActionPerformed(evt);
}
});
jMenu2.add(jMenuItem2);
jMenuItem3.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_V, java.awt.event.InputEvent.CTRL_MASK));
jMenuItem3.setMnemonic('P');
jMenuItem3.setText("Past");
jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem3ActionPerformed(evt);
}
});
jMenu2.add(jMenuItem3);
jMenuItem4.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_X, java.awt.event.InputEvent.CTRL_MASK));
jMenuItem4.setMnemonic('C');
jMenuItem4.setText("Cut");
jMenuItem4.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem4ActionPerformed(evt);
}
});
jMenu2.add(jMenuItem4);
jMenuBar1.add(jMenu2);
setJMenuBar(jMenuBar1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout (getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(64, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
File file;
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
if(fileChooser.showOpenDialog(null)!= fileChooser.APPROVE_OPTION){ // файл не выбран
System.out.println("Отказались от выбора");
return;
}
//записываем в file выбранный файл
file = fileChooser.getSelectedFile();
//запрашиваем выбранный файл в поток
try{
InputStream fileInpStream = new FileInputStream(file);
//запрашиваем обьём файла в байтах
int size=fileInpStream.available();
fileInpStream.close();
//buff - массив в который считываем весь файл
char[] buff=new char[size];
//читаем файл
Reader fileReadStream=new FileReader(file);
int count=fileReadStream.read(buff);
//выводим файл в текстовую область
textarea.setText(String.copyValueOf(buff));
fileReadStream.close();
}catch(Exception e) { // обработка ошибок
}
}
private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {
textarea.copy(); // копируем
}
private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {
textarea.paste(); // вставляем
}
private void jMenuItem4ActionPerformed(java.awt.event.ActionEvent evt) {
textarea.cut(); // вырезаем
}
private void textareaMouseReleased(java.awt.event.MouseEvent evt) {
if (evt.isPopupTrigger()) {
PopupMenu.show(textarea,20,54);
PopupMenu.show(evt.getComponent(),
evt.getX(), evt.getY());
} // TODO add your handling code here:
}
private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) {
textarea.copy(); // копируем
}
private void jMenuItem6ActionPerformed(java.awt.event.ActionEvent evt) {
textarea.paste(); // вставляем
}
private void jMenuItem7ActionPerformed(java.awt.event.ActionEvent evt) {
textarea.cut(); // вырезаем
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JPopupMenu PopupMenu;
private javax.swing.JFileChooser fileChooser;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenu jMenu2;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem jMenuItem1;
private javax.swing.JMenuItem jMenuItem2;
private javax.swing.JMenuItem jMenuItem3;
private javax.swing.JMenuItem jMenuItem4;
private javax.swing.JMenuItem jMenuItem5;
private javax.swing.JMenuItem jMenuItem6;
private javax.swing.JMenuItem jMenuItem7;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea textarea;
// End of variables declaration
}
Дата добавления: 2015-09-11; просмотров: 80 | Поможем написать вашу работу | Нарушение авторских прав |