我的计算机中有一个文本文件,我正在阅读我的java程序,我想建立一些标准。这是我的记事本文件:
#Students
#studentId studentkey yearLevel studentName token
358314 432731243 12 Adrian Afg56
358297 432730131 12 Armstrong YUY89
358341 432737489 12 Atkins JK671
#Teachers
#teacherId teacherkey yearLevel teacherName token
358314 432731243 12 Adrian N7ACD
358297 432730131 12 Armstrong EY2C
358341 432737489 12 Atkins F4NGH
使用以下代码从记事本中读取此内容时,我会得到Array超出绑定的异常。在调试时,我得到strLine.length()的“#Students”值。 谁能帮忙解决这个问题?
private static Integer STUDENT_ID_COLUMN = 0;
private static Integer STUDENT_KEY_COLUMN = 1;
private static Integer YEAR_LEVEL_COLUMN = 2;
private static Integer STUDENT_NAME_COLUMN = 3;
private static Integer TOKEN_COLUMN = 4;
public static void main(String[] args) {
ArrayList<String> studentTokens = new ArrayList<String>();
try {
// Open the file that is the first
// command line parameter
FileInputStream fstream = new FileInputStream("test.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;
// Read File Line By Line
while ((strLine = br.readLine()) != null) {
strLine = strLine.trim();
if ((strLine.length()!=0) && (strLine.charAt(0)!='#')) {
String[] students = strLine.split("\\s+");
studentTokens.add(students[TOKEN_COLUMN]);
}
}
for (String s : studentTokens) {
System.out.println(s);
}
// Close the input stream
in.close();
} catch (Exception e) {// Catch exception if any
System.err.println("Error: " + e.getMessage());
}
}
答案 0 :(得分:1)
考虑了charakter-sets,也许该文件被认为是Unicode,但是你要求ASCII?你可以在这里改变:
BufferedReader br = new BufferedReader(new InputStreamReader(in, charakterset));
答案 1 :(得分:1)
您似乎面临着一些编码问题。以相同的格式保存并读取文件。优选使用UTF-8。使用构造函数new FileInputStream(<fileDir>, "UTF8")
进行阅读
How to save a file in unicode
答案 2 :(得分:1)
您的文件编码可能与您正在阅读的内容不同。
要么找出文件的编码或将其转换为UTF8
,那么在您的代码中使用下面的编码将其读入。
此外,您应该将strLine.charAt(0)!='#'
更改为!strLine.contains("#")
,除非保证它是第一个字符,并且可能出现在其他字段之一
对于你捕获的任何例外情况,调用printStackTrace()
也是一个好主意
public static void main(String[] args) {
ArrayList<String> studentTokens = new ArrayList<String>();
try {
// Open the file that is the first
// command line parameter
FileInputStream fstream = new FileInputStream(new File("C:\\Fieldglass\\workspace-Tools\\Tools\\src\\tools\\sanket.txt"));
// ------ See below, added in encoding, you can change this as needed if not using utf8
BufferedReader br = new BufferedReader(new InputStreamReader(fstream, "UTF8"));
String strLine;
// Read File Line By Line
while ((strLine = br.readLine()) != null) {
strLine = strLine.trim();
if ((strLine.length()!=0) && (!strLine.contains("#"))) {
String[] students = strLine.split("\\s+");
studentTokens.add(students[TOKEN_COLUMN]);
}
}
for (String s : studentTokens) {
System.out.println(s);
}
// Close the input stream
fstream.close();
br.close(); // dont forget to close your buffered reader also
} catch (Exception e) {// Catch exception if any
e.printStackTrace();
System.err.println("Error: " + e.getMessage());
}
}
你可以在这里查看Java supported encodings(从1.5开始)
答案 3 :(得分:1)
您提供的信息不准确。
使用以下代码从记事本中读取此内容时,我将获得Array超出限制的异常。
如果代码和输入符合您的要求,我无法看到这是如何实现的。我能看到的唯一可以抛出ArrayIndexOutOfBoundsException
的地方就是这一行:
students[TOKEN_COLUMN]
但是我对你的代码和输入的阅读是到目前为止的每个输入行都有5个字段。拆分时,将为您提供包含5个元素的数组,students[TOKEN_COLUMN]
将起作用。
IMO,无论是程序还是输入都不是您所描述的。 (我的猜测是你的输入行少于5个字段。)
调试时我得到
strLine.length()
的“#Students”值。
令人难以置信的是,这是奇怪的。 strLine.length()
会返回int
。你向我们展示的是一个字符串。
实际上,我对所发生的事情有所了解。如果"  #Students"
是strLine
(不是strLine.length()
!!)的值,那么您在某种程度上设法在文件的开头获得了一些垃圾。当您的代码检查到这一点时,第一个字符将不会为“#”,并且该行似乎有2个字段而不是5.这将导致异常......
我想我知道垃圾来自哪里。它是一个UTF-8字节顺序标记,由NotePad插入到文件的开头...因为您将文件保存为UTF-8。然后使用CP1252将文件读取 ...这是(我推测)您系统的默认字符集。
课程:不要使用记事本。使用真实的编辑器。
参考:https://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding