FileWriter vs FileOutputStream в Java

Я немного запутался в FileWriter и FileOutputStream. Как я вижу исходный код FileWriter, существует всего 4 конструктора, и каждый конструктор вызывает конструктор FileOutputStream.

public FileWriter(String fileName) throws IOException {
       super(new FileOutputStream(fileName));
}
public FileWriter(String fileName, boolean append) throws IOException {
        super(new FileOutputStream(fileName, append));
}
public FileWriter(File file) throws IOException {
        super(new FileOutputStream(file));
}
public FileWriter(File file, boolean append) throws IOException {
        super(new FileOutputStream(file, append));
}
public FileWriter(FileDescriptor fd) {
        super(new FileOutputStream(fd));
}

После поиска разницы между ними я нашел упомянутый здесь.

FileOutputStream предназначен для записи потоков необработанных байтов, таких как данные изображения. Для записи потоков символов рассмотрите возможность использования FileWriter.

Как FileWriter может сделать разницу? Даже он по-прежнему вызывает конструктор FileOutputStream без каких-либо изменений.

Ответ 1

FileWriter является Writer. Это о написании текста - и, случается, он записывает его в файл. Это делается путем ссылки на FileOutputStream, который создается в конструкторе FileWriter и передается конструктору суперкласса.

FileOutputStream является OutputStream. Это о написании двоичных данных. Если вы хотите написать текст, вам нужно что-то, чтобы преобразовать этот текст в двоичные данные - и это именно то, что делает FileWriter. Лично я предпочитаю использовать FileOutputStream, завернутый в OutputStreamWriter мной, чтобы разрешить мне указывать кодировку символов (поскольку FileWriter всегда использует кодировку по умолчанию для платформы, досадно).

В принципе, подумайте о FileWriter, это простой способ дать вам возможность написать:

Writer writer = new FileWriter("test.txt");

вместо

Writer writer = new OutputStreamWriter(new FileOutputStream("test.txt"));

За исключением того, что я обычно рекомендую использовать перегруз конструктора OutputStreamWriter, который принимает Charset.

Ответ 2

A FileOutputStream напрямую записывает байты. A FileWriter инкапсулирует a FileOutputStream (создав его в конструкторе FileWriter, как в вашем вопросе), и предоставляет удобные методы для написания символов и строк.

Ответ 3

FileOutputStream предназначен для записи примитивных типов данных, например, int, а FileWriter для записи символьно-ориентированных данных.

FileOutputStream не содержит методов для работы со строками. Если вы хотите использовать FileOutputStream для записи строки в файл, вы должны сделать следующее:

FileOutputStream fos=new FileOutputStream();
String str="Hello";
byte b[]=str.getBytes();
fos.write(b);
fos.close();

В Filewriter нет преобразования между строкой и байтовым массивом. Вы можете просто использовать:

FileWriter fr=new FileWriter("C:\\");
fr.write("Hello");
fr.close();

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