Как определить конец строки с помощью сканера? - PullRequest
7 голосов
/ 09 февраля 2012

В моей программе есть сканер, который читает части файла и форматирует их для HTML. Когда я читаю свой файл, мне нужно знать, как заставить сканер узнать, что он находится в конце строки, и начать запись на следующую строку.

Вот соответствующая часть моего кода, дайте мне знать, если я что-то пропустил:

//scanner object to read the input file
Scanner sc = new Scanner(file);

//filewriter object for writing to the output file
FileWriter fWrite = new FileWriter(outFile);

//Reads in the input file 1 word at a time and decides how to
////add it to the output file
while (sc.hasNext() == true)
{
    String tempString = sc.next();
    if (colorMap.containsKey(tempString) == true)
    {
        String word = tempString;
        String color = colorMap.get(word);
        String codeOut = colorize(word, color);
        fWrite.write(codeOut + " ");
    }
    else
    {
        fWrite.write(tempString + " ");
    }
}

//closes the files
reader.close();
fWrite.close();
sc.close();

Я узнал о sc.nextLine(), но я все еще не знаю, как определить, когда я нахожусь в конце строки.

Ответы [ 4 ]

8 голосов
/ 05 октября 2012

Если вы хотите использовать только Scanner, вам нужно создать временную строку, создать ее экземпляр для nextLine () сетки данных (чтобы он возвращал только пропущенную строку) и новый объект Scanner, сканирующий временную строку.Таким образом, вы используете только эту строку, и hasNext () не будет возвращать ложный положительный результат (на самом деле это не ложный положительный результат, потому что это то, что он должен был сделать, но в вашей ситуации это было бы технически).Вы просто продолжаете nextLine () с первого сканера и меняете временную строку и второй сканер для сканирования каждой новой строки и т. Д.

1 голос
/ 09 февраля 2012

Линии обычно разделяются \n или \r, поэтому, если вам нужно проверить это, вы можете попробовать сделать это таким образом, хотя я не уверен, почему вы захотите, поскольку вы уже используете nextLine() прочитать целую строку.

Scanner.hasNextLine() есть, если вы беспокоитесь о том, что hasNext() не работает для вашего конкретного случая (хотя не знаю, почему это не так).

1 голос
/ 09 февраля 2012

вы можете использовать метод hasNextLine, чтобы перебирать файл строка за строкой, а не слово за словом, затем разбивать строку на пробелы и выполнять операции над словом

здесь тот же код, использующий hasNextLine и split

//scanner object to read the input file
Scanner sc = new Scanner(file);

//filewriter object for writing to the output file
FileWriter fWrite = new FileWriter(outFile);

//get the line separator for the current platform
String newLine = System.getProperty("line.separator");

//Reads in the input file 1 word at a time and decides how to
////add it to the output file
while (sc.hasNextLine())
{
    // split the line by whitespaces [ \t\n\x0B\f\r]
    String[] words = sc.nextLine().split("\\s");
    for(String word : words)
    {
        if (colorMap.containsKey(word))
        {
            String color = colorMap.get(word);
            String codeOut = colorize(word, color);
            fWrite.write(codeOut + " ");
        }
        else
        {
            fWrite.write(word + " ");
        }
    }
    fWrite.write(newLine);
}

//closes the files
reader.close();
fWrite.close();
sc.close();
1 голос
/ 09 февраля 2012

Ух, я использую Java уже 10 лет и никогда не слышал о сканере! По-видимому, по умолчанию используются разделители пробелов, поэтому вы не можете определить, когда наступает конец строки.

Похоже, вы можете изменить разделители сканера - см. Пример на Класс сканера :

 String input = "1 fish 2 fish red fish blue fish";
 Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
 System.out.println(s.nextInt());
 System.out.println(s.nextInt());
 System.out.println(s.next());
 System.out.println(s.next());
 s.close();
...