我的扫描仪行为异常。使用Scanner(FileInputStream)
构造函数时,它将与我正在使用的一组特定文件一起使用,但不适用于Scanner(File)
构造函数。
Scanner(File)
Scanner s = new Scanner(new File("file"));
while(s.hasNextLine()) {
System.out.println(s.nextLine());
}
结果:无输出
Scanner(FileInputStream)
Scanner s = new Scanner(new FileInputStream(new File("file")));
while(s.hasNextLine()) {
System.out.println(s.nextLine());
}
结果:文件内容输出到控制台。
输入文件是一个包含单个类的Java文件。
我以编程方式(在Java中)仔细检查了以下内容:
通常Scanner(File)
在这种情况下对我有用,我不确定为什么现在不行。
hasNextLine()调用findWithinHorizon(),后者依次调用findPatternInBuffer(),在匹配项中搜索定义为.*(\r\n|[\n\r\u2028\u2029\u0085])|.+$
奇怪的是,通过两种方式(使用FileInputStream或通过File)构造扫描器,如果文件包含(独立于文件大小)文件(例如0x0A行终止符),则findPatternInBuffer返回正匹配。但是如果文件包含的字符超出了ASCII码(即> = 7f),则使用FileInputStream返回true,而使用File返回false。
非常简单的测试用例:
创建一个仅包含字符“ a”的文件
# hexedit file
00000000 61 0A a.
# java Test.java
using File: true
using FileInputStream: true
现在使用hexedit将文件编辑为:
# hexedit file
00000000 61 0A 80 a..
# java Test.java
using File: false
using FileInputStream: true
在测试Java代码中,除了问题中已经存在的内容外,没有什么其他:
import java.io.*;
import java.lang.*;
import java.util.*;
public class Test {
public static void main(String[] args) {
try {
File file1 = new File("file");
Scanner s1 = new Scanner(file1);
System.out.println("using File: "+s1.hasNextLine());
File file2 = new File("file");
Scanner s2 = new Scanner(new FileInputStream(file2));
System.out.println("using FileInputStream: "+s2.hasNextLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}
所以,事实证明这是一个字符集问题。实际上,将测试更改为:
Scanner s1 = new Scanner(file1, "latin1");
我们得到:
# java Test
using File: true
using FileInputStream: true
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句