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

柏子

我的扫描仪行为异常。使用Scanner(FileInputStream)构造函数时,它将与我正在使用的一组特定文件一起使用,但不适用于Scanner(File)构造函数。

情况1: Scanner(File)

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

结果:无输出

情况2: Scanner(FileInputStream)

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

结果:文件内容输出到控制台。

输入文件是一个包含单个类的Java文件。

我以编程方式(在Java中)仔细检查了以下内容:

  • 该文件存在,
  • 可读性强
  • 并且具有非零的文件大小。

通常Scanner(File)在这种情况下对我有用,我不确定为什么现在不行。

圭多:

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java:FileOutputStream和FileInputStream一起在同一个文件上

Java Scanner 一遍又一遍地读取同一个文件

在JAVA中与FileDescriptor的入和出静态成员一起使用时,FileInputStream和FileOutputStream类的异常行为

如何使用 GSON 从同一个 JSON 文件中获取多个 Java 对象?

如何在Java中与Scanner.useDelimiter一起使用定界符?

将Scanner与Double一起使用时出现Java错误

为什么全局变量不会随同一个全局变量中的全局函数一起更新?安卓/Java

如何在Scala代码库的同一个文件中使用scala列表和java列表?

Java的多键指向同一个值

Java中同一个类的继承与组合

Java多个程序在同一个文本文件上写入

多个Rhino(java)线程处理同一个文件

java:在一个webapp中使用同一个库的两个版本

如何使用Scanner在Main中输入两个数字并使其与方法一起使用(升序Java)?

升序和使用Java在同一个程序Desending秩序

正确分配给使用&&与Java中的同一个变量的变量?

使用JAXB可以为同一个Java对象提供多个XML映射?

如何使用Java 8对同一个自定义对象执行多项操作

休眠将 2 个 java 文件链接到同一个数据库表

我需要一个与ssl一起使用的java stomp客户端库

在Java中将多个构造函数与一个对象一起使用

Spring Security(Java Config):对同一个URL使用不同的HTTP方法使用antmatchers

FileInputStream 和 FileOutputStream:读写同一个文件

是否可以在同一个 build.xml 中使用多个 Java 版本 - ANT 构建。- ANTLR3.3

java在同一个类中两次使用类名时传递变量

java.lang.NoSuchMethodError,两个类都在同一个JAR中!

Clojure和Java源代码在同一个NetBeans项目中

Java调用线程在同一个循环中启动

如何在同一个 Java Stream 上同时调用 takeWhile 和 dropWhile