Какой подкласс OutputStream записать в текстовый файл - PullRequest
4 голосов
/ 07 ноября 2011

Я пишу программу, которая будет выводить данные в файл .txt, который может быть прочитан человеком, использующим такую ​​программу, как NotePad. Возможно, не обязательно ASCII, но что-то, что пользователь может понять.

Какой из них я использую?

  • ByteArrayOutputStream
  • FileOutputStream
  • FilterOutputStream
  • ObjectOutputStream
  • OutputStream
  • PipedOutputStream

У меня есть это назначение, в котором меня просят использовать один из подклассов OutputStream, поэтому Writer не является опцией.

Обзор занятий

  • ByteArrayOutputStream Я не понимал этого, пока BalusC не дал более простое описание. Очевидно, он хранит вещи в массиве байтов, что делает его нечитаемым, поскольку они являются специально байтами.
  • FileOutputStream он делает вывод в байтах, поэтому он также не читается.
  • FilterOutputStream Я думаю, что это преобразует данные способами, которые я не понимаю. Не хорошо, когда вы просто хотите писать вещи так, как пишете их в программе.
  • ObjectOutputStream в соответствии с «Примитивные типы данных также могут быть записаны в поток с использованием соответствующих методов из DataOutput. Строки также могут быть записаны с использованием метода writeUTF». и пример при условии, что это может быть ответом, но опять же такое большое объяснение снова смущает меня.
  • OutputStream Не понимаю описания вообще.
  • PipedOutputStream Создает каналы двоичных данных. Что такое трубы? не ключ.

Ответы [ 3 ]

5 голосов
/ 07 ноября 2011
  • ByteArrayOutputStream предназначен для записи байтов в оперативную память byte[].
  • FileOutputStream предназначен для записи байтов в File.
  • FilterOutputStream - это общий суперкласс для более специфичных выходных потоков, которые заранее обрабатывают данные, такие как шифрование / дешифрование, вычисление контрольной суммы, кодирование символов, сжатие (сжатие) и так далее. Само по себе ничего особенного.
  • ObjectOutputStream для записи полноценных типов Java и объектов в сериализованной форме в поток байтов. Он в основном позволяет преобразовывать сложные объекты Java в необработанные байты и наоборот.
  • OutputStream - это просто общий абстрактный класс этих потоков. Вы не можете построить это в любом случае. Однако вы можете заявить против этого.
  • PipedOutputStream предназначен для возможности записи в другой InputStream в канале, чтобы другая сторона могла прочитать их из этого InputStream.

Вы хотите записать данные в виде File, поэтому FileOutputStream более чем достаточно.

OutputStream output = new FileOutputStream("/foo.txt");

try {
    output.write(text.getBytes());
} finally {
    output.close();
}

Обратите внимание, что String#getBytes() использует кодировку платформы по умолчанию для преобразования символов в байты. Если вы используете «специальные символы», которые не охватываются хотя бы ASCII, то вы всегда должны явно указывать кодировку, используя String#getBytes(charset). E.g.:

    output.write(text.getBytes("UTF-8"));

Не связанный с конкретным вопросом, обычная практика , однако, заключается в использовании Writer для записи символьных данных.

Если вас не интересует кодировка символов, используйте FileWriter:

Writer writer = new FileWriter("/foo.txt");

try {
    writer.write(text);
} finally {
    writer.close();
}

Он будет использовать кодировку по умолчанию для платформы, которая обычно также поддерживает символы ASCII.

Если вам нужна кодировка символов, используйте OutputStreamWriter:

Writer writer = new OutputStreamWriter(new FileOutputStream("/foo.txt"), "UTF-8");
// ...

Позволяет указать кодировку как 2-й аргумент, принимая OutputStream.

Смотри также:

1 голос
/ 07 ноября 2011

Использовать PrintStream . Это подкласс OutputStream и позволяет построчно выводить данные. Это тот же класс, который используется в System.out

new PrintStream(new File("path/to/your/file.txt")).println("Your output");
0 голосов
/ 07 ноября 2011

Что-то не так с FileOutputStream?

...