Пример использования стандартных потоков ввода и вывода
Стандартный поток вывода сообщений об ошибках
Стандартный поток вывода
Стандартный поток ввода
Стандартный поток ввода System.in определен как статический объект класса InputStream, который содержит только простейшие методы для ввода данных. Самые необходимые методы:
public int read();
public int read(byte b[]);
Первый метод читает следующий вводимый с клавиатуры символ, при достижении символа конца ввода метод возвращает -1.
Второй метод читает данные из потока в массив, ссылка на который передается через единственный параметр. Количество считанных данных определяется размером массива, т.е. значением b.length. Метод возвращает количество считанных байт данных или-1, если достигнут конец потока.
При возникновении ошибок при работе со стандартным потоком ввода создается исключение IOException, обработку которого необходимо предусмотреть.
Замечание. На машинах, работающих с Unix и Dos/Windows, символы конца ввода формируются разными способами. В Unix должны быть использованы символы Ctrl+D (^D), а в среде Dos/Windows используются Ctrl+Z (^Z).
Стандартный поток вывода System.out создан на базе класса PrintStream, предназначенного для форматированного вывода данных различного типа с целью их визуального отображения в виде текстовой строки.
Для работы со стандартным потоком вывода чаще всего используются методы print() и println(), хотя метод write() также доступен.
В классе PrintStream определено несколько реализаций метода print() с параметрами различных типов:
public void print(boolean b);
public void print(char c);
public void print(char s[]);
public void print(double d);
public void print(float f);
public void print(int i);
public void print(long l);
public void print(Object obj);
public void print(String s);
При помощи этих методов можно записать в стандартный поток вывода текстовое представление данных различного типа.
Для каждого метода print() существует подобный ему метод println(), который отличается от соответствующего метода print() тем, что добавляет к записываемой в поток строке символ перехода на следующую строку. Кроме того, существует метод println() без параметров, он записывает в поток только символ перехода на следующую строку.
Стандартный поток вывода сообщений об ошибках System.err так же как и поток out, создан на базе класса PrintStream. Поэтому для вывода сообщений об ошибках также можно использовать вышеописанные методы print() и println().
Рассмотрим приложение TestInOut (пример 2), в котором пользователю предлагается ввести строку, состоящую из чисел, разделенных пробелами. После ввода строка сначала печатается по отдельным словам, а затем по числам, входящим в нее.
/*------------- Пример 2. Файл TestInOut.java -------------*/
class TestInOut
{ public static void main(String ARGV[]) throws java.io.IOException
{ StringBuffer buffer=new StringBuffer();
int c;
System.out.print("Для прекращения ввода используется символ:");
System.out.println("в Windows - Ctrl+Z, в Unix - Ctrl+D");
System.out.println(
"Введите несколько слов (чисел), разделенных пробелом:");
// -------------посимвольный ввод до символа конца ввода
while((c=System.in.read())!=-1)
{ buffer.append((char)c); // добавить символ в буфер
}
// -------------вывод по словам (токенам)
System.out.println("\n\nВведенные слова:");
String string=new String(buffer); // создать по буферу строку
java.util.StringTokenizer tok=new java.util.StringTokenizer(string);
while(tok.hasMoreTokens()) // пока есть токены
{ // получить токен и напечатать
String word=tok.nextToken(); System.out.print(word+" ");
}
// -------------вывод по числам
System.out.println("Введенные числа:");
tok=new java.util.StringTokenizer(string);
while(tok.hasMoreTokens()) // пока есть токены
{ // преобразовать токен в целочисленный упаковщик
Integer I=Integer.valueOf(tok.nextToken());
// получить из упаковщика целое число и напечатать
System.out.print(" "+ I.intValue());
}
}
}
2.3 Потоки, связанные с локальными файлами
Рассмотрим процесс создания и использования потоков, связанных с локальными файлами, а также вопрос закрытия потоков после использования и принудительный сброс буферов.
2.3.1 Создание потоков, связанных с локальными файлами
Для создания входного или выходного потока, связанного с локальным файлом следует воспользоваться классами из библиотеки Java, созданными на базе классов InputStream и OutputStream. Однако необходимо всегда помнить о некоторых особенностях методики использования рассматриваемых ранее потоков.
Особенность этой методики заключается в том, для создания потоков, связанных с файлами, необходимо воспользоваться сразу несколькими классами, а не одним, на первый взгляд казалось бы, наиболее подходящим.
Рассмотрим пример. Пусть необходимо создать выходной поток для записи форматированных данных (например, текстовых строк). За форматированный вывод отвечает поток класса DataOutputStream. Однако, сразу создать объект класса DataOutputStream, связанный с файлом нельзя, так как в классе DataOutputStream предусмотрен только один конструктор, которому в качестве параметра необходимо передать ссылку на объект класса OutputStream:
public DataOutputStream(OutputStream out);
Что же касается конструктора класса OutputStream, то он выглядит следующим образом:
public OutputStream();
Так как ни в одном, ни в другом конструкторе не предусмотрено никаких ссылок на файлы, то пока совершенно непонятно, как с использованием одних только классов DataOutputStream и OutputStream можно создать выходной поток, связанный с локальным файлом.
Создание потока форматированных данных, связанного с локальным файлом.
Создание потоков, связанных с файлами и предназначенных для форматированного ввода и вывода, необходимо выполнять в несколько приемов. При этом вначале необходимо создать потоки на базе класса FileOutputStream или FileInputStream, а затем передать ссылкуна созданный поток конструктору класса DataOutputStream или DataInputStream.
В классах FileOutputStream и FileInputStream предксмотрены конструкторы, которым в качестве параметроа передается либо ссылка на объект класса File, либо ссылка на объект класса FileDescriptor, либо текстовая строка пути к файлу, например:
public FileOutputStream(File fileObj);
public FileOutputStream(FileDescriptor fdObj);
public FileOutputStream(String name);
Таким образом, если нужен выходной поток для записи в файл форматированных данных, то это делается в два этапа:
· сначала необходимо создать поток как объект класса FileOutputStream;
· затем ссылку на этот поток следует передать конструктору класса DataOutputStream.
Полученный таким способом объект dataOut класса DataOutputStream
DataOutputStream dataOut;
dataOut=new DataOutputStream(new FileOutputStream("output.txt"));
можно использовать как выходной поток, связанный с файлом output.txt, записывая в него форматированные данные:
Для создания входного потока форматированных данных из файла следует пользоваться классами FileInputStream и DataInputStream, действуя по аналогичной методике.