我想从仅包含数字的txt文件中读取。这样的文件位于UTF-8中,数字仅由换行符(无空格或其他任何东西)分隔。每当我调用Integer.valueOf(myString)时,我都会收到异常。
这个异常真的很奇怪,因为如果我创建一个预定义的字符串,例如“ 56 \ n”,并使用.trim(),它会完美地工作。但是在我的代码中,不仅不是这种情况,而且异常文本指出,它无法转换的是“ 54856”。我尝试在此处引入新的一行,然后错误文本说它无法转换“ 54856 ” 毫无疑问,我想念什么?
File ficheroEntrada = new File("C:\\in.txt");
FileReader entrada =new FileReader(ficheroEntrada);
BufferedReader input = new BufferedReader(entrada);
String s = input.readLine();
System.out.println(s);
Integer in;
in = Integer.valueOf(s.trim());
System.out.println(in);
异常文本如下:
Exception in thread "main" java.lang.NumberFormatException: For input string: "54856"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
at java.base/java.lang.Integer.parseInt(Integer.java:658)
at java.base/java.lang.Integer.valueOf(Integer.java:989)
at Quicksort.main(Quicksort.java:170)
in.txt文件包含:
54856
896
54
53
2
5634
答案 0 :(得分:2)
好吧,显然它与Windows以及它所使用的\ r有关...我只是尝试在Linux VM上执行它,并且它起作用了。感谢所有回答的人!
答案 1 :(得分:1)
尝试使用Scanner
类读取文件,该类已使用它的hasNextInt()
方法来识别您正在读取的内容是Integer
。这将帮助您找出导致此问题的字符串/字符
public static void main(String[] args) throws Exception {
File ficheroEntrada = new File(
"C:\\in.txt");
Scanner scan = new Scanner(ficheroEntrada);
while (scan.hasNext()) {
if (scan.hasNextInt()) {
System.out.println("found integer" + scan.nextInt());
} else {
System.out.println("not integer" + scan.next());
}
}
}
答案 2 :(得分:0)
很可能您输入的内容中有一个leading/trailing whitespaces
,例如:
String s = " 5436";
System.out.println(s);
Integer in;
in = Integer.valueOf(s.trim());
System.out.println(in);
在字符串上使用trim()
可以消除它。
UPDATE 2:
如果您的文件包含以下内容:
54856\n
896
54\n
53
2\n
5634
然后使用以下代码:
....your code
FileReader enter = new FileReader(file);
BufferedReader input = new BufferedReader(enter);
String currentLine;
while ((currentLine = input.readLine()) != null) {
Integer in;
//get rid of non-numbers
in = Integer.valueOf(currentLine.replaceAll("\\D+",""));
System.out.println(in);
...your code
答案 3 :(得分:0)
如果要确保字符串的可解析性,可以使用Pattern和Regex。
Pattern intPattern = Pattern.compile("\\-?\\d+");
Matcher matcher = intPattern.matcher(input);
if (matcher.find()) {
int value = Integer.parseInt(matcher.group(0));
// ... do something with the result.
} else {
// ... handle unparsable line.
}
此模式允许任何数字,也可以选择一个负号(不带空格)。除非时间太长,否则应该明确地进行解析。我不知道它是如何处理的,但是您的示例似乎主要包含短整数,因此这无关紧要。