1

つまり、基本的には、一連の行を含むテキスト ファイルを読んでいます。テキスト ファイルから特定の行を抽出し、それらの特定の行を文字列配列に追加する必要があります。各改行を「\n」、「\r」で分割しようとしています。これはうまくいきませんでした。私もこのエラーを受け取り続けます:

スレッド「メイン」での例外 java.lang.ArrayIndexOutOfBoundsException: 1 at 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");
    }
4

6 に答える 6

3

readLine()メソッドは入力から行全体を読み取りますが、そこからnewLine 文字を削除します。行を\n文字で分割すると、文字列内に行が見つかりません。したがって、例外が発生します。

より明確にするために、このリンクの回答を参照してください。

于 2013-04-19T18:46:10.953 に答える
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[] linesFile1 つの要素で を作成しています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
}
于 2013-04-19T18:44:25.897 に答える
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
}
于 2013-04-19T18:46:52.557 に答える
0

String 配列を 1 つの要素、つまり line で初期化しています。したがって、linesFile[0] は行であり、残りの配列は範囲外です。

于 2013-04-19T18:44:35.143 に答える
0

文字列を格納するために配列を使用しています。ArrayListArrayList が動的に成長しているため、代わりに Java から使用します。読み取り操作が完了したら、それを配列に変換します。

    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);
于 2013-04-19T18:50:27.277 に答える
0

ここでの問題はString、パーサーが新しい行を読み取るたびに新しい配列を作成していることです。String次に、その配列の最初の要素のみに、line読み込まれている を入力します。

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

String[]ループが最初から実行されるたびに 1 つの要素で新しいを作成するためwhile、前の反復から格納された値が失われます。

new String[];解決策は、while ループに入る直前に使用することです。の使い方がわからない場合は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++;
}

この時点で、ファイルの i 番目の行にアクセスするために使用できるlinesFileように、ファイルの行が正しく入力されている必要があります。linesFile[i]

于 2013-04-19T18:54:20.450 に答える