gpt4 book ai didi

java - 文件大小过大 Java

转载 作者:行者123 更新时间:2023-12-01 04:41:15 25 4
gpt4 key购买 nike

当要发送\接收的文件大小超过 1GB 时,我对这两个类有问题。在关闭输出文件的流之前,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();
}
}
}

提前致谢,并对帖子中的任何错误表示歉意。

最佳答案

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

当您发送时,请执行以下操作:

  1. 发送文件名
  2. 发送文件大小
  3. 发送 block 大小
  4. 发送 block 大小字节
  5. 转到3

当您收到时,请执行以下操作:

  1. 发送 block 大小
  2. 发送 block 大小字节
  3. 转到1

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

关于java - 文件大小过大 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16478489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com