Классы InputStreamReader и OutputStreamWriter




Работа с файлами

В языке Java есть довольно много классов для работы с файлами и прочими потоками ввода/вывода, они расположены в пакете java.io. Коротко рассмотрим некоторые из них.
Класс File

служит для получения информации о файлах и каталогах. Для создания объекта этого класса есть 3 конструктора, чаще всего используется следующий:

File(String имя_файла) создание объекта 'файл' по его имени в файловой системе

В этом классе есть много полезных функций, например,

isDirectory() проверяет, является ли данный объект каталогом, возвращает логическое значение
isFile() проверяет, является ли данный объект файлом, возвращает логическое значение
lastModified() возвращает дату последней модификации файла
canRead() проверяет, можно ли читать данные из файла, возвращает логическое значение
canWrite() проверяет, можно ли записывать данные в файл, возвращает логическое значение
delete() удаляет файл

и т.п.

Следующие 7 классов используются для работы с двоичными файлами.

Класс FileInputStream

(производный от InputStream)

простейший класс для потокового (последовательного) чтения данных из файла. Объект этого класса создается на основе объекта File или по имени файла в файловой системе, например,

FileInputStream myfile = new FileInputStream("data.txt");

Для чтения данных используются методы

read() читает и возвращает один символ из файла
read(byte [] массив) читает и возвращает массив символов из файла

Для закрытия файла есть метод close, определенный в родительском классе InputStream.

Класс FileOutputStream

(производный от OutputStream)

простейший класс для потокового (последовательного) вывода данных в файл. Объект этого класса создается на основе объекта File или по имени файла в файловой системе, например,

FileOutputStream myfile = new FileOutputStream("data.txt");

Для записи данных используются методы

write(int символ) печатает один символ в файл (обратите внимание, что тип параметра - int!)
write(byte [] массив) печатает массив байтов в файл

Для закрытия файла есть метод close, определенный в родительском классе OutputStream.
Довольно неудобно читать и записывать данные в файл по отдельным байтам. Следующие два класса служат своеобразными "оболочками" для предыдущих классов и позволяют оперировать данными всех стандартных типов.

Класс DataInputStream

(производный от InputStream)

простейший класс для потокового (последовательного) чтения данных стандартных типов из файла. Объект этого класса создается на основе объекта InputStream, т.е., например,

DataInputStream myfile = new DataInputStream(new FileInputStream("data.txt"));

Для всех стандартных типов данных определены методы:

readInt() readFloat() readChar() и т.п. читает значение указанного типа

Для чтения не-латинских букв можно порекомендовать функцию readUTF.

Класс DataOutputStream

(производный от OutputStream)

простейший класс для потоковой (последовательной) записи данных стандартных типов в файл. Объект этого класса создается на основе объекта OutputStream, т.е., например,

DataOutputStream myfile = new DataOutputStream(new FileOutputStream("data.txt"));

Для всех стандартных типов данных определены методы:

writeInt(int число) writeFloat(float число) writeChar(char символ) writeChars(String строка) и т.п. печатает значение указанного типа

Для печати не-латинских букв можно порекомендовать функцию writeUTF.
Классы BufferedInputStream и BufferedOutputStream

используют буферизованный ввод-вывод, поэтому работают более эффективно, чем, например, FileInputStream и FileOutputStream.
Класс RandomAccessFile

класс для работы с файлами произвольного доступа, используется как для чтения, так и для записи. Объект этого класса cоздается на основе объекта File или по имени файла в файловой системе. Конструкторы:

RandomAccessFile(String имя_файла, String режим) RandomAccessFile(File файл, String режим) параметр "режим" может принимать значения: "r" - только для чтения и "rw" - для чтения и записи

Для всех стандартных типов данных определены методы:

readInt() readFloat() readChar() и т.п. читает значение указанного типа
writeInt(int число) writeFloat(float число) writeChar(char символ) writeChars(String строка) и т.п. печатает значение указанного типа

Для смещения внутреннего указателя в любое место файла используется метод

seek(long смещение) смещение задается в байтах от начала файла

Следующие 6 классов используются для работы с текстовыми файлами.

Классы InputStreamReader и OutputStreamWriter

(производные от Reader и Writer)

простейшие классы для чтения/записи из/в текстовый файл. Объекты этих классов создаются на основе объектов InputStream и OutputStream. Например,

InputStreamReader myfile =

new InputStreamReader(new FileInputStream("data.txt"));

OutputStreamWriter myfile =

new OutputStreamWriter(new FileOutputStream("data.txt"));

Оба класса имеют функцию getEncoding для получения текущей кодовой страницы (cp1251 - кодовая страница для русского Windows), а также конструкторы, которые позволяют задать нужную кодовую страницу в качестве второго параметра.
Имеют только методы read и write для чтения/записи символа (строки символов).
Классы FileReader и FileWriter

(производные от InputStreamWriter и OutputStreamWriter)

отличаются от InputStreamWriter и OutputStreamWriter тем, что объекты этих классов cоздаются на основе объекта File или по имени файла в файловой системе, т.е.

FileReader myfile = new FileReader("data.txt");

FileWriter myfile = new FileWriter("data.txt");

а также не имеют конструктора с заданием кодовой страницы.
Классы BufferedReader и BufferedWriter

(производные от Reader и Writer)

используются для буферизованного ввода-вывода данных, поэтому их использование более эффективно, чем, например, FileReader и FileWriter. Создаются на основе объектов Reader и Writer, например,

BufferedReader myfile = new BufferedReader (new FileReader("data.txt"));

BufferedWriter myfile = new BufferedWriter (new FileWriter("data.txt"));

В классе BufferedReader определен метод readLine(), который позволяет читать строку символов.
Классы PipedInputStream и PipedOutputStream

классы для канальных потоков ввода-вывода. Хорошо подходят для обмена информацией между процессами. Более подробно мы рассмотрим их на лекции.
Несколько замечаний по работе с русским текстом.

1. Классы FileWriter и FileReader работают с русскими буквами без проблем:
Запись:

FileWriter myfile = new FileWriter("data.txt");

myfile.write("proba pera --- проба пера");

Чтение:

FileReader myfile = new FileReader("data.txt");

char buf[] =new char[80];

myfile.read(buf);

System.out.println(buf);

2. Классы BufferedWriter и BufferedReader также работают с русскими буквами без проблем:
Запись:

BufferedWriter myfile = new BufferedWriter(new FileWriter("data.txt"));

myfile.write("proba pera --- проба пера");

Чтение:

BufferedReader myfile = new BufferedReader (new FileReader("data.txt"));

System.out.println(myfile.readLine());

3. Функции readUTF и writeUTF классов DataInputStream и DataOutputStream позволяют записывать и читать русские символы в/из файла. При этом получившийся файл будет нечитабельным в текстовых редакторах.
Запись:

DataOutputStream myfile = new DataOutputStream(new FileOutputStream("data.txt"));

myfile.writeUTF("proba pera --- проба пера");

Чтение:

DataInputStream myfile = new DataInputStream(new FileInputStream("data.txt"));

System.out.println(myfile.readUTF());

4. Классы OutputStreamWriter и InputStreamReader позволяют явно указывать кодировку символов, например,
Запись:

OutputStreamWriter myfile = new OutputStreamWriter(new FileOutputStream("data.txt"),"KOI8-R");

System.out.println(myfile.getEncoding());

myfile.write("proba pera --- проба пера");

Чтение:

InputStreamReader myfile = new InputStreamReader(new FileInputStream("data.txt"), "KOI8_R");

System.out.println(myfile.getEncoding());

char buf[] =new char[80];

myfile.read(buf,0,80);

System.out.println(buf);

При этом получившийся файл, разумеется, можно читать в текстовых редакторах.

 

ПРИМЕРЫ

  1. Чтение (указанного пользователем) файла, построчное чтение и вывод на консоль его содержимого, перезапись файла
// Чтение (указанного пользователем) файла// Построчное чтение и вывод на консоль его содержимого// Перезапись файла import java.io.*;class testFile1{ public static void main(String[] args) { String sFileName=""; // Строка для имени файла System.out.println("\nFILE TEST\n"); String stroka="\n"; try { // OutputStreamWriter позволяет явно указать кодировку OutputStreamWriter OSW = new OutputStreamWriter(System.out, "Cp866"); PrintWriter PW = new PrintWriter(OSW, true); PW.println("\nВведите имя файла:"); // InputStreamReader позволяет явно указать кодировку InputStreamReader ISR = new InputStreamReader(System.in, "Cp866"); BufferedReader BR = new BufferedReader(ISR); // ПОСТРОЧНЫЙ ВВОД (ИМЕНИ ФАЙЛА) sFileName = BR.readLine(); // читаем строку (имя файла) PW.println("\nИщем файл "+sFileName); try { FileInputStream in = new FileInputStream(sFileName); PW.println("\nФайл "+sFileName+" найден.\n"); PW.println("\nСодержимое файла "+sFileName+":\n"); // Построчно читаем файл и печатаем его содержимое FileReader FR = new FileReader(sFileName); BufferedReader BRf = new BufferedReader(FR); do { stroka=BRf.readLine(); if(stroka!=null) {PW.println(stroka);} } while(stroka!=null); // Печатаем в файл нашу строку 3 раза FileWriter FW = new FileWriter(sFileName); BufferedWriter BWf = new BufferedWriter(FW); BWf.write("А ТЕПЕРЬ ЗДЕСЬ НОВОЕ СОДЕРЖИМОЕ!!!"); BWf.newLine(); // переходим на новую строку BWf.write("А ТЕПЕРЬ ЗДЕСЬ НОВОЕ СОДЕРЖИМОЕ!!!"); BWf.newLine(); // переходим на новую строку BWf.write("А ТЕПЕРЬ ЗДЕСЬ НОВОЕ СОДЕРЖИМОЕ!!!"); BWf.close();// не забудем закрыть файл PW.println("\n\nФАЙЛ "+sFileName+" ПЕРЕЗАПИСАН.\n\n\n"); } //try catch (FileNotFoundException e) { PW.println("Файл "+sFileName+" не найден."); }//catch (FileNotFoundException e) //catch }//try catch(Exception e) { System.out.println("Something is wrong...."); }//catch(Exception e) }//main}//testFile1
  1. Дозапись в файл
    Предварительно нужно создать текстовый файл с несколькими строчками текста.
    Можно использовать символы кириллицы.
// Чтение и вывод на консоль содержимого (указанного пользователем) файла// Дозапись файлаimport java.io.*;class FileAdd { public static void main(String[] args) { String sFileName=""; // Строка для имени файла String stroka="\n"; try { // Попытаемся создать классы для вывода на консоль // OutputStreamWriter позволяет явно указать кодировку OutputStreamWriter OSW = new OutputStreamWriter(System.out, "Cp866"); PrintWriter PW = new PrintWriter(OSW, true); PW.println("\nВведите имя файла:"); try { // Попытаемся создать классы для чтения с консоли // InputStreamWriter позволяет явно указать кодировку InputStreamReader ISR = new InputStreamReader(System.in, "Cp866"); BufferedReader BR = new BufferedReader(ISR); sFileName = BR.readLine(); // читаем строку (имя файла) // Выведем имя файла на консоль PW.println("\nИщем файл "+sFileName); // Приложение будет работать, пока пользователь не введет exit do { try { // попытаемся найти и открыть файл с именем sFileName FileInputStream in = new FileInputStream(sFileName); PW.println("\nФайл "+sFileName+" найден.\n"); PW.println("\nСодержимое файла "+sFileName+":\n"); try { // Попытаемся создать классы для чтения из файла FileReader FR = new FileReader(sFileName); BufferedReader BRf = new BufferedReader(FR); // Построчно читаем файл и печатаем его содержимое (все классы для этого уже есть) do { stroka=BRf.readLine(); if(stroka!=null) {PW.println(stroka);} } while(stroka!=null); // Запросим строку для дозаписи в файл PW.println("\nВведите строку для дозаписи в файл "+sFileName+" или exit для завершения работы:\n"); stroka=BR.readLine(); // читаем строку (подлежащую дозаписи) try // Попытаемся создать классы для (до)записи в файл { FileWriter FW = new FileWriter(sFileName,true); // ================================================= // NB! Здесь true означает ДОзапись, false - ПЕРЕзапись // ================================================ BufferedWriter BWf = new BufferedWriter(FW); BWf.write(stroka); // дозаписываем строку в конец файла BWf.newLine(); // переходим на следующую строку BWf.close();// не забудем закрыть файл PW.println("\n\nДОЗАПИСЬ В ФАЙЛ "+sFileName+" ПРОИЗВЕДЕНА.\n\n\n"); FR.close(); BRf.close(); } //end_try // Попытаемся создать классы для (до)записи в файл catch(Exception e5) {System.out.println("ERROR in FileWriter or Bufferedriter!");} }//end_ try // Попытаемся создать классы для чтения с консоли catch(Exception e4) {System.out.println("ERROR in FileReader or BufferedReader!");} }//end_try // попытаемся найти и открыть файл с именем sFileName catch(Exception e3) {System.out.println("ERROR: NO FILE "+sFileName+"!!!");} } while(!stroka.equals("exit")); } // end_try // Создадим классы для чтения с консоли catch(Exception e2) {System.out.println("ERROR in InputStreamReader or BufferedReader!!! ");} } // end_try // Создадим классы для вывода на консоль catch(Exception e1) {System.out.println("ERROR in OutputStreamWriter or PrintWriter!!! ");} }//main}//FileAdd

 

  1. Random Access File (файл с прямым доступом)
    После 5-го символа в файле testRAF.txt вставляет символ " * ".
import java.io.*; public class Raf { public static void main(String[] args) { try { //1 RandomAccessFile myRAF=new RandomAccessFile("testRAF.txt","rw"); try { //2 myRAF.seek(5); myRAF.write('*'); myRAF.close(); } //2 catch(IOException e) { System.out.println("Cannot write a char"); } //catch2 }//try catch(FileNotFoundException e) { System.out.println("File Not Found"); }//catch}//main}//Raf


Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-04-06 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: