2011-09-19 141 views
1

我正在处理一个程序,该程序需要更新一行取决于读取行后结果的值。我认为我可以在Java中使用两个BufferedReader来将读取器放在更新的行上,而另一个则用于修复该值的行(它可能是未知行数)。这里的问题是,我在同一个文件上使用了两个BufferedReader,即使我认为我正在处理索引,调试的结果似乎也不可靠。 代码如下:使用多个BufferedReader读取单个文件

  String outFinal 
      FileName=fileOut; 

     File fileDest=new File(outFinalFileName); 
     try { 
      fout = new BufferedWriter(
        new OutputStreamWriter(
          new FileOutputStream(fileDest))); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 

     FileReader inputFile=null; 

     try { 
      inputFile = new FileReader(inFileName); 
     } catch (FileNotFoundException e2) { 
      e2.printStackTrace(); 
     } 
     BufferedReader fin = new BufferedReader(inputFile); 

     BufferedReader finChecker = new BufferedReader(inputFile); //Checks the file and matches record to change 
     String line=""; 
     String lineC=""; 
     int lineNumber=0; 
     String recordType=""; 
     String statusCode=""; 
     try { 
      while ((lineC = finChecker.readLine()) != null) { 
       lineNumber++; 
       if (lineNumber==1) 
        line=fin.readLine(); 
       recordType=lineC.substring(0,3);//Gets current Record Type 
       if (recordType.equals("35")){ 
        while(!line.equals(lineC)){ 
         line=fin.readLine(); 
         if (line==null) 
          break; 
         fout.write(line); 


        } 
       }else if (recordType.equals("32")){ 
        statusCode=lineC.substring(4,7); 
        if(statusCode.equals("XX")){ 
         updateRecordLine(line,fout); 
        } 
       } 


      } 
      returnVal=true; 

     } catch (IOException e) { 
      e.printStackTrace(); 

     } 

在此先感谢。

回答

2

那么,BufferedReader只能读取东西,它没有能力写回数据。所以,你需要的是一个BufferedReader来获取内容,还有一个BufferedWriter从BufferedReader获取所有输入,并将其输出到临时文件中,并带有更正/附加的数据。

然后,当您完成后(即BufferedReader和BufferedWriter流都关闭),您需要放弃原始文件或将临时文件重命名为原始文件的名称。

基本上,您将原始文件复制到临时文件,在临时文件的输出中修改问题行,然后将临时文件复制/重命名为原始文件。

+0

不,它们是开放的,我可以在调试时看到。但是,我无法全部阅读并将其保存在内存中,因为这可能会使用大型文件。我的问题仍然是同步读取两个BufferedReaders。我看到它应该是同一行的不同结果。 – atzu

+0

我不明白(1)为什么你需要两个BufferedReader,或者(2)为什么你不只是在阅读时将文件输出到临时文件(这意味着你不必保留整个文件文件在内存中,只是文件中的当前行 – jefflunt

+1

因此,如果您正在读取文件,并且遇到需要更改其值的行,则根据行后的内容添加该行一个数组或其他东西,将其标记为“需要更改”,然后(使用相同的BufferedReader)读取下一行,计算更改并将更改的行写入临时文件,如果我正确理解问题,应该只需要一个BufferedReader,一个临时存储你将要更改的行,以及一个BufferedWriter,你能够做到这一点。你可以发布数据摘录,以便我们得到一个你正在制作什么样的数据变化的例子吗? – jefflunt

0

好了,我看到了一些问题,在您的代码完全在这些线路上 - >

recordType=lineC.substring(0,3);//Gets current Record Type     
if (recordType.equals("35")){ 

如果你看到在第一行,你得到RECORDTYPE的子成RECORDTYPE。现在recordType的长度是3.如果所有的recordType只有2个字符,则substring会抛出arrayIndexOutOfBoundsException。因此,如果没有运行时异常,其长度为3,并且在下一行中调用包含2个字符的字符串的equals方法。

这个if block是否会运行?

+0

对,是(0,2)编辑时出错了。 – atzu

相关问题