編集さらなる読者のために:入力ファイルが破損しているという問題がありました。
私が間違っていることを理解していません:
私はこのコードを使用していました:
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();
}
今回は、r.hasNextLine()が常に「false」を返すため、whileに入ることはありません。私が間違っていることについてのアイデアはありますか?
私は他に何も変わっていないことを正確に述べました、ファイルはまだ同じです。
編集 :別のファイルで試したところ、同じ結果が得られたことも正確でした。つまり、明らかにファイルからのものではないということです。
ファイルは次のようになります。
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
このコードは、ファイルを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"));
次のトークンが利用可能かどうかを確認してから、次のトークンを読み取る必要があります。また、スキャナーへの入力を再確認する必要があります。すなわち、dico.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)は実際には2つのASCII文字、CRとLF文字の組み合わせです。次のように区切り文字を使用するようにScannerインスタンスを設定すると、おそらくピックアップされます
scr = new Scanner(file);
scr.useDelimiter("\r\n");
その後、ループを実行して行を読み取ります。お役に立てれば!
next()およびnextLine()メソッドはScannerに関連付けられ、文字列入力を取得するために使用されます。それらの違いは...
next()は、スペースまでしか入力を読み取ることができません。スペースで区切られた2つの単語を読み取ることはできません。また、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()
メソッドを使用すると、問題が解決します。
/*
* 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();
}
}
Javaスキャナーでまだ簡単な.txtファイルを読み取れないすべての人のために。
情報をコピーして貼り付けたとき、またはファイルに大量のテキストがあったときに、スキャナーが次の行を読み取れないという問題がありました。
解決策は、.txtファイルをUTF-8にコーディングします。
これは、ファイルを再度開いて保存し、コーディングをUTF-8に変更することで、非常に簡単に実行できます。 (右下隅近くのWin7の下)
この後、スキャナーに問題はないはずです。
r.hasNextLine()の代わりにr.hasNext()を使用してみてください:
while(r.hasNext()) {
scan = r.next();