我观察到,Scanner
用于文件阅读时,可以使用两个参数:File
和FileInputStream
。
Scanner scan = new Scanner(new File("myfile.txt"));
和
Scanner scan = new Scanner(new FileInputStream("myfile.txt"));
但是,我不知道这两个定义之间的区别。 是否有任何与性能相关的差异? 哪一个更喜欢?
任何人请解释。感谢。
答案 0 :(得分:5)
来自Scanner(File file)
源代码:
public Scanner(File source)
throws FileNotFoundException
{
this((ReadableByteChannel)(new FileInputStream(source).getChannel()));
}
框架将基于FileInputStream
实例创建File
。
在跟踪每个路径的源之后,它将调用此构造函数:
private Scanner(Readable source, Pattern pattern) {
if (source == null)
throw new NullPointerException("source");
if (pattern == null)
throw new NullPointerException("pattern");
this.source = source;
delimPattern = pattern;
buf = CharBuffer.allocate(BUFFER_SIZE);
buf.limit(0);
matcher = delimPattern.matcher(buf);
matcher.useTransparentBounds(true);
matcher.useAnchoringBounds(false);
useLocale(Locale.getDefault());
}
在性能方面,您不应该意识到这一点,因为JIT会在执行时为您提高性能。只有当您通过使用分析器发现线路成为瓶颈时,性能才应该起作用。
答案 1 :(得分:1)
实际上这不完全正确,Scanner
可以获得File
并且可以获得InputStream
Scanner
不仅适用于文件。
此外,FileInputStream
扩展了InputStream
,因此它也可以作为一个简单的InputStream
传递给扫描程序。
实际上接收File
的构造函数将其转换为FileInputStream
所以基本上它只是为了更快的编码
底线:没有性能差异