当前位置: 首页 > 面试题库 >

用扫描仪读取行

谭坚诚
2023-03-14
问题内容

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

我不明白我在做什么错:

我正在使用此代码:

    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。

dico.txt:https://drive.google.com/file/d/0B0sroFy9HZlBNDl3MUwzVnh6VU0/edit

usp
=
sharing

test.txt:https://drive.google.com/file/d/0B0sroFy9HZlBemZjbXU1RmlmdjQ/edit

usp
=
sharing


问题答案:

此代码逐行读取文件。

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"));

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

更新的答案供您评论:

我只是试图用以下内容创建一个输入文件

a
à
abaissa
abaissable
abaissables
abaissai
abaissaient
abaissais
abaissait

试图用下面的代码阅读它。

 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");

然后执行循环以读取行。希望这可以帮助!



 类似资料:
  • 问题内容: 我正在玩Scanner类,以进行学习,并且我使用它来读取非常大的文件(大约60.000行,大约不使用Reader类),并且在大约400行后停止读取。我是否必须在Scanner的构造函数中使用Bufferedreader还是问题?我想知道为什么会这样。谢谢。我的代码是输出所有行的常用代码。 问题答案: 此问题通常在64位计算机上或文件大小大于1-2 GB的文件中更常见,并且与堆空间无关。

  • 问题内容: 我正在尝试做的是拥有多个具有不同变量的输入。每个变量将是不同方程式的一部分。我正在寻找一种方法来做,我想我有一个主意。我只想知道这是否合法,也许还有更好的方法。 问题答案: 如果每个输入都问相同的问题,则应使用循环和输入数组: 或者如Chip所建议的,您可以从一行中解析输入: 您在正确的轨道上,所做的工作正常。这只是一种更好,更灵活的处理方式。

  • 问题内容: 我有此方法,并且从控制台(键盘)读取了一个整数序列,并将所有整数添加到ArrayList中,我使用Scanner类读取了这些数字,但是在for循环中不起作用,它抛出“ java.util.NoSuchElementException”。 问题答案: 首先,使用一个扫描仪,而不是每次都重新创建一个扫描仪。此外,您的for循环还会多循环一次。 这对我来说很好,最后列表包含了我输入的所有数字

  • 我有麻烦更新一个变量的名称为一个对象使用扫描器。我提供一个菜单给用户,用户选择他的选择(更新名称),程序要求用户输入新的名称,扫描器读取system.in并更新变量的名称。唯一的问题是程序不能读取带有空格的字符串。例如: 如果键入类似的内容,则可以执行此操作,但如果键入,则将得到,输出示例如下 所以我猜它只读取t,当扫描器扫描shipProperty值时,它读取dog而不是等待输入。我读过关于的文

  • 问题内容: 我已读过只能为int类型的用户输入,当用户输入字母而不是int时出现问题。我知道如何处理该异常,但是我想在用户犯错的地方返回扫描仪读取的信息。我能怎么做?我已经尝试过无限循环,但是它不起作用。 问题答案: 尽管其他答案为您提供了使用循环的正确思路,但您应避免将异常用作基本逻辑的一部分。相反,您可以使用from 检查用户是否传递了整数。

  • 我在尝试运行此程序时遇到以下异常。我正在使用在线编译器。甚至在读取字符串后尝试使用nextLine(),但没有成功。 我得到了以下异常:输入客户名称:在线程“main”java中输入客户id异常。util。NoSuchElementException:在java中找不到行。util。扫描仪。nextLine(Scanner.java:1585)位于Main。main(main.java:12)