while( inStream.hasNextLine() )
{
...
lineList.add( inStream.nextLine() );
}
...
lineList是一个ArrayList。代码正在很好地读取所有内容,除非它不会抓住最后一行。文本文件中的最后两行如下所示:
"a sentence here..."
<a blank line here. the blank line is the last line>
我假设它不会抓住它,因为hasNextLine()在此之后没有检测到另一行?
什么方法可以抓住最后一行?我认为阅读直到它是EOF然后捕捉异常可能会有效但似乎没有办法做到这一点。
编辑:更多信息
public void readLines()
{
lineList = new ArrayList();
try
{
inStream = new Scanner( new File( fileName ) );
}
catch( FileNotFoundException e )
{
System.out.println( "Error opening the file. Try again." );
}
if ( inStream != null )
{
while( inStream.hasNextLine() )
{
++originalLines;
lineList.add( inStream.nextLine() );
}
inStream.close();
}
}
有整个方法。怎么了?
编辑:更多信息
public static void main(String[] args)
{
Scanner inStream = null;
String test = "";
inStream = new Scanner( test );
while( inStream.hasNextLine() )
{
System.out.println( inStream.nextLine() );
}
}
它不会拾取空字符串,但会拾取空格“”
答案 0 :(得分:5)
nextLine()
可以正常返回最后一行,即使它是空白的。我怀疑你的问题出在其他地方。
String multilinetext =
"Line1\n" +
"Line2\n" +
"\n" +
"Line4\n" +
"\n";
Scanner sc = new Scanner(multilinetext);
while (sc.hasNextLine()) {
System.out.println("[" + sc.nextLine() + "]");
}
/* prints
[Line1]
[Line2]
[]
[Line4]
[]
*/
它不会拾取空字符串
这是设计的正确行为。如果输入为空字符串,则Scanner
不能指出hasNextLine()
并在nextLine()
上返回空字符串,尤其是因为这不会使Scanner
前进过去任何角色。
如果您考虑一下,如果您希望Scanner
对空字符串说hasNextLine()
,并在nextLine()
上返回一个空字符串,那么这将导致无限循环:它总是 hasNextLine()
并且总是在nextLine()
永远上返回一个空字符串。这种行为显然是不切实际的。
答案 1 :(得分:1)
这段代码对我来说很好 - 你确定最后确实有一个空白行(例如,文件以两个换行符结尾,而不仅仅是一行)?
答案 2 :(得分:1)
扫描仪不会拾取空字符串。没有什么可以标记的。 Scanner是一个tokenizer,默认根据Java 6 javadoc使用Character.isWhitespace。每次遇到令牌之前,它都以字符串形式返回,但不包括令牌。如果最后一项是令牌,则会将其删除,并且不会添加任何新行。您可能最终在ArrayList中使用空字符串,但它只是一个空字符串,因为该标记已被删除。没有数据,没有令牌和扫描仪看不到线路。你在编辑器中看到的不是空白。如果键入,光标位于将添加字符的位置。如果你没有输入任何东西那里就没有实际的那条线。
答案 3 :(得分:0)
我想指出两者
String multilinetext =
"Line1\n" +
"Line2\n" +
"\n" +
"Line4\n";
和
String multilinetext =
"Line1\n" +
"Line2\n" +
"\n" +
"Line4";
使用@polygenelubricants代码返回完全相同的结果:
[Line1]
[Line2]
[]
[Line4]
因为Scanner没有给出最终的&#34;换行符&#34;字符。
所以如果你想得到最后一个空的&#34;这不是正确的解决方案,您应该读取每个字节。
答案 4 :(得分:0)
最后找到了一条路来!这是代码:
public static void main(String[] args) {
String multiLineText = "Line1\n" +
"Line2\n" +
"\n" +
"Line4\n" +
"\n" +
"";
Scanner scanner = new Scanner(multiLineText).useDelimiter("\r?\n");
String line = firstLine(scanner);
System.out.println("[" + line + "]");
while (hasNextLine(scanner)) {
line = nextLine(scanner);
System.out.println("[" + line + "]");
}
/* prints ALL six lines */
// [Line1]
// [Line2]
// []
// [Line4]
// []
// []
scanner.close();
}
private static String firstLine(Scanner scanner) {
// Check for empty first line.
scanner.useDelimiter("");
if (scanner.hasNext("\n")) {
scanner.useDelimiter("\r?\n");
return "";
}
// Check for empty input.
scanner.useDelimiter("\r?\n");
if (scanner.hasNext()) {
return scanner.next();
}
return "";
}
private static boolean hasNextLine(Scanner scanner) {
return scanner.hasNext() || scanner.hasNextLine();
}
private static String nextLine(Scanner scanner) {
if (scanner.hasNext()) {
return scanner.next();
}
return scanner.nextLine();
}
不客气。 (经过测试的JDK 1.8,JDK 11.0.2,JDK 12.0.2)
更新:2019-09-23 我发现即使获得第一线也是一个使命!我发布了更新后的代码,以便兑现“每一行”的要求。