Java Scanner(File)行为异常,但是Scanner(FIleInputStream)始终与同一个文件一起使用

Java Scanner(File)行为异常,但是Scanner(FIleInputStream)始终与同一个文件一起使用,第1张

Java Scanner(File)行为异常,但是Scanner(FIleInputStream)始终与同一个文件一起使用

hasNextLine()调用findWithinHorizo​​n(),后者依次调用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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5489048.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存