2012-09-10 3 views
1

파일을 다시 열려고합니다. 입력 스트림에 파일이 있습니다. 스캐너를 사용하고 BufferedReader를 사용해 보았습니다. 그러나 close() 메소드를 사용하여 파일을 닫은 후에 파일을 다시 열 수 없습니다. 파일을 다시 여는 방법을 도와주세요. 나는 아래의 코드를 작성했습니다 :입력 스트림에서 파일을 다시 여는 방법

InputStream filename = getAttachstream(); 

     int rows =0 ; 

     BufferedReader br= new BufferedReader(new InputStreamReader(filename)); 
     String strLine = ""; 
      try { 
      while((strLine = br.readLine()) != null) { 
       rows++; 
       } 
      //br.reset(); 
      br.close(); 
      //br.reset(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
if(rows>0){ 
      InputStream filename1 = getAttachstream(); 
      Scanner inputStream1 = new Scanner(filename1); 
       for (int rowIncr = 1; inputStream1.hasNext(); rowIncr++) { 

       String data; 
       try { 
        data = br.readLine(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       String [] values = data.split(","); 
       String curRowPartNumber = values[0]; 
       String curRowQuantity = values[1]; 
       if(rowIncr == 1) 
       { 
        if((values[0]==null || values[0].trim().length()<=0) 
          || (values[1]==null || values[1].trim().length()<=0) 
          || (values[2] != "") || !"Part Number".equalsIgnoreCase(values[0].trim()) 
          || !"Quantity".equalsIgnoreCase(values[1].trim())){ 
         System.out.println("Invalid Excel sheet data"); 
         throw new ECApplicationException(ECMessage._ERR_CMD_INVALID_DATAFORMAT, CLASSNAME,methodName); 
        } 

       } 
+0

"하지만 아무것도 작동하지 않습니다." 우리는 묻습니다. 오류가 있습니까? 오류 메시지는 무엇입니까? – bpgergo

+0

'getAttachstream()'에 무엇이 있습니까? – stacker

+0

파일을 두 번 읽을 필요가 없습니다. 실제 문제는 무엇을 해결하려고합니까? – EJP

답변

6

스트림, 독자, 작가, 소켓 또는 기타 자원이 종료되면, 당신은 다시 열 수 없습니다.

파일을 두 번 이상 읽으려면 파일 이름이 있어야합니다.

+1

답변에 추가하기 만하면 스트림 래퍼가 닫히고 모든 기본 스트림도 닫힙니다. – gigadot

+0

Peter의 답변에 추가하려면 "파일을 두 번 이상 읽으려면 파일 이름이 필요합니다." 즉, 다시 getAttachstream()을'filename1'에 다시 할당해야하고 **와 ** 새로운 스캐너 (filename1)를'inputStream1'에 다시 할당해야합니다. 한 번 더 파일을 구문 분석 한 직후에이 두 가지 작업을 수행하고 파일의 시작 부분으로 돌아갑니다. – Andrei

1

나는 당신이 getAttachstream에서 얻은 InputStream을 다시 여는 것을 의미한다고 가정한다.

유일한 방법은 getAttachstream이 이러한 메서드를 구현하는 클래스를 반환하는 것입니다. FileInputStream도 그런 옵션을 제공하지 않는다는 것을 명심하십시오. 그리고 비록 당신이 구체적인 클래스를 찾았고 그런 메소드가있을지라도, 메소드의 정의가 InputStream을 반환하기 때문에 그것이 항상 같은 클래스를 반환 할 것이라는 확신을 갖지 못합니다. 반환되는 클래스).

유일한 옵션은 원래의 inputStream을 사용하여 임시 파일이나 ByteArrayOutputStream (파일/s가 너무 작아서 메모리를 너무 많이 사용하지 않을 정도로 작 으면)에 쓰면 데이터에 여러 번 액세스 할 수 있습니다.

0

이 스캐너의 입력에 다른 행이있는 경우 행 Scanner.hasNextLine()

반환 사실을 계산하는 스캐너를 사용할 수 있습니다. 이 메소드는 입력을 기다리는 동안 차단 될 수 있습니다. 스캐너는 입력을 지나서 진행하지 않습니다.

File file = new File("C:/test.txt"); 
    File file1 = new File("C:/test1.txt"); 

    Scanner scanner; 
    try { 
     FileInputStream fileInputStream = new FileInputStream(file); 
     FileInputStream fileInputStream1 = new FileInputStream(file1); 
     scanner = new Scanner(fileInputStream); 
     int count = 0; 
     while (scanner.hasNextLine()) { 
      String line = scanner.nextLine(); 
      count++; 
     } 
     scanner.close(); 
     System.out.println("File 1 Count:" + count); 
     scanner = new Scanner(fileInputStream1); 
     count = 0; 
     while (scanner.hasNextLine()) { 
      String line = scanner.nextLine(); 
      count++; 
     } 
     System.out.println("File 2 Count:" + count); 
     scanner.close(); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }