gpt4 book ai didi

Java Scanner(File) 行为异常,但 Scanner(FIleInputStream) 始终处理同一个文件

转载 作者:搜寻专家 更新时间:2023-10-30 19:44:09 26 4
gpt4 key购买 nike

我在使用 Scanner 时出现奇怪的行为。当我使用 Scanner(FileInputStream) 构造函数时,它将与我正在使用的一组特定文件一起使用,但它不适用于 Scanner(File) 构造函数。

案例 1:扫描器(文件)

Scanner s = new Scanner(new File("file"));
while(s.hasNextLine()) {
System.out.println(s.nextLine());
}

结果:无输出

案例 2:扫描器(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 或通过文件),如果文件包含(独立于文件大小)例如 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

关于Java Scanner(File) 行为异常,但 Scanner(FIleInputStream) 始终处理同一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9492520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com