编辑以供更多读者使用:问题是我的输入文件已损坏。
我不明白我做错了什么:
我正在使用此代码:
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
答案 0 :(得分:18)
此代码逐行读取文件。
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。默认情况下,Scanner根据空格中断输入。请确保输入的分隔符在正确的位置
您的评论更新的答案:
我只是尝试使用以下内容创建一个输入文件
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");
然后循环读取行。希望这有帮助!
答案 1 :(得分:5)
next()和nextLine()方法与Scanner相关联,用于获取String输入。他们的不同之处在于......
next()只能读取输入直到空格。它无法读取由空格分隔的两个单词。此外,next()在读取输入后将光标放在同一行。
nextLine()读取包含单词之间空格的输入(即,读取直到行尾\ n)。读取输入后,nextLine()将光标定位在下一行。
阅读文章:Difference between next() and nextLine()
用以下内容替换你的while循环:
while(r.hasNext()) {
scan = r.next();
System.out.println(scan);
if(scan.length()==0) {continue;}
//treatment
}
使用hasNext()
和next()
方法可解决此问题。
答案 2 :(得分:1)
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package javaapplication1;
import java.io.File;
import java.util.Scanner;
/**
*
* @author zsagga
*/
class openFile {
private Scanner x ;
int count = 0 ;
String path = "C:\\Users\\zsagga\\Documents\\NetBeansProjects\\JavaApplication1\\src\\javaapplication1\\Readthis.txt";
public void openFile() {
// System.out.println("I'm Here");
try {
x = new Scanner(new File(path));
}
catch (Exception e) {
System.out.println("Could not find a file");
}
}
public void readFile() {
while (x.hasNextLine()){
count ++ ;
x.nextLine();
}
System.out.println(count);
}
public void closeFile() {
x.close();
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package javaapplication1;
/**
*
* @author zsagga
*/
public class JavaApplication1 {
public static void main(String[] args) {
// TODO code application logic here
openFile r = new openFile();
r.openFile();
r.readFile();
r.closeFile();
}
}
答案 3 :(得分:0)
尝试使用 r.hasNext()而不是 r.hasNextLine():
while(r.hasNext()) {
scan = r.next();
答案 4 :(得分:0)
对于仍然无法使用Java扫描程序读取简单.txt文件的所有人。
我遇到的问题是,当我复制并粘贴信息时,或者当我的文件中有大量文字时,扫描仪无法在下一行读取。
解决方案是:将您的.txt文件编码为UTF-8 通过再次保存打开文件并将编码更改为UTF-8,可以非常简单地完成此操作。 (在右下角附近的Win7下)
扫描仪在此之后不应该有任何问题。