Подтвердить что ты не робот

Читать строку со сканером

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

4b9b3361

Ответ 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 в правом нижнем углу)

После этого сканер не должен иметь никаких проблем.