Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Часть 10. Файлы и потоки

Читайте также:
  1. Betfair для начинающих. Часть вторая
  2. Betfair для начинающих. Часть первая
  3. Betfair для начинающих. Часть третья
  4. Betfair для начинающих. Часть четвертая
  5. FM передатчик начинающего радиопирата. Часть№2
  6. I часть
  7. II Практическая часть
  8. II часть
  9. II. Основная часть
  10. II. ОСНОВНАЯ ЧАСТЬ

 

В состав пакета 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; просмотров: 21 | Поможем написать вашу работу | Нарушение авторских прав

Пример 3.1. | Пример 3.4. Обработка изображений. | Пример 3.5. Улучшенная анимация. | Пример 3.6. | Пример 4.1. | Простая сериализация. | Пример 5.3. | Часть 6. Программный интерфейс JavaBeans | Часть 7. Разработка Java-апплетов | Часть 8. Обработка сетевых данных |


lektsii.net - Лекции.Нет - 2014-2024 год. (0.042 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав