2013-09-25 35 views
0

我正在讀取Spool.txt的內容,並根據前四列的代碼將其寫入77行文本文件。重置LineNumberReader的計數器

  • 005意味着寫入到第5個
  • 隨後1個裝置寫入到下一行
  • 2裝置寫入到下一個第二線
  • 3裝置寫入到下一個第三線

問題是當我試圖寫入輸出文件的第37行時,它從寫入的最後一行的計數器繼續。我喜歡從文件的開頭開始寫入第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即可。