Looking for java Keywords? Try Ask4Keywords

Java Language Stream vs Writer / Reader API


пример

Потоки обеспечивают самый прямой доступ к двоичному содержимому, поэтому любые реализации InputStream / OutputStream всегда работают с int s и byte s.

// Read a single byte from the stream
int b = inputStream.read();
if (b >= 0) { // A negative value represents the end of the stream, normal values are in the range 0 - 255
    // Write the byte to another stream
    outputStream.write(b);
}

// Read a chunk
byte[] data = new byte[1024];
int nBytesRead = inputStream.read(data);
if (nBytesRead >= 0) { // A negative value represents end of stream
    // Write the chunk to another stream
    outputStream.write(data, 0, nBytesRead);
}

Есть некоторые исключения, возможно, в первую очередь PrintStream который добавляет «способность печатать представления различных значений данных удобно». Это позволяет использовать System.out как двоичный InputStream и как текстовый вывод с использованием таких методов, как System.out.println() .

Кроме того, некоторые потоковые реализации работают как интерфейс для содержимого более высокого уровня, таких как объекты Java (см. Сериализация) или собственные типы, например DataOutputStream / DataInputStream .

С классами Writer и Reader Java также предоставляет API для явных потоков символов. Хотя большинство приложений будут основывать эти реализации на потоках, API потока символов не предоставляет никаких методов для двоичного содержимого.

// This example uses the platform's default charset, see below
// for a better implementation.

Writer writer = new OutputStreamWriter(System.out);
writer.write("Hello world!");

Reader reader = new InputStreamReader(System.in);
char singleCharacter = reader.read();

Всякий раз, когда необходимо кодировать символы в двоичные данные (например, при использовании классов InputStreamWriter / OutputStreamWriter ), вы должны указать кодировку, если вы не хотите зависеть от кодировки платформы по умолчанию. Если есть сомнения, используйте кодировку, совместимую с Unicode, например UTF-8, которая поддерживается на всех платформах Java. Поэтому вам следует избегать таких классов, как FileWriter и FileReader поскольку они всегда используют кодировку платформы по умолчанию. Лучший способ доступа к файлам с использованием потоков символов - это:

Charset myCharset = StandardCharsets.UTF_8;

Writer writer = new OutputStreamWriter( new FileOutputStream("test.txt"), myCharset );
writer.write('Ä');
writer.flush();
writer.close();

Reader reader = new InputStreamReader( new FileInputStream("test.txt"), myCharset );
char someUnicodeCharacter = reader.read();
reader.close();

Одним из наиболее часто используемых Reader является BufferedReader который предоставляет метод для считывания целых строк текста из другого считывателя и, по-видимому, является самым простым способом прочтения потока символов по строкам:

// Read from baseReader, one line at a time
BufferedReader reader = new BufferedReader( baseReader );
String line;
while((line = reader.readLine()) != null) {
  // Remember: System.out is a stream, not a writer!
  System.out.println(line);
}