编辑 以便进一步阅读:问题是我的输入文件已损坏。
我不明白我在做什么错:
我正在使用此代码:
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)