送信\受信するファイルのサイズが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();
}
}
}
事前に感謝し、投稿の誤りについてお詫び申し上げます。