我对这两个类有一个问题,当要发送\接收的文件大小超过 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();
}
}
}
在此先感谢,并对帖子的任何错误表示歉意。