使用扫描仪读取文件时出现问题
Issue in reading a file with Scanner
这是一个非常简单的任务,我已经做过很多次了。但是,此刻,我被困在这一行微不足道的代码中。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Test {
private static Scanner scan;
public static void main(String[] args) throws FileNotFoundException {
// TODO Auto-generated method stub
File file = null;
switch (1) {
case 1:
file = new File("W:\Umesoft Evobus\From AQUA\Aqua data_ All\20090101-20090630_datenabzug_tilde.txt");
break;
case 2:
file = new File("W:\Umesoft Evobus\From AQUA\Aqua data_ All\20090701-20091231_datenabzug_tilde.txt");
break;
}
scan = new Scanner(file);
String x = scan.nextLine();
System.out.println(x);
}
}
当我尝试读取第一个文件时,出现了 NoSuchElementException。当我尝试读取第二个文件时,没有任何问题。这两个文件都来自相同的来源并且具有相同的格式。我敢肯定,输入文件没有问题。两个文件中的第一行是相同的。
谁能解释一下这种情况?
以上程序仅供测试。因此,我对 select 文件使用了一个 switch case。
在实际程序中,一组文件是由用户select编辑的。每一次,这个文件都被跳过。输入文件是数据文件,通过另一个程序生成。它们与 CSV 文件非常相似,但出于某些原因,此处使用的分隔符是 ~。它们不能为空,因为即使在最坏的情况下,它们也会有 headers。
Screenshot of the file contents in notepad++:
文件 1 的输出:
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Unknown Source)
at controller.Test.main(Test.java:24)
文件 2 的输出:
Weltherstellercode~FIN~Fahrzeug_Baumuster~~Motoridentnummer~Getriebe_Identifizierungsnummer~Produktionsdatum~Produktionsnummer_Fzg~Erstzulassungsdatum~Reparaturdatum~Fahrzeug_Laufleistung_in_km~Interne_VEGA_Antragsnummer~TGA~Fehlerort~~Fehlerart~~Reparaturart~~Hauptschadensteil~Reparaturland_(G&K)~~Reparaturbetrieb_(G&K)~~Mitteilungstext~Gutschriftsdatum_(Summe)~Anzahl_Beanstandungen~Gesamtkosten~Lohnkosten~Materialkosten~Summe_DH+NK~Anzahl_Arbeitswerte_(Gutgeschrieben)
String line ="";
BufferedReader br = new BufferedReader(new FileReader("path"));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
我更改了以前的代码以使用缓冲的 reader,因为
BufferedReader has significantly larger buffer memory than Scanner.
Use BufferedReader if you want to get long strings from a stream, and
use Scanner if you want to parse specific type of token from a stream
来自另一个 post 的以下答案有效。
scan = new Scanner(file,"UTF-8");
我不得不提到扫描器的编码。
感谢所有试图帮助我的人。特别感谢@Abhisheik 和@Priyamal。
这是一个非常简单的任务,我已经做过很多次了。但是,此刻,我被困在这一行微不足道的代码中。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Test {
private static Scanner scan;
public static void main(String[] args) throws FileNotFoundException {
// TODO Auto-generated method stub
File file = null;
switch (1) {
case 1:
file = new File("W:\Umesoft Evobus\From AQUA\Aqua data_ All\20090101-20090630_datenabzug_tilde.txt");
break;
case 2:
file = new File("W:\Umesoft Evobus\From AQUA\Aqua data_ All\20090701-20091231_datenabzug_tilde.txt");
break;
}
scan = new Scanner(file);
String x = scan.nextLine();
System.out.println(x);
}
}
当我尝试读取第一个文件时,出现了 NoSuchElementException。当我尝试读取第二个文件时,没有任何问题。这两个文件都来自相同的来源并且具有相同的格式。我敢肯定,输入文件没有问题。两个文件中的第一行是相同的。
谁能解释一下这种情况?
以上程序仅供测试。因此,我对 select 文件使用了一个 switch case。
在实际程序中,一组文件是由用户select编辑的。每一次,这个文件都被跳过。输入文件是数据文件,通过另一个程序生成。它们与 CSV 文件非常相似,但出于某些原因,此处使用的分隔符是 ~。它们不能为空,因为即使在最坏的情况下,它们也会有 headers。
Screenshot of the file contents in notepad++:
文件 1 的输出:
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Unknown Source)
at controller.Test.main(Test.java:24)
文件 2 的输出:
Weltherstellercode~FIN~Fahrzeug_Baumuster~~Motoridentnummer~Getriebe_Identifizierungsnummer~Produktionsdatum~Produktionsnummer_Fzg~Erstzulassungsdatum~Reparaturdatum~Fahrzeug_Laufleistung_in_km~Interne_VEGA_Antragsnummer~TGA~Fehlerort~~Fehlerart~~Reparaturart~~Hauptschadensteil~Reparaturland_(G&K)~~Reparaturbetrieb_(G&K)~~Mitteilungstext~Gutschriftsdatum_(Summe)~Anzahl_Beanstandungen~Gesamtkosten~Lohnkosten~Materialkosten~Summe_DH+NK~Anzahl_Arbeitswerte_(Gutgeschrieben)
String line ="";
BufferedReader br = new BufferedReader(new FileReader("path"));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
我更改了以前的代码以使用缓冲的 reader,因为
BufferedReader has significantly larger buffer memory than Scanner. Use BufferedReader if you want to get long strings from a stream, and use Scanner if you want to parse specific type of token from a stream
来自另一个 post 的以下答案有效。
scan = new Scanner(file,"UTF-8");
我不得不提到扫描器的编码。
感谢所有试图帮助我的人。特别感谢@Abhisheik 和@Priyamal。