1

送信\受信するファイルのサイズが1GBを超えると、これら2つのクラスに問題があります。クラスDescripterは、ストリームを出力ファイルに閉じる前に何かを待ちます。サイズ)。代わりに、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