2011-09-19 3 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와 BufferedReader의 모든 입력을 받아 수정 된/추가 된 데이터와 함께 임시 파일로 출력하는 BufferedWriter가 필요합니다.

완료되면 (BufferedReader 및 BufferedWriter 스트림이 모두 닫힌 경우) 원래 파일을 삭제하거나 임시 파일의 이름을 원래 파일 이름으로 바꿔야합니다.

기본적으로 원본 파일을 임시 파일로 복사하고 임시 파일의 출력에서 ​​해당 줄을 수정 한 다음 원래 파일에 임시 파일을 복사하거나 이름을 바꿉니다. 확인

+0

아니요, 열려 있습니다. 디버깅 중에 볼 수 있습니다. 그러나 큰 파일을 사용할 수 있기 때문에 나는 그것을 전부 읽고 메모리에 보관할 수는 없습니다. 내 문제는 여전히 두 BufferedReaders의 동기화 된 읽기에 있습니다. 나는 그것이 같은 라인이라고 생각되는 것에 대해 다른 결과를 보았습니다. – atzu

+0

두 개의 BufferedReader가 필요한 이유 (1) 또는 (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 문자 만있는 경우 하위 문자열은 arrayIndexOutOfBoundsException을 발생시킵니다. 따라서 런타임 예외가 없을 때 길이가 3이고 다음 줄에 2 문자가있는 문자열이있는 equals 메서드를 호출하고 있습니다.

블록을 실행하면이 문제가 발생합니까?

+0

맞습니다. (0,2) 편집하는 동안 잘못되었습니다. – atzu

관련 문제