Java扫描程序不通过整个文件

时间:2011-11-30 18:05:04

标签: java file-io java.util.scanner

我正在用Java编写程序,我需要做的一件事就是为最短路径问题创建一组每个有效位置。位置在.txt文件中定义,该文件遵循严格模式(每行一个条目,没有额外的空格),非常适合使用.nextLine来获取数据。我的问题是文件中的241行(432中的一行)扫描仪在通过条目的3/4处停止工作,并且无法识别任何新行。

我的代码:

    //initialize state space
private static Set<String> posible(String posLoc) throws FileNotFoundException {
    Scanner s = new Scanner(new File(posLoc));
    Set<String> result = new TreeSet<String>();
    String availalbe;
    while(s.hasNextLine()) {
        availalbe = s.nextLine();
        result.add(availalbe);
    }
    s.close();
    return result;
}

数据

Shenlong Gundam
Altron Gundam
Tallgee[scanner stops reading here]se
Tallgeese II
Leo (Ground)
Leo (Space)

当然,“扫描仪在此处停止读取”不在数据中,我只是标记扫描仪停止读取文件的位置。这是3068字节到文件中,但这不应该影响任何东西,因为在同一个程序中,几乎相同的代码,我正在读取编码路径的261行,14KB .txt文件。任何帮助将不胜感激。

谢谢。

8 个答案:

答案 0 :(得分:17)

扫描仪读取文件时出现问题,但我不确定它是什么。它错误地认为它没有到达文件的末尾,可能是由于一些时髦的字符串编码。尝试使用包装FileReader对象的BufferedReader对象。

例如,

   private static Set<String> posible2(String posLoc) {
      Set<String> result = new TreeSet<String>();
      BufferedReader br = null;
      try {
         br = new BufferedReader(new FileReader(new File(posLoc)));
         String availalbe;
         while((availalbe = br.readLine()) != null) {
             result.add(availalbe);            
         }
      } catch (FileNotFoundException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      } finally {
         if (br != null) {
            try {
               br.close();
            } catch (IOException e) {
               e.printStackTrace();
            }
         }
      }
      return result;
  }

修改
我尝试将你的问题减少到最低限度,这足以引出问题:

   public static void main(String[] args) {
      try {
         Scanner scanner = new Scanner(new File(FILE_POS));
         int count = 0;
         while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            System.out.printf("%3d: %s %n", count, line );
            count++;
         }

我用printf检查了Scanner对象:

System.out.printf("Str: %-35s size%5d; Has next line? %b%n", availalbe, result.size(), s.hasNextLine());

并表明它认为该文件已经结束。我正在逐步删除从数据到文件的行,以查看导致问题的行,但是会留给您。

答案 1 :(得分:7)

我遇到了同样的问题,这就是我所做的修复它:

1.Saved the file I was reading from into UTF-8
2.Created new Scanner like below, specifying the encoding type:


   Scanner scanner = new Scanner(new File("C:/IDSBRIEF/GuidData/"+sFileName),"UTF-8");   

答案 2 :(得分:5)

我遇到了同样的问题。扫描仪不会读到文件的末尾,实际上是在一个单词的中间停止。我认为这是一个问题,扫描仪设置了一些限制,但我注意到rfeak关于字符编码的评论。

我重新保存了.txt我正在阅读的UTF-8,它解决了问题。事实证明,Notepad默认为ANSI。

答案 3 :(得分:0)

我有一个txt文件,其中Scanner在第862行停止阅读,这是一个奇怪的问题。我所做的是创建一个不同的文件(试图复制问题)。我首先添加了少于862行,然后我添加了超过862行,它工作正常。

所以我认为问题在于,在我之前的文件中,在第862行,出现了一些错误,例如某些字符或符号可能误导了Scanner提前完成阅读。

总之:基于这种经验,我建议找出扫描仪停止阅读的确切行,以找到解决问题的方法。

答案 4 :(得分:0)

我的情况:

  • 在我的主程序(A)中,它总是从41021字节文件中读取16384字节。停止的字符在带有普通可打印文本的行的中间
  • 如果我创建一个仅包含扫描程序和打印行的小型单独程序(B),它将读取整个文件
  • 在(A)中指定“ UTF-8”仍显示为16384
  • 在(A)中指定“ ASCII”仍为16384
  • 在(A)中指定“ Cp1252”会读取整个文件
  • 我的输入txt文件是由用户发送的,我不确定它们是否会以任何特定的编码来编写

结论

  • 扫描器似乎逐块读取文件,并将正确读取的数据写入返回字符串,但是当它找到编码与预期不同的块时,它会静默退出(哎呀) )并返回部分字符串
  • 我要读取的txt文件是Cp1252,我的(A)源文件是UTF-8,而我的(B)源文件是Cp1252,这就是为什么(B)在不指定编码的情况下工作的原因

解决方案

  • 忘记扫描仪并使用

String fullFileContents = new String(Files.readAllBytes(myFile.toPath()));

当然,由于您不知道编码方式,因此无法可靠地读取非ascii字符,但是可以肯定地读取ascii字符。如果只需要文件中的ASCII字符,并且可以丢弃非ASCII部分,请使用它。

答案 5 :(得分:0)

我在Linux服务器上也遇到了类似的问题,最后下面的代码对我有用。

扫描仪扫描仪=新扫描仪(新文件(文件名),“ UTF-8”);

答案 6 :(得分:0)

我在使用csv文件时遇到了同样的问题:它可以在Windows上运行,但不能在Linux上运行

使用nodepad ++打开文件并更改编码,选择:以UTF8编码(带有BOM)。 它解决了我的情况

答案 7 :(得分:-3)

你应该用这个:

扫描仪扫描仪=新扫描仪(fileObj).useDelimiter(“\ z”);
的System.out.println(scanner.next());