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();
        }
    }
}

在此先感谢,并对帖子的任何错误表示歉意。

4

1 回答 1

0

如果我正确阅读了您的代码,则问题是您的发送方格式与您的接收方格式不匹配。

当你发送你这样做:

  1. 发送文件名
  2. 发送文件大小
  3. 发送块大小
  4. 发送块大小的字节
  5. 去 3

当你收到你这样做:

  1. 发送块大小
  2. 发送块大小的字节
  3. 去 1

如果这不是问题,请提供 SSCCE ...以便我们检查您实际运行的代码。

于 2013-05-10T09:48:59.683 回答