Как определить конец линии с помощью сканера?

у меня есть сканер в моей программе, который читает части файла и форматирует их для 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 ответов


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


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

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


вы можете использовать метод 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();

Wow я использую 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();