Читать строку со сканером
EDIT для других читателей: проблема в том, что мой файл ввода был поврежден.
Я не понимаю, что я делаю неправильно:
Я использовал этот код:
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". Любая идея о том, что я делаю неправильно?
Я точно знаю, что ничего не изменилось, файл все тот же.
EDIT: я также уточняю, что я попытался с другим файлом и получил тот же результат, что означает, что он не поступает из файла.
Файл выглядит следующим образом:
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
попытался прочитать его с помощью приведенного ниже кода. Он просто работал нормально.
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 ennvironment, последовательность End of Line (EOL) (0x0D 0x0A,\r\n) на самом деле представляет собой два символа ASCII, комбинацию символов CR и LF. если вы установите экземпляр Scanner для использования разделителя следующим образом, он наверняка заберет
scr = new Scanner(file);
scr.useDelimiter("\r\n");
а затем выполните цикл, чтобы читать строки. Надеюсь, это поможет!
Ответ 2
next() и nextLine() связаны со Сканером и используются для получения входов String. Их отличия...
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()
решит проблему.
Ответ 3
/*
* 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();
}
}
Ответ 4
Попробуйте использовать r.hasNext() вместо r.hasNextLine():
while(r.hasNext()) {
scan = r.next();
Ответ 5
Для всех, кто все еще не может читать в простом .txt файле с помощью сканера Java.
У меня была проблема, которую сканер не мог прочитать в следующей строке, когда я копировал и вставлял информацию, или когда в моем файле было много текста.
Решение: Coder.txt файл в UTF-8.
Это можно сделать достаточно просто, сохранив открывание файла снова и изменив кодировку на UTF-8. (Под Win7 в правом нижнем углу)
После этого сканер не должен иметь никаких проблем.