6

和有什么区别

FileInputStream fstream = new FileInputStream ("file1.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));

FileInputStream fstream = new FileInputStream ("file1.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));

我们真的需要一个 DataInputStream 吗?

4

5 回答 5

4

使用 DataInputStream 是一个常见的错误,我认为它来自不同代码段的复制和粘贴。您希望将文件作为文本读取,例如 BufferedReader 或二进制文件,例如 DataInputStream。您极不可能同时使用两者并尝试使用可能会导致混乱。

对于缓冲的文本

BufferedReader br = new BufferedReader(new FileReader(file));

对于缓冲的二进制文件

DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
于 2012-07-17T06:47:01.753 回答
2

FileInputStream 用于读取原始字节流,例如图像数据。要读取字符流,请考虑使用 FileReader。

数据输入流允许应用程序以与机器无关的方式从底层输入流中读取原始 Java 数据类型。应用程序使用数据输出流写入数据,这些数据稍后可以由数据输入流读取。

DataInputStream 对于多线程访问不一定是安全的。

FileInputStream 只给你一个非常基本的接口。当您想读取数字、字符串(甚至复杂对象)而不仅仅是字节时,这很痛苦。因此,您使用第二个输入流“包装”第一个,这为您提供了一个更有用的界面。DataInputStream 就是其中之一。

于 2012-07-17T05:55:38.853 回答
2

传递给InputStreamReader()构造函数的对象的重要之处在于,它将是承担任何同步持有权重的对象。如果您不希望您FileInputStream可能被许多电话打断,那么第二种选择就是要走的路。见的来源Reader

于 2012-07-17T05:55:57.083 回答
1

这取决于,数据输入流允许应用程序以与机器无关的方式从底层输入流中读取原始 Java 数据类型。应用程序使用数据输出流写入数据,这些数据稍后可以由数据输入流读取。检查JavaDoc

BufferedReader:从字符输入流中读取文本,缓冲字符,以提供字符、数组和行的有效读取。

FileInputStream:使用 FileInputStream,您将以字节为单位读取文件数据。

于 2012-07-17T05:53:13.683 回答
1

不,您的示例中不需要 DataInputStream ,因为您最终获得了 BufferedReader 来读取数据。

相反,有意义的是:

FileInputStream fstream = new FileInputStream ("file1.txt");
BufferedInputStream br = new BufferedInputStream(fstream);
DataInputStream dis = new DataInputStream(br);

通常,当您使用以下方法创建“file1.txt”时,这将齐头并进:

DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("file1.txt")));

编辑:

如果它没有真正意义,为什么Java允许它?因为这是装饰器模式,这是装饰器模式的缺点之一。

于 2012-07-17T06:01:44.993 回答