Java中的FileWriter和FileOutputStream有什么区别?

19
我对FileWriter和FileOutputStream有些困惑。根据我看到的FileWriter源代码,它只有4个构造函数,每个构造函数都调用了FileOutputStream的构造函数。请参考FileWriter的源代码
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 的构造函数而没有进行任何更改。


区别在于write()方法。 - Tunaki
@Tunaki,请问FileWriter中的read方法在哪里?我之前提到的那个引用是说关于写入流而不是读取。你能解释一下吗? - user6117584
我是说写入方法,搞混了... - Tunaki
4个回答

25

FileWriter 是一个 Writer,它用于写入文本-特别是将文本写入文件。 FileWriter 在构造函数中创建一个 FileOutputStream 对象,并将其传递给超类的构造函数来实现这一目的。

FileOutputStream 是一个OutputStream,它用于写入二进制数据。如果您想要向其中写入文本,则需要一些方法将文本转换为二进制数据,这正是FileWriter所做的。就我个人而言,我更喜欢使用 FileOutputStream 并由我自己将其包装在 OutputStreamWriter 中,以允许我指定字符编码(因为 FileWriter 始终使用平台默认编码,这非常令人恼火)。

基本上,您可以将 FileWriter 看作是一种简单的方法,让您进行文本写作:

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

代替

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

除非特别情况,我通常建议使用接受Charset参数的OutputStreamWriter构造函数的重载。


但是我很困惑,只有4个构造函数,它们有什么区别?每个构造函数都调用了FileOutputStream的构造函数。 - user6117584
@LetDoit:不,这里并没有“仅有四个构造函数”——还有很多其他方法,都是从OutputStreamWriter继承而来的。是的,每个构造函数都会调用一个FileOutputStream构造函数,因为每个FileWriter都引用了一个FileOutputStream。但这并不意味着FileWriterFileOutputStream是同一种东西。 - Jon Skeet
JVM有什么区别吗?因为我还期望看到编码方面的差异。 - user6117584
@LetDoit:不,它们的区别在于它们是完全不同的类FileWriter构造函数会创建一个FileOutputStream并将其传递给超类构造函数(OutputStreamWriter),但之后,您可以像使用任何其他Writer一样使用FileWriter来编写文本 - 然后OutputStreamWriter将该文本转换为二进制数据以传递给它包装的OutputStream - Jon Skeet
1
@LetDoit:再次强调,这只是为了方便。因为我回答中的第一段代码比第二段短。 - Jon Skeet
显示剩余11条评论

5

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

如有必要,请不要忘记抛出任何异常。


2

FileOutputStream直接写入字节。 FileWriter封装了一个FileOutputStream(在构造函数中创建),并提供了方便的方法来写入字符和字符串。


0
其实,问题是什么时候使用Reader/Writer和什么时候使用Stream?
如何决定使用哪个:
1.If you are dealing with binary data (e.g. an image) use Streams.
2.If you are using non-ASCII Unicode characters, use Readers/Writers.
3.If you are using ordinary ASCII text you can (usually) use either.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接