2013-05-10 5 views
1

보내려는 파일의 크기가 1GB를 초과 할 때이 두 클래스에 문제가 있습니다. 수신 된 것으로 보이는 출력 파일에 스트림을 닫기 전에 클래스 Decripter가 대기합니다. (크기를 조절하여) 전체적으로. Cripter 클래스는 오류없이 성공적으로 완료됩니다. 전체 파일의 크기가 너무 크기 때문에 디버깅을 사용할 수 없습니다. 나는 모든 스트림을 적절하게 닫은 이후의 문제 (내가 생각하기에)를 이해할 수 없다.파일 크기 초과 자바

public class Cripter { 


    ObjectOutputStream out; 

    FileInputStream fis2; 

    BufferedInputStream bis; 

    File iFile; 

    public Cripter(File tmpFile, ObjectOutputStream tmpOut) { 
     //Definizione degli stream 
     in = tmpIn; 
     out = tmpOut; 
     iFile = tmpFile; 
     splitFile(); 
    } 

    private void splitFile() { 
     FileInputStream fis; 

     long fileSize = iFile.length(); 
     int read = 0; 
     long readLength = 10000000; 
     Client.writeLabelSender("Criptaggio del file " + iFile.getName() + " in corso..."); 
     byte[] byteChunk; 
     try { 
      //Invio il nome completo del file 
      out.writeObject(iFile.getName()); 
      //Invio della dimensione completa 
      out.writeObject(fileSize); 
      fis = new FileInputStream(iFile); 
      while (fileSize > 0) { 
       if (fileSize <= readLength) { 
        readLength = fileSize; 
       } 
       byteChunk = new byte[(int) readLength]; 
       read = fis.read(byteChunk, 0, (int) readLength); 
       fileSize -= read; 
       //Lunghezza 
       out.writeObject(read); 
       //Invio 
       out.write(byteChunk, 0, byteChunk.length); 
       out.flush(); 
       byteChunk = null; 
      } 
      fis.close(); 
      fis = null; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

이 클래스는 수신입니다 : 포스트의 오류에 대한 사전 및 유감의

public class Decripter { 
    /** 
    * byte letti 
    */ 
    int bytesRead = 0; 
    /** 
    * Directory in cui salvare il file completo 
    */ 
    private static String directory; 
    /** 
    * Nome del file completo 
    */ 
    private static String fileName; 
    /** 
    * Stream di input 
    */ 
    public ObjectInputStream in ; 

    /** 
    * Dimensione del file completo 
    */ 
    long dimensione; 
    /** 
    * File utilizzato per comporre il file finale 
    */ 
    File oFile; 

    //Stream 
    FileOutputStream fos; 
    FileInputStream fis; 
    FileOutputStream fosTx; 

    /** 
    * Costruttore che inizializza il nome e la directory del file ed effettua il riassemblamento 
    * @param name nome del file completo 
    * @param dir Parte del percorso successiva a FileDirectory in cui salvare il file 
    * @param dimensione Dimensione del file finale 
    * @param in Stream di input 
    */ 
    public Decripter(String name, String dir, ObjectInputStream tempIn, long tempDimensione) { 
     directory = dir; 
     fileName = name; in = tempIn; 
     dimensione = tempDimensione; 
     oFile = new File(directory, fileName); 

     deReceiver(); 
    } 
    /** 
    * Metodo per la ricezione e riassemblamento del file 
    */ 
    private void deReceiver() { 
     int check = 0; 
     //Ricerca ed eliminazione di un eventuale duplicato del file completo 
     removeDuplicate(); 
     try { 
      //Stream che accoderà i byte ricevuti 
      fos = new FileOutputStream(oFile, true); 
      //Blocco in cui vengono ricevuti i byte 
      while (dimensione > check) { 
       //Dimensione dei bytes in ricezione 
       int tempDim = (int) in .readObject(); 
       //Preparo il buffer di byte 
       byte[] mybytearray = new byte[tempDim]; 
       //Ricevo i byte 
       in .readFully(mybytearray); 
       //Traccio i byte che ho letto 
       check += tempDim; 
       //Scrivo su file 
       fos.write(mybytearray); 


       //Svuoto lo stream 
       fos.flush(); 
       //Resetto il buffer 
       mybytearray = null; 
      } 
      //Chiudo lo stream 
      fos.close(); 
      fos = null; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 
    /** 
    * Metodo per la rimozione del file completo già presente nella directory 
    */ 
    public static void removeDuplicate() { 
     File direc = new File(directory); 
     for (File temp: direc.listFiles()) { 
      if (temp.getName().equals(fileName)) 
       temp.delete(); 
     } 
    } 
} 

덕분에이 보내기위한 클래스입니다.

+0

작은 파일에서도 정상적으로 작동합니까? – DaveRlz

+0

클래스를 토큰 화하지 않고 청크로 처리 할 수 ​​있습니까? – christopher

+0

은 100MB에서 1GB 사이의 파일 크기에서 올바르게 작동합니다. @DaveRlz –

답변

0

코드를 올바르게 읽은 경우 발신자 형식이 수신자 형식과 일치하지 않는 것이 문제입니다. 당신이 보낼 때

이 작업을 수행 :

    파일 이름은 이
  1. 전송 파일 크기가
  2. 전송 청크 크기
  3. 전송 청크 크기 바이트
  4. 3
  5. 로 이동
  6. 보내기

수신 할 때 :

    우리가 검토 할 수 있도록이 문제가 아닌 경우 덩어리 크기
  1. 전송 청크 크기 바이트
  2. 1

로 이동

  • 보내기 ... SSCCE을 제공하십시오 실제로 실행중인 코드

  • +0

    SSCCE 용으로 미안하지만, 지금은 문제에 대해 읽었습니다. 그 부분은 Decripter에서 사용하지 않기 때문이 아닙니다. 어쨌든이 두 클래스가 프로젝트 클라이언트 서버의 일부이기 때문에 가능한 빨리 SSCCE를 제공합니다 ... –

    +0

    오류를 발견했습니다. 변수 검사는 정수이므로 크기가 2,147,483,647 (int에서 표현 가능한 최대 수)를 초과하면 변수 검사가 음수가됩니다. 어쨌든 모두에게 감사드립니다. –