Как определить конец строки с помощью сканера?
В моей программе есть сканер, который читает части файла и форматирует их для 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 ответа
Если вы хотите использовать только Scanner, вам нужно создать временную строку, создать ее экземпляр для nextLine() сетки данных (чтобы он возвращал только пропущенную строку) и новый объект Scanner, сканирующий временную строку. Таким образом, вы используете только эту строку, и hasNext() не будет возвращать ложный положительный результат (на самом деле это не ложный положительный результат, потому что это то, что он должен был сделать, но в вашей ситуации это было бы технически). Вы просто продолжаете nextLine() с первого сканера и меняете временную строку и второй сканер для сканирования каждой новой строки и т. Д.
Вы можете использовать метод 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();
Линии обычно ограничиваются \n
или же \r
так что если вам нужно проверить это, вы можете попробовать сделать это таким образом, хотя я не уверен, почему вы хотите, так как вы уже используете nextLine()
читать целую строку.
Есть Scanner.hasNextLine()
если вы беспокоитесь о hasNext()
не работает для вашего конкретного случая (не уверен, почему это не так, хотя).
Вау, я использую 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();