2011-10-29 5 views
3

나는 초보자입니다. 나는 두 개의 파일을 읽은 다음 그 (것)들의 조합을 얻기 위해 노력하고파일에서 읽기 및 자바 파일에 쓰기

:

내 접근 방식입니다. 나는 file1에서 모든 레코드를 읽어

먼저 (., 한 array 허용 arrayList 또는 다른 구조가 허용되지 않습니다 또는 라인으로 라인을 읽기, 쓰기)의 크기 (100)와 배열을 사용하고, 그리고에 기록한다 출력, 세 번째 파일. 이를 위해 한 번에 100 개의 레코드를 읽고 반복을 사용하여 세 번째 파일에 기록합니다.

그 다음에는 첫 번째 파일과 마찬가지로 두 번째 파일을 한 번에 100 개의 레코드로 읽은 다음 memory[]에 씁니다. 그런 다음 File2에서 읽은 레코드가 File1에 없으면 출력 파일에 기록합니다. 나는 reader2.readLine()null이 될 때까지이 작업을 수행하고 각 반복마다 file1을 다시 엽니 다.

이것은 내가 지금까지해온 것입니다. 거의 완료되었습니다. 어떤 도움을 주시면 감사하겠습니다.

편집 : 이제는 예외가 없지만 다른 레코드를 찾을 수 없으며 쓸 수 없습니다. 루프와 부울이 마지막으로 작동하지 않는다고 생각하는 이유는 무엇입니까? 정말 도움이 필요해. 양해 해 주셔서 감사합니다.

import java.io.*; 

public class FileUnion 
{ 
private static long startTime, endTime; 

public static void main(String[] args) throws IOException 
{ 
    System.out.println("PROCESSING..."); 
    reset(); 
    startTimer(); 

    String[] memory = new String[100]; 
    int memorySize = memory.length; 

    File file1 = new File("stdlist1.txt"); 
    BufferedReader reader1 = new BufferedReader(new FileReader(file1)); 

    File file3 = new File("union.txt"); 
    BufferedWriter writer = new BufferedWriter(new FileWriter(file3)); 

    int numberOfLinesFile1 = 0; 
    String line1 = null; 
    String line11 = null; 


    while((line1 = reader1.readLine()) != null) 
    { 
     for (int i = 0; i < memorySize;) 
     { 
      memory[i] = line1; 
      i++; 

      if(i < memorySize) 
      { 
       line1 = reader1.readLine(); 
      } 
     } 

     for (int i = 0; i < memorySize; i++) 
     { 
      writer.write(memory[i]); 
      writer.newLine(); 
      numberOfLinesFile1++; 
     } 
    } 

    reader1.close(); 

    File file2 = new File("stdlist2.txt"); 
    BufferedReader reader2 = new BufferedReader(new FileReader(file2)); 

    String line2 = null; 
    while((line2 = reader2.readLine()) != null) 
    { 
     for (int i = 0; i < memorySize;) 
     { 
      memory[i] = line2; 
      i++; 

      if(i < memorySize) 
      { 
       line2 = reader2.readLine(); 
      } 
     } 

     for (int k = 0; k < memorySize; k++) 
     { 
      boolean found = false; 
      File f1 = new File("stdlist1.txt"); 
      BufferedReader buff1 = new BufferedReader(new FileReader(f1)); 

      for (int m = 0; m < numberOfLinesFile1; m++) 
      { 
       line11 = buff1.readLine(); 

       if (line11.equals(memory[k]) && found == false); 
       { 
        found = true; 
       } 

      } 
      buff1.close(); 

      if (found == false) 
      { 
       writer.write(memory[k]); 
       writer.newLine(); 
      } 


     }  
    } 

    reader2.close(); 
    writer.close(); 

    endTimer(); 
    long time = duration(); 
    System.out.println("PROCESS COMPLETED SUCCESSFULLY"); 
    System.out.println("Duration: " + time + " ms"); 

} 

public static void startTimer() 
{ 
    startTime = System.currentTimeMillis(); 
} 
public static void endTimer() 
{ 
    endTime = System.currentTimeMillis(); 
} 
public static long duration() 
{ 
    return endTime - startTime; 
} 
public static void reset() 
{ 
    startTime = 0; 
    endTime = 0; 
} 
} 
+0

'stdlist1.txt'의 길이가 100 줄보다 짧 으면 어떻게 될까요? 정확히 100 줄의 배수가 아니라면 어떻게 될까요? 'memory'에'String []'대신'ArrayList '을 사용할 수 있습니까? 고정 크기 배열을 사용하는 것보다 훨씬 쉬운 방법입니다. – msandiford

+0

+1 노력을 공유하십시오! – SpeedBirdNine

+0

이것은 숙제 프로젝트로, 100 줄 미만의 입력 파일을 보장하지 않습니다. 또한 100 줄의 배수가 아닌 경우 memory []는 일부 null 값으로 채워집니다. 그러나 나는 그것이 문제가되지 않을 것이라고 생각한다. – beetle

답변

0

EDIT! 다시 하다.

좋아, 그래서 한 번에 100 줄을 사용하여 null을 확인해야합니다. 그렇지 않으면 파일에 null을 쓰려고하면 오류가 발생할 수 있습니다.

파일이 한 번 끝에 있는지 확인한 다음 널 (null)을 확인하지 않고 정보를 99 개 더 수집합니다.

무엇이 행이 호출 될 때 경우 :

while((line2 = reader2.readLine()) != null) 

파일에 남아있는 단 1 라인이있다? 그런 다음 메모리 배열에 99 개의 null 인스턴스가 있고 99 번에 null을 파일에 기록하려고합니다. 그것은 최악의 경우입니다.

나는 숙제 도움을 찾는 사람들에게 얼마나 많은 도움을 주어야하는지 잘 모르지만, 대부분의 사이트에서 익숙하지 않은 것은 허용되지 않습니다.

다음은 첫 번째 파일을 작성하는 한 가지 방법의 예입니다.

String line1 = reader1.readLine(); 

boolean end_of_file1 = false; 
while(!end_of_file) 
{ 
    for (int i = 0; i < memorySize) 
    { 
     memory[i] = line1; 
     i++; 

     if(i < memorySize) 
     { 
      if((line1 = reader1.readLine()) == null) 
      { 
       end_of_file1 = true; 
      } 
     } 
    } 

    for (int i = 0; i < memorySize; i++) 
    { 
     if(!memory[i] == null) 
     { 
      writer.write(memory[i]); 
      writer.newLine(); 
      numberOfLinesFile1++; 
     } 
    } 
} 

reader1.close(); 

당신은 쉽게 복사에 대한 검사를 할 그것을 위해 파일을 검사하는 공공 정적 부울을 만들 것을 일단, 당신은 그것을 호출 할 수 있습니다, 그것은 코드 청소기를 만들 것입니다.

public static boolean isUsed(String f1, String item, int dist) 
{ 
    BufferedReader buff1 = new BufferedReader(new FileReader(f1)); 

    for(int i = 0;i<dist;i++) 
    { 
     String line = buff1.readLine() 
     if(line == null){ 
      return false; 
     } 
     if(line.equals(item)) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

그럼! isUsed()

boolean end_of_file2 = false; 
memory = new String[memorySize];// Reset the memory, erase old data from file1 
int numberOfLinesFile2=0; 
String line2 = reader2.readLine(); 
while(!end_of_file2) 
{ 
    for (int i = 0; i < memorySize;) 
    { 
     memory[i] = line2; 
     i++; 

     if(i < memorySize) 
     { 
      if((line2 = reader2.readLine()) == null) 
      { 
       end_of_file2 = true; 
      } 
     } 
    } 

    for (int i = 0; i < memorySize; i++) 
    { 
     if(!memory[i] == null) 
     { 
      //Check is current item was used in file 1. 
      if(!isUsed(file1, memory[i], numberOfLinesFile1)){//If not used already 
       writer.write(memory[i]); 
       writer.newLine(); 
       numberOfLinesFile2++; 
      } 
     } 
    } 
} 
reader2.close(); 
writer.close(); 

희망이 도움이 있는지 확인하기 위해 각 라인의 체크를 쓰기 전에, 파일 하나를 작성하는 것과 같은 방법을 사용합니다. 코드를 붙여 넣기 만하면 코드를 이해하지 않고 코드를 복사하여 붙여 넣기 할 가능성이 높아진다는 것을 알았 기 때문에 전체 코드를 제공하지 않습니다. 유용하다고 생각하길 바랍니다.

+0

정말 고마워요! 배열을 사용하는 것은 시간 낭비라는 것을 알고 있지만 프로젝트의 일종이기 때문에 사용해야합니다. 크기가 100 인 배열 만 허용됩니다. 먼저 100 개를 쓴 다음 어레이에서 출력하도록 작성해야합니다. 그래서 고정 크기 여야하기 때문에 줄 단위 읽기 및 쓰기 또는 arrayList를 사용할 수 없습니다. 왜 다른 기록을 제공하지 않는지 이해해야합니다. 나는 모든 것을 시도했지만 루프 및 불리언 문제를 해결할 수는 없습니다. – beetle

+0

일식을 사용합니다. 컴파일도 예외는 아닙니다. 하지만 첫 번째 파일 전체를 씁니다. 조합을 찾을 수 없다는 의미입니다. (File2에서는 레코드 whice를 찾을 수는 있지만 File1에서는 찾을 수 없음). 답변 주셔서 감사합니다. – beetle

+0

확인. 잘. 그런 다음 기존 방법을 사용하십시오. 그러나 이미 사용 된 항목에 대한 확인 속도를 높이려면 모든 항목을 목록에 추가해야합니다. 그런 식으로 두 번째 행마다 첫 번째 파일을 재검색하지 않습니다. 100 줄에 관해서. 그것이 문제의 원인이었습니다. 독자가 null이 될 때까지 읽지 만, statment가 호출되면 파일에 15 줄 밖에 남지 않았다고 가정 해 봅시다. 100 개의 항목을 검색하는 null을 확인하지 않고 루핑을 사용하면 마지막 85 개가 null이됩니다. 그리고 그것이 NullPointerException이있는 곳입니다. 줄 번호가 100의 배수 인 경우에만 작동합니다. –