Форматированное чтение из памяти
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Для чтения «форматированных» данных применяется класс DataInputStream, ориентированный на ввод/вывод байтов, а не символов. В данном случае необходимо использовать классы иерархии InputStream, а не их аналоги на основе класса Reader. Конечно, можно прочитать все, что угодно (например, файл), через InputStream, но здесь используется тип String.

import java.io.*;

public class FormattedMemoryInput {

public static void main(String[] args) throws IOException {

try {

DataInputStream in = new DataInputStream( new ByteArrayInputStream(

            BufferedInputFile.read( "FormattedMemoryInput.java").getBytes()));

while(true)

   System.out.print((char)in.readByte());

} catch(EOFException e) {

System.err.println("End of stream");

 } } }

Для преобразования строки в массив байтов, пригодный для помещения в поток ByteArrayInputStream, в классе String предусмотрен метод getBytes (). Полученный ByteArrayInputStream представляет собой поток InputStream, подходящий для передачи DataInputStream. При побайтовом чтении символов из форматированного потока DataInputStream методом readByte() любое полученное значение будет считаться действительным, поэтому возвращаемое значение неприменимо для идентификации конца потока. Вместо этого можно использовать метод available(), который сообщает, сколько еще осталось символов. В следующем примере показано, как читать файл побайтно:

//: io/TestEOF.java

// Проверка достижения конца файла одновременно с чтением из него по байту.

import java.io.*;

public class TestEOF {

public static void main(String[] args) throws IOException {

DataInputStream in = new DataInputStream( new BufferedInputStream(

   new FileInputStream("TestEOF.java")));

while(in.available() != 0)

System.out.print((char)in.readByte());

}

} /* (Execute to see output) *///:~

Заметьте, что метод available() работает по-разному в зависимости от источника данных; дословно его функция описывается следующим образом: «количество байтов, которые можно прочитать без блокировки». При чтении из файла это означает весь файл, но для другого рода потоков это не обязательно верно, поэтому используйте этот метод разумно.

Определить конец входного потока можно и с помощью перехвата исключения. Впрочем, применение исключений в таких целях считается злоупотреблением.

Вывод в файл

Объект FileWriter записывает данные в файл. При вводе/выводе практически всегда применяется буферизация (попробуйте прочитать файл без нее, и вы увидите, насколько ее отсутствие влияет на производительность — скорость чтения уменьшится в несколько раз), поэтому мы присоединяем надстройку BufferedWriter. После этого подключается PrintWriter, чтобы выполнять форматированный вывод. Файл данных, созданный такой конфигурацией ввода/вывода, можно прочитать как обычный текстовый файл.

//: io/BasicFileOutput.java

import java.io.*;

public class BasicFileOutput {

static String file = "BasicFileOutput.out";

public static void main(String[] args) throws IOException {

BufferedReader in = new BufferedReader( new StringReader(

   BufferedInputFile.read("BasicFileOutput.java")));

PrintWriter out = new PrintWriter( new BufferedWriter(new FileWriter(file)));

int lineCount = 1;

String s;

while((s = in.readLine()) != null )

out.println(lineCount++ + ": " + s);

out.close();

System.out.println(BufferedInputFile.read(file)); // Вывод содержимого файла

} }

При записи строк в файл к ним добавляются их номера. Заметьте, что надстройка LineNumberInputStream для этого не применяется, поскольку этот класс тривиален, да и вообще не нужен. Как и показано в рассматриваемом примере, своя собственная нумерация ничуть не сложнее.

Когда данные входного потока исчерпываются, метод readLine() возвращает null. Для потока out явно вызывается метод close(); если не вызвать его для всех выходных файловых потоков, в буферах могут остаться данные, и файл получится неполным.

Дата: 2019-04-23, просмотров: 48.