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();
Не забудьте выбросить любые исключения, если это необходимо.