Java 扫描仪无法读取文本文件

Java 扫描仪无法读取文本文件,java,Java,我有一堆的.txt文件,我正试图阅读,但他们中的许多人不会阅读。那些不会读取的文本以文本前的空行开头。例如,下面抛出一个NoTouchElementException: public static void main(String[] args) throws FileNotFoundException{ Scanner input = new Scanner(new File("documentSets/med_doc_set/bmu409.shtml.txt")); Syst

我有一堆的.txt文件,我正试图阅读,但他们中的许多人不会阅读。那些不会读取的文本以文本前的空行开头。例如,下面抛出一个NoTouchElementException:

public static void main(String[] args) throws FileNotFoundException{
    Scanner input = new Scanner(new File("documentSets/med_doc_set/bmu409.shtml.txt"));
    System.out.println(input.next());
}
其中正在读取的文本文件以一个空行开始,然后是一些文本。我还尝试使用input.skip(“[\\s]*”)跳过任何前导空格,但它会引发相同的错误。有办法解决这个问题吗

编辑:
该网站托管在谷歌文档上。如果下载以在文本编辑器中查看,您可以看到它以空行开头。

它以空行开头,并且您只打印代码中的第一行,请将其更改为:

public static void main(String[] args) throws FileNotFoundException{
    Scanner input = new Scanner(new File("documentSets/med_doc_set/bmu409.shtml.txt"));
    while(input.hasNextLine()){
        System.out.println(input.nextLine());
    }
}

它以一个空行开始,并且您只打印代码中的第一行,请将其更改为:

public static void main(String[] args) throws FileNotFoundException{
    Scanner input = new Scanner(new File("documentSets/med_doc_set/bmu409.shtml.txt"));
    while(input.hasNextLine()){
        System.out.println(input.nextLine());
    }
}

扫描器读取到行尾的所有单词或数字。此时,您需要调用nextLine()。如果要避免出现异常,需要调用hasNextXxxx()方法之一,以确定是否可以读取该类型。

扫描器读取到行尾的所有单词或数字。此时,您需要调用nextLine()。如果要避免出现异常,需要调用hasNextXxxx()方法之一,以确定该类型是否可以读取。

在处理输入时,
扫描器
类型异常不一致。它吞并了I/O异常——消费者应该这样做——因此它在告知读者错误方面很松懈。但是在解码字符数据时,类型是严格的-编码错误的文本或使用错误的编码将导致引发
IOException
,该类型会立即接受

此代码通过错误检查读取文本文件中的所有行:

  public static List<String> readAllLines(File file, Charset encoding)
      throws IOException {
    List<String> lines = new ArrayList<>();
    try (Scanner scanner = new Scanner(file, encoding.name())) {
      while (scanner.hasNextLine()) {
        lines.add(scanner.nextLine());
      }
      if (scanner.ioException() != null) {
        throw scanner.ioException();
      }
    }
    return lines;
  }
publicstaticlist readAllLines(文件,字符集编码)
抛出IOException{
列表行=新的ArrayList();
try(Scanner=newscanner(文件,encoding.name())){
while(scanner.hasNextLine()){
line.add(scanner.nextLine());
}
if(scanner.ioException()!=null){
抛出scanner.ioException();
}
}
回流线;
}
此代码读取行并将解码器不理解的代码点转换为问号:

  public static List<String> readAllLinesSloppy(File file, Charset encoding)
      throws IOException {
    List<String> lines = new ArrayList<>();
    try (InputStream in = new FileInputStream(file);
        Reader reader = new InputStreamReader(in, encoding);
        Scanner scanner = new Scanner(reader)) {
      while (scanner.hasNextLine()) {
        lines.add(scanner.nextLine());
      }
      if (scanner.ioException() != null) {
        throw scanner.ioException();
      }
    }
    return lines;
  }
publicstaticlist readAllLinesSloppy(文件,字符集编码)
抛出IOException{
列表行=新的ArrayList();
try(InputStream in=新文件InputStream(文件);
Reader Reader=新的InputStreamReader(in,编码);
扫描仪=新扫描仪(读卡器)){
while(scanner.hasNextLine()){
line.add(scanner.nextLine());
}
if(scanner.ioException()!=null){
抛出scanner.ioException();
}
}
回流线;
}
这两种方法都要求您显式提供,而不是依赖通常不是Unicode的(另请参见)


代码是Java 7语法,未经测试。

扫描器类型在处理输入时异常不一致。它吞并了I/O异常——消费者应该这样做——因此它在告知读者错误方面很松懈。但是在解码字符数据时,类型是严格的-编码错误的文本或使用错误的编码将导致引发
IOException
,该类型会立即接受

此代码通过错误检查读取文本文件中的所有行:

  public static List<String> readAllLines(File file, Charset encoding)
      throws IOException {
    List<String> lines = new ArrayList<>();
    try (Scanner scanner = new Scanner(file, encoding.name())) {
      while (scanner.hasNextLine()) {
        lines.add(scanner.nextLine());
      }
      if (scanner.ioException() != null) {
        throw scanner.ioException();
      }
    }
    return lines;
  }
publicstaticlist readAllLines(文件,字符集编码)
抛出IOException{
列表行=新的ArrayList();
try(Scanner=newscanner(文件,encoding.name())){
while(scanner.hasNextLine()){
line.add(scanner.nextLine());
}
if(scanner.ioException()!=null){
抛出scanner.ioException();
}
}
回流线;
}
此代码读取行并将解码器不理解的代码点转换为问号:

  public static List<String> readAllLinesSloppy(File file, Charset encoding)
      throws IOException {
    List<String> lines = new ArrayList<>();
    try (InputStream in = new FileInputStream(file);
        Reader reader = new InputStreamReader(in, encoding);
        Scanner scanner = new Scanner(reader)) {
      while (scanner.hasNextLine()) {
        lines.add(scanner.nextLine());
      }
      if (scanner.ioException() != null) {
        throw scanner.ioException();
      }
    }
    return lines;
  }
publicstaticlist readAllLinesSloppy(文件,字符集编码)
抛出IOException{
列表行=新的ArrayList();
try(InputStream in=新文件InputStream(文件);
Reader Reader=新的InputStreamReader(in,编码);
扫描仪=新扫描仪(读卡器)){
while(scanner.hasNextLine()){
line.add(scanner.nextLine());
}
if(scanner.ioException()!=null){
抛出scanner.ioException();
}
}
回流线;
}
这两种方法都要求您显式提供,而不是依赖通常不是Unicode的(另请参见)


代码是Java 7语法,未经测试。

“抽象工作压力可以定义为有害的…”当我复制并粘贴到注释框中时,它会显示一个空行,然后在下一行显示“抽象”,然后是较长的一行。但是,如果使用扫描器输入的默认分隔符,则即使开头有空行(\n),代码也应打印文件中的第一个字。当您调用下一个方法时,它会自动搜索第一个有效令牌,将分隔符放在一边。您最好将文件内容放在此处,而不是作为注释,而是编辑您的问题以将其发布。除了其他建议外,
Scanner
隐藏I/O错误,您必须显式地执行此操作。如果文本文件中存在编码错误,或者尝试使用错误的encoding.interest读取文件,则可能会发生这种情况@麦克道尔:我不知道。我把一个调用输入到一个试块中,使它抛出一个错误,然后打印出了输入。IOVATORATION(),它给了我“JavaNIO.CalSt.MalFordMeMeIdPosieExp:In=1”,这看起来像空白行不是一个有效的Unicode字符。有什么方法可以让我在处理文件时跳过它吗?@user1470948-我添加了一个答案,并举例说明。“抽象的工作压力可以定义为有害的…”当我复制并粘贴到评论框时,它会显示一个空行,然后是“abstr”