带扫描仪的读取行

2022-09-01 06:12:18

编辑进一步的读者:问题是我的输入文件已损坏。

我不明白我做错了什么:

我正在使用这个代码:

    File f = new File("C:\\Temp\\dico.txt");
    BufferedReader r = null;
    try {
        r = new BufferedReader(new FileReader(f));
        String scan;
        while((scan=r.readLine())!=null) {
            if(scan.length()==0) {continue;}
            //treatment
        }
    } catch (FileNotFoundException ex) {
        Logger.getLogger(Lexique.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(Lexique.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        if(r!=null) try {
            r.close();
        } catch (IOException ex) {
            Logger.getLogger(Lexique.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

这很好。现在,出于某种原因,我想换一个扫描仪。我的代码变成了:

    File f = new File("C:\\Temp\\dico.txt");
    Scanner r = null;
    try {
        r = new Scanner(f);
        String scan;
        while(r.hasNextLine()) {
            scan = r.nextLine();
            if(scan.length()==0) {continue;}
            //treatment
        }
    } catch (FileNotFoundException ex) {
        Logger.getLogger(Lexique.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(Lexique.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        if(r!=null) r.close();
    }

这一次,我们从不输入 while,因为 r.hasNextLine() 总是返回 “false”。关于我做错了什么的任何想法?

我精确地说,没有其他更改,文件仍然相同。

编辑:我也精确地指出,我尝试了另一个文件并得到了相同的结果,这意味着它显然不是来自该文件。

该文件如下所示:

a
à
abaissa
abaissable
abaissables
abaissai
abaissaient
abaissais
abaissait
...

编辑 2 :文件的内容似乎有问题,因为只有当我将内容从文件复制/粘贴到另一个文件时,问题仍然存在。显然,如果我自己编写内容,它可以工作,如果我使用我的dico.txt文件的一部分内容,它就不起作用。任何解释?

编辑 3 :这些是指向我的文件的链接。我建议你避免使用dico.txt这是非常巨大的。

迪科.txt : https://drive.google.com/file/d/0B0sroFy9HZlBNDl3MUwzVnh6VU0/edit?usp=sharing

测试.txt : https://drive.google.com/file/d/0B0sroFy9HZlBemZjbXU1RmlmdjQ/edit?usp=sharing


答案 1

此代码逐行读取文件。

public static void readFileByLine(String fileName) {
  try {
   File file = new File(fileName);
   Scanner scanner = new Scanner(file);
   while (scanner.hasNext()) {
    System.out.println(scanner.next());
   }
   scanner.close();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } 
 }

还可以将分隔符设置为行分隔符,然后执行相同的操作。

 scanner.useDelimiter(System.getProperty("line.separator"));

您必须检查是否有下一个令牌可用,然后读取下一个令牌。您还需要仔细检查提供给扫描仪的输入。即迪科.txt。默认情况下,扫描仪根据空格中断其输入。请确保输入的分隔符位于正确的位置

更新了您的评论答案:

我只是尝试创建一个内容如下的输入文件

a
à
abaissa
abaissable
abaissables
abaissai
abaissaient
abaissais
abaissait

尝试用下面的 code.it 阅读它,只是工作正常。

 File file = new File("/home/keerthivasan/Desktop/input.txt");
     Scanner scr = null;
         try {
            scr = new Scanner(file);
            while(scr.hasNext()){
                System.out.println("line : "+scr.next());
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ScannerTest.class.getName()).log(Level.SEVERE, null, ex);
        }

输出:

line : a
line : à
line : abaissa
line : abaissable
line : abaissables
line : abaissai
line : abaissaient
line : abaissais
line : abaissait

所以,我相信这应该有效。由于您在 Windows 环境中工作,因此行尾 (EOL) 序列(0x0D 0x0A,\r\n)实际上是两个 ASCII 字符,是 CR 和 LF 字符的组合。如果将 Scanner 实例设置为按如下方式使用分隔符,则它可能会拾取

 scr = new Scanner(file);
 scr.useDelimiter("\r\n");

然后进行循环以读取行。希望这有帮助!


答案 2

next() 和 nextLine() 方法与 Scanner 相关联,用于获取字符串输入。他们的区别是...

next() 只能读取输入直到空格。它无法读取两个由空格分隔的单词。此外,next() 在读取输入后将光标放在同一行中。

nextLine() 读取输入,包括单词之间的空格(即,它读取到行尾 \n)。读取输入后,nextLine() 将光标置于下一行。

阅读文章:next() 和 nextLine() 之间的区别

将 while 循环替换为 :

while(r.hasNext()) {
                scan = r.next();
                System.out.println(scan);
                if(scan.length()==0) {continue;}
                //treatment
            }

使用 和 方法将解决此问题。hasNext()next()


推荐