2016-03-27 5 views
7

Я немного смущен насчет FileWriter и FileOutputStream. Как я вижу, source code of FileWriter существует всего 4 конструктора, и каждый конструктор вызывает конструктор FileOutputStream.FileWriter vs FileOutputStream в Java

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)); 
} 

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

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

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

+0

Разница заключается в методе 'write()'. – Tunaki

+0

@Tunaki, где находится метод чтения в FileWriter? и Цитата, о которой я говорил, говорит о том, что записи потоков не читаются. Вы можете объяснить, пожалуйста? –

+0

Erf Я имел в виду метод записи, был сбит с толку ... – Tunaki

ответ

11

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.

+0

Но я смущен, что есть только 4 конструктора, где разница? и каждый конструктор вызывает конструктор FileOutputStream. –

+0

@LetDoit: Нет, не существует «всего четыре конструктора» - есть и множество других методов, унаследованных от 'OutputStreamWriter'. Да, каждый конструктор вызывает конструктор 'FileOutputStream', потому что каждый' FileWriter' имеет ссылку на 'FileOutputStream'. Но это не означает, что «FileWriter» и «FileOutputStream» - одно и то же. –

+0

- разница в JVM? Потому что я тоже ожидал разницы в кодировании. –

1

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

Смежные вопросы