hasNextLine()调用findWithinHorizon(),后者依次调用findPatternInBuffer(),在匹配项中搜索定义为
.*(rn|[nru2028u2029u0085])|.+$
奇怪的是,通过两种方式(使用FileInputStream或通过File)构造扫描器,如果文件包含(独立于文件大小)文件(例如0x0A行终止符),则findPatternInBuffer返回正匹配;但是如果文件包含的字符超出了ASCII码(即>
= 7f),则使用FileInputStream返回true,而使用File返回false。
非常简单的测试用例:
创建一个仅包含字符“ a”的文件
# hexedit file 00000000 61 0A a.# java Test.javausing File: trueusing FileInputStream: true
现在使用hexedit将文件编辑为:
# hexedit file00000000 61 0A 80 a..# java Test.javausing File: falseusing 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: trueusing FileInputStream: true
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)