2013-04-19 3 views
0

Итак, в основном я читаю текстовый файл с кучей строк. Мне нужно извлечь определенные строки из текстового файла и добавить эти конкретные строки в массив строк. Я пытаюсь разделить каждую новую строку с помощью: «\ n», «\ r». Это не сработало. Я получаю эту ошибку, а также:Прочитайте текстовый файл и разделите каждую новую строку на массив строк

Исключение в потоке "главный" 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"); 
    } 
+0

Где вы раскалываете линию ..? – Pragnani

+0

У меня было это раньше: String [] linesFile = line.split ("\ n"); – oxxi

+1

После того, как вы сделали BufferedReader.readLine(), вы прочли строку. Что вы тогда пытаетесь сделать? Разделить его на слова? –

ответ

2
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 
} 
+0

Хорошо, теперь я понимаю, почему я получил ошибку. Итак, что было бы лучшим способом разделить или добавить каждую строку текстового файла в массив строк? – oxxi

+0

@oxxi Поскольку вы читаете каждую строку, просто добавьте строку, которую вы читаете, в массив. Однако, поскольку вы не знаете, сколько строк у вас может быть, лучше использовать 'LinkedList ' для добавления строк. Посмотрите на редактирование. –

+0

ok 'LinkedList <>' работал для меня. Я смог реализовать и получить доступ к тексту в строках, которые мне нужны. Просто он будет работать с обычным строковым массивом. Спасибо за помощь. – oxxi

0

Вы инициализируете массив строк с помощью 1 элемента, а именно строки. linesFile [0] - это строка, а остальная часть вашего массива выходит за пределы.

3

readLine() метод считывает целую строку с ввода, но удаляет из нее символы новой строки. Когда вы разделите строку на символ \n, вы не найдете ее в строке. Следовательно, вы получаете исключение.

Пожалуйста, обратитесь ответ в этом link for more clarity.

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 
} 
+0

может быть "\ n" "SPLIT-CHAR-HERE". Я нахожусь на mac, между прочим, так это будет «\ r»? – oxxi

0

Вы используете массив для хранения строк. Вместо этого используйте ArrayList из Java, поскольку 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); 
1

Проблема здесь в том, что вы создаете новый String массив каждый раз, когда ваш анализатор читает в новой строке. Затем заполнить только самый первый элемент в этом String массиве с line, который читается с использованием:

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

Поскольку вы создаете новый String[] с одним элементом каждый раз, когда ваш while цикл проходит от верхней части, вы потерять значения, сохраненные в предыдущей итерации.

Решение заключается в использовании new String[]; перед входом в цикл while. Если вы не знаете, как использовать ArrayList, то я предлагаю время цикла, как это:

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

Это позволит избежать использования динамически изменять размер ArrayList, потому что вы знаете, сколько строк ваш файл содержит от выше время петля.Тогда вы бы держать дополнительный счетчик (или resuse 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-й строке в файле.

+0

Итак, мне нужны 2 петли? – oxxi

+0

Первый цикл 'while' предназначен только для подсчета количества строк в файле. Если вы знаете это заранее, тогда это не обязательно. Кроме того, вы можете избежать первого цикла while, используя 'ArrayList ' вместо' String [] ', но компромисс заключается в том, что для этого требуется больше памяти. – huu

+0

Я вижу, как он может работать, но я не мог понять, как правильно реализовать свой код с моим. – oxxi

Смежные вопросы