【问题标题】:Reading degree symbol from .txt file with scanner使用扫描仪从 .txt 文件中读取度数符号
【发布时间】:2017-01-15 01:04:05
【问题描述】:

我正在为我的模拟器飞行编写一个主程序。我在 .txt 文件中获得简报,并尝试使用扫描仪读取该文件。 .txt 文件包含一个度数符号,这会导致扫描仪无法读取整个文件。

 public static String[] ConvertFile(String FileName){
    ArrayList<String> FileArray = new ArrayList<String>();
    int count = 0; 

    try{
        Scanner file =  new Scanner( new File ("C:\ <File Location>" + FileName));
        while(file.hasNextLine()){
            count++;
            String Line = file.nextLine());
            System.out.printf("%3d: %s %n", count, Line );
            System.out.println(count);

        }
    }
    catch(FileNotFoundException fnfe){
        System.out.println("File Not Found.");
    }
    return null;
}

我已经把这条线放在下面的问题中(第 23 行)

COND:    140475 LB // RWY DRY // +14°C  Q1021  270/09  // LMT: OBS(B)

请注意,当有 726 行时,输出会给出 txt 文件的前 16 行。我知道它的度数符号,因为当我编辑 txt 并删除度数符号时,程序会输出所有行。

【问题讨论】:

  • 所以它因为度数符号而崩溃?
  • 当你到达符号时会发生什么?它会崩溃吗,file.hasNextLine() 是否开始返回 false?在此之前是否还有其他度数符号被读取,或者这是第一个?
  • 它不会崩溃,它会打印 txt 文件的前 16 行,但有 726 行。抱歉,我并不清楚。我知道这是问题所在,因为当我编辑 txt 文件并删除符号时,扫描仪能够打印所有行。
  • 文件对这个非 ASCII 字符(以及任何其他字符)使用什么 'charset'(编码)?那是你的 JVM 的默认字符集,Scanner 的 1-arg ctor 使用它吗?如果不是,请使用 2-arg ctor 指定正确的字符集。
  • 我要尝试的第一件事是删除它卡住的第 16 行,看看它是否会更进一步,或者 16 是否是它会做的最大值。

标签: java java.util.scanner


【解决方案1】:

这是一个有趣的行为。我尝试运行您的示例,得到了相同的结果,除了我,如果我的文件的第 5 行有一个度数符号,程序甚至不想显示前 4 行。这背后的确切原因与字符编码有关,与对此有深入了解的人找到详细解释会很有趣。

经过一番挖掘,发现 Java 的 Scanner 使用了底层平台的默认字符集。您可以使用以下代码找出您的默认字符集是什么:

System.out.println(java.nio.charset.Charset.defaultCharset());

在我的系统上,显示的消息是“UTF-8”。我目前使用的是 Windows 10 系统,我创建的文本文件的默认字符编码为“ANSI”。我建议确保Scanner 使用的字符编码与文本文件的字符编码相同。

使用 Window 的记事本应用程序,我能够将字符编码从 ANSI 更改为 UTF-8。只需单击“文件”,然后单击“另存为...”,当弹出对话框时,请确保在“编码”框中选择底部的“UTF-8”。

当我重新运行示例时。该应用程序能够成功读取每一行。希望这可以帮助。干杯。

【讨论】:

  • 感谢您的帮助。我需要记住使用 UTF-8 编码保存我的 txt 文件。
【解决方案2】:

玩了一段时间后,我想出了一个无需以 UTF-8 重新保存文件的解决方案是让程序读取文件,然后在自己的目录中以 UTF-8 重新写入并以 UTF-8 格式从目录中读取文件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 2020-03-06
    • 2016-03-02
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多