hasNextLine () вызывает findWithinHorizon () , что, в свою очередь, вызывает findPatternInBuffer () , поиск соответствия для шаблона символов конца строки, определенного как .*(\r\n|[\n\r\u2028\u2029\u0085])|.+$
Странно то, что при обоих способах построения Scanner (с FileInputStream или с помощью File) findPatternInBuffer возвращает положительное совпадение, если файл содержит (независимо от размера файла), например, терминатор строки 0x0A;но в случае, если файл содержит символ вне ascii (то есть> = 7f), использование FileInputStream возвращает true, а при использовании File возвращает false.
Очень простой тестовый случай:
создайте файл, которыйсодержит только символ "a"
# hexedit file
00000000 61 0A a.
# java Test.java
using File: true
using FileInputStream: true
Теперь отредактируйте файл с помощью hexedit так:
# hexedit file
00000000 61 0A 80 a..
# java Test.java
using File: false
using FileInputStream: true
В тестовом Java-коде нет ничего, кроме того, что уже есть в вопросе:
import java.io.*;
import java.lang.*;
import java.util.*;
public class Test {
public static void main(String[] args) {
try {
File file1 = new File("file");
Scanner s1 = new Scanner(file1);
System.out.println("using File: "+s1.hasNextLine());
File file2 = new File("file");
Scanner s2 = new Scanner(new FileInputStream(file2));
System.out.println("using FileInputStream: "+s2.hasNextLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}
ТАК, оказывается, это проблема кодировки.Фактически, изменив тест на:
Scanner s1 = new Scanner(file1, "latin1");
, мы получим:
# java Test
using File: true
using FileInputStream: true