有人可以向我解释为什么我可以将FileInputStream或FileReader用于BufferedReader?有什么区别?与此同时,扫描仪优于BufferedReader的优势是什么。我正在阅读它有助于标记化,但这意味着什么?
答案 0 :(得分:12)
try {
//Simple reading of bytes
FileInputStream fileInputStream = new FileInputStream("path to file");
byte[] arr = new byte[1024];
int actualBytesRead = fileInputStream.read(arr, 0, arr.length);
//Can read characters and lines now
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
String lineRead = bufferedReader.readLine();
char [] charArrr = new char[1024];
int actulCharsRead = bufferedReader.read(charArrr, 0, charArrr.length);
//File reader allows reading of characters from a file
FileReader fileReader = new FileReader("path to file");
actulCharsRead = fileReader.read(charArrr, 0, charArrr.length);
//It is a good idea to wrap a bufferedReader around a fileReader
BufferedReader betterFileReader = new BufferedReader(new FileReader(""));
lineRead = betterFileReader.readLine();
actulCharsRead = betterFileReader.read(charArrr, 0, charArrr.length);
//allows reading int, long, short, byte, line etc. Scanner tends to be very slow
Scanner scanner = new Scanner("path to file");
//can also give inputStream as source
scanner = new Scanner(System.in);
long valueRead = scanner.nextLong();
//might wanna check out javadoc for more info
} catch (IOException e) {
e.printStackTrace();
}
答案 1 :(得分:3)
德克斯特的答案已经有用了,但是一些额外的解释可能仍然有用:
在genereal中: InputStream仅提供对源的字节数据的访问。 Reader可以包裹在流中并添加适当的文本编码,因此您现在可以读取字符。 BufferedReader可以围绕Reader进行缓冲操作,因此每次调用不是一个字节,而是一次读取一堆,从而减少系统调用并在大多数情况下提高性能。
对于文件:
FileInputStream是从文件中读取数据的最基本方法。 如果您不想自己处理文本编码,可以将其包装到InputStreamReader中,该InputStreamReader可以包装到BufferedReader中。 或者,您可以使用FilerReader,它应该与FileInputStream + InputStreamReader基本相同。
现在,如果您不想只读取任意文本,但只读取特定数据类型(int,long,double,...)或正则表达式,则Scanner非常有用。但如上所述,它将为构建这些表达式增加一些开销,因此只在需要时使用它。
答案 2 :(得分:0)
在Java 8中引入Files.lines
。这支持足够简单的文件操作来减轻至少一些Perl嫉妒: - )
File.lines(Path.path("input.txt"))
.filter(line -> line.startsWith("ERROR:"))
.map(String::toUpperCase).forEach(System.out::println);