希望我的解释对我来说是公正的。我对java还是个新手。我有一个像这样的文本文件
Java
The Java Tutorials
http://docs.oracle.com/javase/tutorial/
Python
Tutorialspoint Java tutorials
http://www.tutorialspoint.com/python/
Perl
Tutorialspoint Perl tutorials
http://www.tutorialspoint.com/perl/
我有语言名称,网站描述和网站url属性。现在,我只想准确地列出文本文件中的信息,但是我需要为它们分配这些属性。
我得到的问题是"索引1超出长度1的范围">
try {
BufferedReader in = new BufferedReader(new FileReader("Tutorials.txt"));
while (in.readLine() != null) {
TutorialWebsite tw = new TutorialWebsite();
str = in.readLine();
String[] fields = str.split("\r?\n");
tw.setProgramLanguage(fields[0]);
tw.setWebDescription(fields[1]);
tw.setWebURL(fields[2]);
System.out.println(tw);
}
} catch (IOException e) {
e.printStackTrace();
}
我想测试一些东西,所以我删除了新的行,并把逗号代替,使它str.split(",")打印出来只是很好,但我确信我会得到点,如果我改变格式。
readline
返回一个包含行内容的字符串,不包括任何行终止字符,那么为什么您要尝试在"\r?\n"
上拆分每行呢?
str
在哪里声明?为什么每次循环迭代都要读两行,而忽略第一行?
建议从
开始String str;
while ((str = in.readLine()) != null) {
System.out.println(str);
}
并从那里开始工作。
第一个readline
获得语言,第二个获得描述,第三个获得url,然后重复模式。没有什么可以阻止您在每次while循环迭代时使用readline
三次。
你可以像这样用字符串读取所有的文件
// try with resources, to make sure BufferedReader is closed safely
try (BufferedReader in = new BufferedReader(new FileReader("Tutorials.txt"))) {
//str will hold all the file contents
StringBuilder str = new StringBuilder();
String line;
while ((line = in.readLine()) != null) {
str.append(line);
str.append("n");
} catch (IOException e) {
e.printStackTrace();
}
之后你可以用
分割字符串String[] fields = str.toString().split("[\n\r]+");
为什么不试试呢
- 分配一个List来保存
TutorialWebsite
实例 - 使用try with resources打开文件,读取行,并修剪空白。
- 将行放入数组
- 然后遍历数组,填充类实例
- 打印列表
循环确保数组长度是nFields
的倍数,丢弃任何余数。因此,如果总行不能被nFields
整除,则不会读取文件的其余部分。如果添加了额外的字段,您仍然需要调整设置。
int nFields = 3;
List<TutorialWebsite> list = new ArrayList<>();
try (BufferedReader in = new BufferedReader(new FileReader("tutorials.txt"))) {
String[] lines = in.lines().map(String::trim).toArray(String[]::new);
for (int i = 0; i < (lines.length/nFields)*nFields; i+=nFields) {
TutorialWebsite tw = new TutorialWebsite();
tw.setProgramLanguage(lines[i]);
tw.setWebDescription(lines[i+1]);
tw.setWebURL(lines[i+2]);
list.add(tw);
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
list.forEach(System.out::println);
一种改进方法是使用构造函数,并在创建每个实例时将字符串传递给构造函数。
并且记住指定的文件名是相对于程序运行的目录的。