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

Байтовые



Символьные


Гаврилов А.В., Клименков С.В., Харитонова А.Е., Цопа Е.А.

Программирование на языке Java. Конспект лекций – СПб: Университет ИТМО, 2015. – 126 с.

 


 

http://wikijava.it-cache.net/index.php@title=Glava_16_Thinking_in_Java_4th_edition.html



Типичное использование потоков ввода/вывода

Хотя из классов библиотеки ввода/вывода, реализующих потоки, можно составить множество разнообразных конфигураций, обычно используется несколько наиболее употребимых. Следующие примеры можно рассматривать как простое руководство по созданию типичных сочетаний классов для организации ввода/вывода и координации их взаимодействия. В этих примерах используется упрощенная обработка исключений с передачей их на консоль, но такой способ подойдет только для небольших программ и утилит. В реальном коде следует использовать более совершенные средства обработки ошибок.

Буферизованное чтение из файла

Чтобы открыть файл для посимвольного чтения, используется класс FileInputReader; имя файла задается в виде строки (String) или объекта File. Ускорить процесс чтения помогает буферизация ввода, для этого полученная ссылка передается в конструктор класса BufferedReader. Так как в интерфейсе класса- имеется метод readLine(), все необходимое для чтения имеется в вашем распоряжении. При достижении конца файла метод readLine() возвращает ссылку null.

import java.io.*;

public class BufferedInputFile { // Throw exceptions to console:

public static String read(String filename) throws IOException { // Reading input by lines:

BufferedReader in = new BufferedReader( new FileReader(filename));

String s;

StringBuilder sb = new StringBuilder();

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

sb.append(s + "\n");

in.close();

return sb.toString();

}

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

System.out.print(read("BufferedInputFile.java"));

}

}

 

Объект StringBuilder sb служит для объединения всего прочитанного текста (включая переводы строк, поскольку метод readLine() их отбрасывает). В завершение файл закрывается методом close().

Чтение из памяти

В этой секции результат String файла BufferedInputFile.read() используется для создания StringReader. Затем символы последовательно читаются методом read(), и каждый следующий символ посылается на консоль.

import java.io.*;

public class MemoryInput {

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

StringReader in = new StringReader( BufferedInputFile.read("MemoryInput.java"));

int c;

while((c = in.read()) != -1)

System.out.print((char)c);

}

}

Обратите внимание: метод read() возвращает следующий символ в формате int, и для правильного вывода его необходимо предварительно преобразовать в char.

Вывод в файл

Объект 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(); если не вызвать его для всех выходных файловых потоков, в буферах могут остаться данные, и файл получится неполным.

Стандартный ввод/вывод

Класс Scanner

Класс Scanner позволяет существенно упростить решение задачи, считывания чисел, введенных с клавиатуры:

import java.util.* ;

class AvgNums {

public static void main ( String args[] ) {

Scanner conin = new Scanner (System.in) ;

int count = 0;

double sum = 0.0;

System.out.println( " B в e дит e числа для подсчета " ) ;

while ( conin.hasNext()) {

if(conin.hasNextDouble()){

sum+=conin.nextDouble();

count++ ;

}

else{

String str=conin.next();

if(str.equals("Y"))break;

else{

  System.out.println("O шибк a формата данных .");

return;

conin.close();

System.out.println("Cpe дн ee равно "+sum/count);

Эта программа читает числа с клавиатуры и суммирует их до тех пор, пока пользователь не введет символ "Y" . В таком случае она прекращает ввод и выводит среднее значение введенных чисел.

// Use Scanner to compute an average of the values in a file.

import java.util.*;

import java.io.*;

 

class AvgFile {

public static void main(String args[])

throws IOException {

 

int count = 0;

double sum = 0.0;

 

// Write output to a file.

FileWriter fout = new FileWriter("test.txt");

fout.write("2 3.4 5 6 7.4 9.1 10.5 done");

fout.close();

 

FileReader fin = new FileReader("Test.txt");

 

Scanner src = new Scanner(fin);

 

// Read and sum numbers.

while(src.hasNext()) {

if(src.hasNextDouble()) {

   sum += src.nextDouble();

   count++;

}

else {

   String str = src.next(); 

   if(str.equals("done")) break;

   else {

     System.out.println("File format error.");

     return;

   }

}

}

 

src.close();

System.out.println("Average is " + sum / count);

}

}

 

listing 24

// Use Scanner to read various types of data from a file.

import java.util.*;

import java.io.*;

 

class ScanMixed {

public static void main(String args[])

throws IOException {

 

int i;

double d;

boolean b;

String str;

 

// Write output to a file.

FileWriter fout = new FileWriter("test.txt");

fout.write("Testing Scanner 10 12.2 one true two false");

fout.close();

 

FileReader fin = new FileReader("Test.txt");

 

Scanner src = new Scanner(fin);

 

 

// Read to end.

while(src.hasNext()) {

if(src.hasNextInt()) {

   i = src.nextInt();

   System.out.println("int: " + i);

}

else if(src.hasNextDouble()) {

   d = src.nextDouble();

   System.out.println("double: " + d);

}

else if(src.hasNextBoolean()) {

   b = src.nextBoolean();

   System.out.println("boolean: " + b);

}

else {

   str = src.next();

   System.out.println("String: " + str);

}

}

 

src.close();

}

}

 

listing 25

// Use Scanner to compute an average a list of

// comma-separated values. 

import java.util.*;

import java.io.*;

 

class SetDelimiters {

public static void main(String args[])

throws IOException {

 

int count = 0;

double sum = 0.0;

 

// Write output to a file.

FileWriter fout = new FileWriter("test.txt");

 

// Now, store values in comma-separated list.

fout.write("2, 3.4, 5,6, 7.4, 9.1, 10.5, done");

fout.close();

 

FileReader fin = new FileReader("Test.txt");

 

Scanner src = new Scanner(fin);

 

// Set delimiters to space and comma.

src.useDelimiter(", *");

 

// Read and sum numbers.

while(src.hasNext()) {

if(src.hasNextDouble()) {

   sum += src.nextDouble();

   count++;

}

else {

   String str = src.next(); 

   if(str.equals("done")) break;

   else {

     System.out.println("File format error.");

     return;

   }

}

}

 

src.close();

System.out.println("Average is " + sum / count);

}

}

Байтовые



Символьные


Гаврилов А.В., Клименков С.В., Харитонова А.Е., Цопа Е.А.

Программирование на языке Java. Конспект лекций – СПб: Университет ИТМО, 2015. – 126 с.

 


 

http://wikijava.it-cache.net/index.php@title=Glava_16_Thinking_in_Java_4th_edition.html



Типичное использование потоков ввода/вывода

Хотя из классов библиотеки ввода/вывода, реализующих потоки, можно составить множество разнообразных конфигураций, обычно используется несколько наиболее употребимых. Следующие примеры можно рассматривать как простое руководство по созданию типичных сочетаний классов для организации ввода/вывода и координации их взаимодействия. В этих примерах используется упрощенная обработка исключений с передачей их на консоль, но такой способ подойдет только для небольших программ и утилит. В реальном коде следует использовать более совершенные средства обработки ошибок.

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