读取文本文件并将每个换行符拆分为字符串数组

时间:2013-04-19 18:39:01

标签: java arrays string readline

所以基本上我正在读一个有很多行的文本文件。我需要从文本文件中提取某些行,并将这些特定行添加到字符串数组中。我一直试图将每个newLine拆分为:“\ 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");
    }

6 个答案:

答案 0 :(得分:3)

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];

您正在使用一个元素String[] linesFile创建line,但之后尝试访问索引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
}

答案 1 :(得分:3)

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

请参阅此link for more clarity.

中的答案

答案 2 :(得分:0)

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

答案 3 :(得分:0)

试试这个:

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
}

答案 4 :(得分:0)

您正在使用数组来存储字符串。而是使用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);

答案 5 :(得分:0)

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

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

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

解决方案是在进入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行。