【问题标题】:assigning properties to strings in text file将属性分配给文本文件中的字符串
【发布时间】:2021-10-21 21:33:09
【问题描述】:

希望我的解释能给我一些公正。我对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(",") 打印出来就好了,但我确定我会得到分数我改变了格式.

【问题讨论】:

  • 注意:使用in.readLine() 会读取一行文本,所以当您使用while (in.readLine() != null) 时,您实际上是在读取一行,但对它什么也没做……这是预期的行为吗?

标签: java regex


【解决方案1】:

readline 返回一个“包含行内容的字符串,不包括任何行终止字符”,那么为什么要在"\\r?\\n" 上拆分每一行?

str 在哪里声明?为什么每次循环迭代都读取两行,而忽略第一行?

我建议你从

String str;
while ((str = in.readLine()) != null) {
    System.out.println(str);
}

然后从那里开始工作。

第一个readline 获取语言,第二个获取描述,第三个获取url,然后模式重复。对于 while 循环的每次迭代,没有什么可以阻止您使用 readline 三次。

【讨论】:

  • 我已经声明了它,这就是我开始的地方。不,我只是在这个特定的部分上迷失了。我用扫描仪尝试了它,但注释掉了字段 [1] 和 [2],但输出是“Java null null The Java Tutorials null null”等等......而不是只显示语言名称。我相信有一个非常简单的解决方案
  • @angyeet 不需要使用split。为什么不只是例如tw.setProgramLanguage(str);?
【解决方案2】:

你可以像这样读取字符串中的所有文件

// 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]+");

【讨论】:

    【解决方案3】:

    为什么不这样尝试呢。

    • 分配一个列表来保存TutorialWebsite 实例。
    • 对资源使用 try 来打开文件、读取行并修剪任何空白。
    • 将行放入数组中
    • 然后遍历数组,填充类实例
    • 打印列表。

    循环确保数组长度是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);
    
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-20
      • 2013-07-15
      • 1970-01-01
      • 2021-07-22
      • 2011-09-23
      • 2015-09-15
      • 1970-01-01
      • 2022-11-16
      相关资源
      最近更新 更多