之间有什么区别
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吗?
答案 0 :(得分:4)
使用DataInputStream是一个常见的错误,我认为它来自不同代码段的复制和粘贴。您希望将文件作为文本读取,例如BufferedReader或二进制文件,例如DataInputStream类。你极不可能想要同时使用这两种方法并试图引起混淆。
对于缓冲的文本
BufferedReader br = new BufferedReader(new FileReader(file));
对于缓冲的二进制文件
DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
答案 1 :(得分:2)
FileInputStream用于读取原始字节流,例如 图像数据。要读取字符流,请考虑使用 的FileReader。
数据输入流允许应用程序读取原始Java数据类型 来自与机器无关的基础输入流。一个 应用程序使用数据输出流来写入以后可以使用的数据 由数据输入流读取。
DataInputStream对于多线程访问不一定安全。
FileInputStream只为您提供了一个非常基本的界面。 当你想要读取数字,字符串(甚至是复杂的对象)而不仅仅是字节时,这是一种痛苦。所以你使用第二个输入流" wrap"第一个,它为您提供了更有用的界面。 DataInputStream就是其中之一。
答案 2 :(得分:2)
传递给InputStreamReader()
构造函数的对象的重要之处在于它将成为承载任何同步保持的权重的对象。如果您不希望您的FileInputStream
可能被多次调用阻止,那么第二个选项就是可行的方法。见the source of Reader
.
答案 3 :(得分:1)
取决于,数据输入流允许应用程序以与机器无关的方式从基础输入流中读取原始Java数据类型。应用程序使用数据输出流来写入稍后可由数据输入流读取的数据。查看JavaDoc
BufferedReader:从字符输入流中读取文本,缓冲字符,以便有效地读取字符,数组和行。
FileInputStream:使用FileInputStream,您将以字节为单位读取文件数据。
答案 4 :(得分: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允许它,如果它没有真正意义?因为这是Decorator pattern,这是Decorator模式的缺点之一。