Читайте также: |
|
Прочитать символы из System.in можно с помощью метода read(), определенного в классе BufferedReader. Процедура чтения практически аналогична чтению с использованием байтовых потоков. Три варианта метода read(), предусмотренные в классе BufferedReader, приведены ниже.
Метод | Описание |
read() throws IOException | Читает один символ Unicode. Достигнув конца потока, данный метод возвращает значение-1 |
read(char data[]) throws IOException | Читает данные из входного потока и помещает их в массив. Чтение оканчивается либо по достижении конца потока, либо при заполнении массива, либо при возникновении ошибки. Данный метод возвращает число прочитанных символов, либо, если был достигнут конец потока, значение -1 |
read(char data[], int start, int max) throws IOException | помещает прочитанные данные в массив data, начиная с элемента, определяемого индексом start. Максимальное число байтов, которые могут быть записаны в массив, определяется параметром max. Данный метод возвращает число прочитанных байтов, либо -1, если был достигнут конец потока |
При возникновении ошибки каждый из перечисленных выше вариантов метода генерирует исключение IOException. При чтении данных из System.in конец потока формируется по нажатию клавиши <Enter>.
Ниже представлен код программы, демонстрирующей использование метода read() для чтения символов с консоли. Символы читаются до тех пор, пока пользователь не введет точку. Заметьте, что исключения, которые могут быть сгенерированы при работе данной программы, обрабатываются за пределами метода main(). Как было сказано выше, подобный подход типичен при чтении данных с консоли. При желании вы можете использовать другой механизм обработки ошибок.
// Использованиекласса BufferedReader
// длячтениясимволов с консоли
import java.io.*;
class ReadChars
{
public static void main(String args[]) throws IOException
{
char c;
// Созданиеобъекта BufferedReader,
// связанного c System.in.
BufferedReader br = new BufferedReader(new InputStreamReader(System. in));
System. out. println("Enter characters, period to quit.");
// Чтениесимволов
Do
{
c = (char) br.read();
System. out. println(c);
} while (c!= '.');
}
}
Чтение строк
Для того чтобы прочитать строку символов, набранную на клавиатуре, надо использовать метод readLine() класса BufferedReader. Заголовок этого метода приведен ниже.
String readLine() throws IOException
Он возвращает объект String, содержащий прочитанные символы. При попытке прочитать строку после окончания потока метод возвращает значение null.
Ниже приведен код программы, демонстрирующей использование класса BufferedReader и метода readLine(). Программа читает и отображает строки текста до тех пор, пока не будет введено слово stop.
// Чтениестрок с консоли с помощьюкласса BufferedReader
import java.io.*;
class ReadLines
{
public static void main(String args[]) throws IOException
{
// Созданиеобъекта BufferedReader, связанного с System.in
BufferedReader br = new BufferedReader(new InputStreamReader(System. in));
String str;
System. out. println("Enter lines of text.");
System. out. println("Enter 'stop' to quit.");
Do
{
// Использованиеметода readLine() класса BufferedReader
// длячтениястрокитекста
str = br.readLine();
System. out. println(str);
} while (!str.equals("stop"));
}
}
Консольный вывод посредством символьных потоков
Несмотря на то, что объект System.out вполне может использоваться для вывода на консоль, такой подход скорее пригоден для целей отладки или при создании очень простых программ, подобных тем, которые приводятся в качестве примеров. Для реальных приложений вывод на консоль обычно осуществляется посредством потока PrintWriter. PrintWriter — один из классов, представляющих символьные потоки. Как уже говорилось ранее, использование символьных потоков упрощает интернационализацию приложений.
В классе PrintWriter определено несколько конструкторов. Мы будем использовать следующий:
PrintWriter(OutputStream outputStream, boolean flushOnNewline)
где первый параметр — это объект типа OutputStream. Второй параметр указывает, должна ли производиться запись информации, находящейся в буфере, при каждом вызове метода println(). Для того чтобы информация из буфера выводилась автоматически, это значение должно быть равно true.
В классе PrintWriter поддерживаются методы print() и println() для всех типов включая Object. Таким образом, методы print() и println() можно использовать так же, как и одноименные методы, принадлежащие System.out. Если параметр не относится к простому типу, то данные методы вызывают метод toString() объекта, а затем выводят результат.
Для того чтобы вывести информацию на консоль с помощью PrintWriter, надо указать в качестве выходного потока System.out и обеспечить вывод буфера после каждого вызова println(). Например, при выполнении следующей строки кода создается объект PrintWriter, связанный с консолью:
PrintWriter pw = new PrintWriter(System.out, true);
Ниже приведен код приложения, иллюстрирующего использование класса PrintWriter, для поддержки вывода на консоль.
// Использованиекласса PrintWriter
import java.io.*;
public class PrintWriterDemo
{
public static void main(String args[])
{
// Созданиеобъекта PrintWriter, связанного с System.out.
PrintWriter pw = new PrintWriter(System. out, true);
int i = 10;
double d = 123.65;
pw.println("Using a PrintWriter.");
pw.println(i);
pw.println(d);
pw.println(i + " + " + d + " is " + (i+d));
}
}
Несмотря на удобство символьных потоков, помните, что при изучении Java или при отладке программ вполне можно использовать поток System.out. Однако, если в программе применяется PrintWriter, ее проще интернационализировать. Поскольку для простых программ, приведенных в данной книге, PrintWriter не имеет существенных преимуществ перед System.out, мы будем и далее использовать System. out для вывода на консоль.
Вопросы для текущего контроля
1. Какие классы находятся наверху иерархии символьных потоков?
2. Какой тип потока надо открыть для чтения с консоли?
3. Какой тип потока надо открыть для записи на консоль?
Обмен данными с файлом с помощью символьных потоков
Несмотря на то что на практике приходится в основном работать с байтово-ориентированными файлами, для обмена с ними можно использовать символьные потоки. Преимущество символьных потоков состоит в том, что они оперируют непосредственно с символами Unicode. Таким образом, если вы хотите записать Unicode-текст, вам лучше всего воспользоваться символьными потоками. Как правило, для ввода-вывода символов используют классы FileReader и FileWriter.
Использование класса FileWriter
Класс FileWriter представляет поток, посредством которого можно осуществлять запись в файл. Ниже приведены два наиболее часто используемых конструктора данного класса.
fileWriter(String fileName) throws IOException
fileWriter(String fileName, boolean append) throws IOException
В качестве параметра задается имя файла и, при необходимости, путь к нему. Если значение второго параметра равно true, данные записываются в конец файла. В противном случае информация в файле разрушается. Каждый из указанных конструкторов генерирует в случае ошибки исключение IOException. Класс FileWriter является подклассом OutputStreamWriter и Writer. Следовательно, он предоставляет доступ к методам, объявленным в суперклассах.
Ниже приведен текст простой программы, которая читает строки текста, введенные с клавиатуры, и записывает их в файл test. txt.Текст читается до тех пор, пока пользователь не введет слово stop. Для вывода в файл используется класс FileWriter.
/*
* Простаяутилитадлязаписинадискданных,
* введенных с клавиатуры. Даннаяпрограммадемонстрирует
* использованиекласса FileWriter
* */
import java.io.*;
class KtoD
{
public static void main(String args[])
{
String str;
FileWriter fw;
BufferedReader br = new BufferedReader(new InputStreamReader(System. in));
Try
{
fw = new FileWriter("test.txt");
}
catch (IOException exc)
{
System. out. println("Cannot open file.");
return;
}
System. out. println("Enter text ('stop' to quit).");
Try
{
Do
{
System. out. print(": ");
str = br.readLine();
if (str.compareTo("stop") == 0) break;
str = str + "\r\n"; // Добавлениестроки
fw.write(str);
} while (str.compareTo("stop")!= 0);
}
catch (IOException exc)
{
System. out. println("Error writing to file.");
}
Try
{
fw.close();
}
catch (IOException exc)
{
System. out. println("Error closing file.");
}
}
}
Использование класса FileReader
Класс FileReader создает объект Reader, который можно использовать для чтения содержимого файла. Наиболее часто используется приведенный ниже вариант конструктора данного класса.
FileReader(String fileName) throws FileNotFoundException
В качестве параметра задается имя файла и, при необходимости, путь к нему. Если указанный файл не существует, генерируется исключение FileNotFoundException. Класс FileReade является подклассом InputStreamReader и Reader. Следовательно, он предоставляет доступ к методам, объявленным в суперклассах.
Приведенная ниже программа представляет собой простую утилиту, предназначенную для отображения на экране содержимого файла test.txt. Она является своеобразным дополнением к утилите, которую мы рассматривали в предыдущем разделе.
/*
* Простаяутилитадляотображенияданных,
* записанныхнадиске. Даннаяпрограммадемонстрирует
* использованиекласса FileReader
* */
import java.io.*;
class DtoS
{
public static void main(String args[])
{
String s;
FileReader fr;
BufferedReader br;
Try
{
// Чтениестрокизфайла и отображениеихнаэкране
fr = new FileReader("test.txt");
br = new BufferedReader(fr);
}
catch (FileNotFoundException exc)
{
System. out. println("Cannot open input file.");
return;
}
Try
{
while ((s = br.readLine())!= null)
{
System. out. println(s);
}
}
catch (IOException exc)
{
System. out. println("Error reading file.");
}
Try
{
fr.close();
}
catch (IOException exc)
{
System. out. println("Error closing file.");
}
}
}
Обратите внимание на то, что для потока FileReader создана оболочка, роль которой выполняет класс BufferedReader. Благодаря этому появляется возможность обращаться к методу readLine().
Вопросы для текущего контроля
1. Какой класс используется для чтения символов из файла?
2. Какой класс используется для записи символов в файл?
Дата добавления: 2015-07-10; просмотров: 396 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Void seek(long newPos) throws IOException | | | Использование оболочек для преобразования строк, представляющих числа |