【问题标题】:Java: adding to a string array in a while loop using a file readerJava:使用文件阅读器在while循环中添加到字符串数组
【发布时间】:2012-06-10 01:51:16
【问题描述】:

我一直在制作一个小程序,该程序需要读取可能会发生变化并且需要随时调用的高尔夫球场列表。这是代码:

    public class Courses {
public String[] courselist;
public void loadCourses() throws IOException{
    int count = 0;
    int counter = 0;
    File f = new File("src//courses//courses.txt");
    BufferedReader reader = new BufferedReader(new FileReader(f));
    while(count<1){
        String s = reader.readLine();
        if(s.equalsIgnoreCase("*stop*")){
            reader.close();
            count = 5;

        }else{
            courselist[counter] = s;
            counter++;
        }
        s = "";
    }
}

}

现在这就是 txt 文件中的内容。

    RiverChase 
    Steward Peninsula 
    Lake Park 
    Coyote Ridge 
    *stop* 

现在,当我开始运行程序时,因为我立即调用该方法,它给了我一个抛出异常,这是因为数组。我需要留下来排列,因为我在 JComboBox 中使用它。如果你能帮助或解决问题。很可能我只是做错了,我是菜鸟。只是帮忙。提前致谢。 我知道所有文件阅读器和东西都能正常工作,因为它可以正确打印到系统,我只需要帮助将它重复写入数组。

【问题讨论】:

  • 您的基本问题是 Java 中的数组不是动态大小的。以下问题中有很多很好的信息:java dynamic array sizes?
  • 您必须先检查 readLine() 的结果是否为 null,然后再对它执行任何其他操作。如果为null,则为EOF:关闭文件。

标签: java arrays loops arraylist while-loop


【解决方案1】:

这里有一些例子,没有使用*stop*

public class ReadFile {

    public static void main(String[] args) {
        BufferedReader reader = null;
        List<String> coursesList = new ArrayList<>();
        String[] courses;

        try {
            File file = new File("courses.txt");
            reader = new BufferedReader(new FileReader(file));
            String readLine;

            do {
                readLine = reader.readLine();
                if(readLine == null)
                    break;

                coursesList.add(readLine);
            } while (true);
        } catch (IOException ex) {
            Logger.getLogger(ReadFile.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                reader.close();
            } catch (IOException ex) {
                Logger.getLogger(ReadFile.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        courses = coursesList.toArray(new String[coursesList.size()]);

        for(int i = 0; i < courses.length; i++) {
            System.out.println(courses[i]);
        }
    }
}

【讨论】:

    【解决方案2】:

    更改您的代码以在loadCourses() 期间分配一个新数组,并将对loadCourses() 的调用添加到您的构造函数:

    public class Courses {
        public String[] courselist;
    
        public Courses() throws IOException {  // <-- Added constructor
            loadCourses();                     // <-- Added call to loadCourses
        }
    
        public void loadCourses() throws IOException {
            int count = 0;
            int counter = 0;
            File f = new File("src//courses//courses.txt");
            BufferedReader reader = new BufferedReader(new FileReader(f));
            List<String> courses = new ArrayList<String>(); // <-- A List can grow 
            while(true){
                String s = reader.readLine();
                if (s.equalsIgnoreCase("*stop*")){
                    break;
                }
                courses.add(s);
            }
            courseList = courses.toArray(new String[0]); // <-- assign it here
        }
    }
    

    这可以确保当您创建一个实例时,它会从初始化数组开始。您不仅不会得到错误,而且数据将始终正确(与其他简单地创建空(即无用)数组的答案不同。

    请注意,此代码适用于文件中任意数量的课程名称(不仅仅是 5 个)。

    【讨论】:

      【解决方案3】:

      您最好创建一个更易于操作的 List,并在流程结束时将其转换为数组:

          List<String> list = new ArrayList<String>();
          String [] array = list.toArray(new String [] {});
      

      这是使用 List 加载的可能实现:

      public static String [] loadCourses() throws IOException {
          File f = new File("src//courses.txt");
          BufferedReader reader = new BufferedReader(new FileReader(f));
          List<String> courses = new ArrayList<String>();
          while (true){
              String s = reader.readLine();
              if (s == null || s.trim().equalsIgnoreCase("*stop*")){
                  break;
              } else{
                  courses.add(s);
              }
          }
          return courses.toArray(new String [] {});
      }
      

      为什么还要使用 stop 关键字?当您到达文件末尾时(当 s 为空时),您可以简单地停止该过程。

      【讨论】:

      • 感谢您的帮助,但现在我无法弄清楚如何将其应用于 JComboBox。请回复
      • 在您创建组合框的位置调用此代码。示例:String [] values = loadCourses(); JComboBox combo = new JComboBox(values);
      • OHHHHHH 我应该知道的,非常感谢。我将在整个项目的其余部分中使用这些知识
      • 好的,这很令人尴尬,但它不是固定的,我试图这样做 public String[] = loadCourses();在课程中,它给了我一个错误。然后我尝试使用 jcombobox 将它加载到类中,它不会加载任何内容。这次我做了什么
      • 除非我看到更多您的代码,否则无法告诉您。你把方法签名改成public static String []了吗?
      【解决方案4】:

      你应该在使用之前初始化你的数组

      public static final MAX_SIZE = 100;
      public String[] courselist = new String[MAX_SIZE];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        • 2012-04-15
        • 1970-01-01
        • 2018-04-17
        • 1970-01-01
        • 2014-06-05
        相关资源
        最近更新 更多