为文本文件中的字符串分配属性



希望我的解释对我来说是公正的。我对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);

一种改进方法是使用构造函数,并在创建每个实例时将字符串传递给构造函数。

并且记住指定的文件名是相对于程序运行的目录的。

最新更新