文件化过多的Java

时间:2013-05-10 08:55:13

标签: java objectinputstream objectoutputstream

我遇到这两个类的问题,当发送\接收的文件大小超过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();
        }
    }
}

提前致谢并对此邮寄的任何错误表示歉意。

1 个答案:

答案 0 :(得分:0)

如果我已正确阅读您的代码,问题是您的发件人格式与您的收件人格式不符。

当您发送时,请执行以下操作:

  1. 发送文件名
  2. 发送文件大小
  3. 发送chunk-size
  4. 发送chunk-size bytes
  5. 转到3
  6. 当您收到时,请执行以下操作:

    1. 发送chunk-size
    2. 发送chunk-size bytes
    3. 转到1
    4. 如果这不是问题,请提供SSCCE ...以便我们检查您实际运行的代码。