2013-09-25 3 views
0

Я читаю содержимое Spool.txt и записываю его в текстовый файл из 77 строк на основе кодов первых четырех столбцов.Сброс счетчика LineNumberReader

  • 005 означает запись в строке 5
  • Последующие 1 означает запись в следующей строке
  • 2 означает запись в следующей второй строке
  • 3 означает запись к следующей третьей линии

Проблема заключается в том, что когда я попытался написать строку 37 выходного файла, она продолжается со счетчика последней строки, написанной. Мне нравится писать в Line 37, начиная с начала файла.

Я использую LineNumberReader для отслеживания количества строк, которые я пишу в текстовый файл. Я понимаю, что setLineNumber(int) фактически не изменяет текущую позицию текстового файла. Как сбросить счетчик, чтобы я мог писать в определенную строку с начала файла?

public static void main(String[] args) throws IOException 
{ 
    File f= new File("file1.txt"); 
    FileWriter fw = new FileWriter(f); 

    BufferedWriter bw = new BufferedWriter(fw); 
    LineNumberReader lnr = new LineNumberReader(new FileReader(f)); 

    Scanner sc = new Scanner(new File("Spool.txt")); 
    List<String> lines = new ArrayList<String>(); 

    while (sc.hasNextLine()) 
    { 
     lines.add(sc.nextLine()); 
    } 

    String[] arrLine = lines.toArray(new String[0]); 

    //System.out.println(arrLine[1]); 

    for (int i=0;i<arrLine.length;i++) 
    { 
     String s1=arrLine[i].toString(); 
     String s2= s1.substring(0,4); 

     if (s2.trim().equals("005")) 
     { 
      try 
      { 
       lnr.setLineNumber(4); 
       for(int j=1;j<=lnr.getLineNumber();j++) 
       bw.newLine(); 
       bw.write(arrLine[i]); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      }   
     } 
      else if (s2.trim().equals("1")) 
      { 
       try 
       { 
        lnr.setLineNumber(1); 
        for(int j=1;j<=lnr.getLineNumber();j++)     
         bw.newLine(); 
        bw.write(arrLine[i]); 
       } 
       catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 

      } 
      else if (s2.trim().equals("2")) 
      { 
       try 
       { 
        lnr.setLineNumber(2); 
        for(int j=1;j<=lnr.getLineNumber();j++) 
        bw.newLine(); 
        bw.write(arrLine[i]); 
       } 
       catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 
      } 

      else if (s2.trim().equals("3")) 
      { 
       try 
       { 
        lnr.setLineNumber(3); 
        for(int j=1;j<=lnr.getLineNumber();j++) 
        bw.newLine(); 
        bw.write(arrLine[i]); 
       } 
       catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 

      } // END Else If Loop 

      else if (s2.trim().equals("37")) **//ISSUE STARTS HERE: I'm trying to write to Line 37 counting from the start of the file again. It is writing to Line 37 starting from the previous lines written above** 
      { 
       try 
       { 
        lnr.setLineNumber(37); 
        for(int j=1;j<=lnr.getLineNumber();j++) 
        bw.newLine(); 
        bw.write(arrLine[i]); 
       } 
       catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 

      } // END Else If Loop 

     } 
     bw.close(); 
     lnr.close();     
    } //main 
} //class 

ответ

0

Вам необходимо получить доступ к файлу в режиме произвольного доступа, которому необходимо открыть другие классы. И даже при этом он не позволит вам добавить вставьте, режим произвольного доступа хорошо подходит для замены (и вам нужно контролировать размер каждого элемента).

Лучшей альтернативой является, прежде чем писать в файл, поместить каждую строку в массив с индексом в качестве номера строки. После того, как все строки есть, выполните итерацию массива и упорядочивайте строки.

1

Действительно, вы не можете вставлять текст в текстовый файл. Я бы предложил другой подход. Вы открываете один файл для чтения Spool.txt и еще один файл для записи Spool.txt.write, после чего вы читаете из первого файла, анализируете каждую строку и записываете в другой файл. Закончив все, просто удалите Spool.txt и переименуйте Spool.txt.write в Spool.txt.

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