【问题标题】:Read text file and split each newline into a string array读取文本文件并将每个换行符拆分为字符串数组
【发布时间】:2013-04-19 18:39:01
【问题描述】:

所以基本上我正在阅读一个包含一堆行的文本文件。我需要从文本文件中提取某些行并将这些特定行添加到字符串数组中。我一直在尝试将每个新行拆分为:“\n”、“\r”。这没有用。我也不断收到此错误:

线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 1 在 A19010.main(A19010.java:47)

代码如下:

Path objPath = Paths.get("dirsize.txt");
    if (Files.exists(objPath)){

     File objFile = objPath.toFile();
     try(BufferedReader in = new BufferedReader(
                             new FileReader(objFile))){
          String line = in.readLine();

           while(line != null){

            String[] linesFile = line.split("\n");
            String line0 = linesFile[0];
            String line1 = linesFile[1];
            String line2 = linesFile[2];



            System.out.println(line0 + "" + line1);
            line = in.readLine();
           }

        }
         catch(IOException e){

             System.out.println(e);
         }

    }
    else
    {
      System.out.println(
              objPath.toAbsolutePath() + " doesn't exist");
    }

【问题讨论】:

  • 你在哪里分割线..?
  • 我之前有这个:String[] linesFile = line.split("\n");
  • 完成 BufferedReader.readLine() 后,您已阅读该行。那你想做什么?拆分成单词?
  • 我想拆分文件中的每个换行符并将其添加到字符串数组中,以便稍后从行中提取某些部分。

标签: java arrays string readline


【解决方案1】:
String[] linesFile = new String[] {line}; // this array is initialized with a single element
String line0 = linesFile[0]; // fine
String line1 = linesFile[1]; // not fine, the array has size 1, so no element at second index
String line2 = linesFile[2];

您正在创建一个带有一个元素 lineString[] linesFile,但随后尝试访问索引 1 和 2 处的元素。这将为您提供一个 ArrayIndexOutOfBoundsException

您实际上并没有在此处拆分任何内容。 in.readLine();,正如方法所说,从文件中读取整行。

编辑:您可以将行(字符串)动态添加到列表而不是数组,因为您不知道大小。

List<String> lines = new LinkedList<String>(); // create a new list
String line = in.readLine(); // read a line at a time
while(line != null){ // loop till you have no more lines
    lines.add(line) // add the line to your list
    line = in.readLine(); // try to read another line
}

【讨论】:

  • 好的,我现在明白为什么会出现错误。那么将文本文件的每一行拆分或添加到字符串数组的最佳方法是什么?
  • @oxxi 由于您正在阅读每一行,只需将您阅读的line 添加到数组中。但是,由于您不知道可能有多少行,最好使用LinkedList&lt;String&gt; 来添加这些行。看看编辑。
  • 好的 LinkedList&lt;&gt; 为我工作。我能够实现和访问我想要的行中的文本。尽管它可以与普通的字符串数组一起使用。感谢您的帮助。
  • @oxxi 字符串数组(或任何数组)的问题在于,一旦你初始化了它,你就不能调整它的大小。如果您意识到需要更多空间,则必须创建一个更大的新数组,复制所有元素并使用新的。
【解决方案2】:

readLine() 方法从输入中读取整行,但从中删除新行字符。当您在\n 字符上拆分行时,您将在字符串中找不到一个。因此,你得到了例外。

请参考link for more clarity.中的答案

【讨论】:

    【解决方案3】:

    您正在使用 1 个元素(即行)初始化您的字符串数组。因此linesFile[0] 是行,而数组的其余部分超出了范围。

    【讨论】:

      【解决方案4】:

      试试这个:

      String[] linesFile = line.split("SPLIT-CHAR-HERE");
      if(linesFile.length >= 3)
      {
                  String line0 = linesFile[0];
                  String line1 = linesFile[1];
                  String line2 = linesFile[2];
      // further logic here
      }else
      {
      //handle invalid lines here
      }
      

      【讨论】:

      • “SPLIT-CHAR-HERE”可以是“\n”。顺便说一句,我在 Mac 上,所以它会是“\r”吗?
      【解决方案5】:

      您正在使用数组来存储字符串。而是使用 Java 中的ArrayList,因为 ArrayList 是动态增长的。在您的读取操作完成后将其转换为数组。

          String line = in.readLine();
            ArrayList<String> str_list = new ArrayList<String>();
            String[] strArr = new String[str_list.size()];
      
                 while(line != null){
                   str_list.add(line);  
                   line = in.readLine();
                 }
          // at the end of the operation convert Arraylist to array
      return   str_list.toArray(strArr);
      

      【讨论】:

        【解决方案6】:

        这里的问题是,每次解析器读取新行时,您都会创建一个新的 String 数组。然后,您只使用正在读入的line 填充该String 数组中的第一个元素:

        String[] linesFile = new String[] {line};
        

        由于每次您的 while 循环从顶部运行时,您都会使用一个元素创建一个新的 String[],因此您会丢失它在上一次迭代中存储的值。

        解决方案是在进入 while 循环之前使用new String[];。如果您不知道如何使用ArrayList,那么我建议您使用这样的while循环:

        int numberOfLine = 0;
        while (in.readLine() != null)
        {
            numberOfLine++;
        }
        String linesFile = new String[numberOfLine];
        

        这将使您避免使用动态调整大小的ArrayList,因为您可以从上述 while 循环中知道文件包含多少行。然后你会保留一个额外的计数器(或重新使用numberOfLine,因为我们不再使用它了),以便你可以填充这个数组:

        numberOfLine = 0;
        in = new BufferedReader(new FileReader(objFile)); // reset the buffer
        while ((String line = in.readLine()) != null)
        {
            linesFile[numberOfLine] = line;
            numberOfLine++;
        }
        

        此时linesFile 应正确填充文件中的行,这样linesFile[i] 可用于访问文件中的第i 行。

        【讨论】:

        • 那么,我需要 2 个 while 循环吗?
        • 第一个while循环纯粹是为了统计文件的行数。如果您事先知道这一点,则没有必要。此外,您可以通过使用ArrayList&lt;String&gt; 而不是String[] 来避免第一个while 循环,但代价是这需要更多内存。
        • 我可以看到它是如何工作的,但我无法弄清楚如何用我的代码正确实现您的代码。
        猜你喜欢
        • 1970-01-01
        • 2022-11-15
        • 1970-01-01
        • 2016-04-30
        • 2017-02-02
        • 2012-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多