보내려는 파일의 크기가 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();
}
}
}
덕분에이 보내기위한 클래스입니다.
작은 파일에서도 정상적으로 작동합니까? – DaveRlz
클래스를 토큰 화하지 않고 청크로 처리 할 수 있습니까? – christopher
은 100MB에서 1GB 사이의 파일 크기에서 올바르게 작동합니다. @DaveRlz –