文件大小过多的 Java
Posted
技术标签:
【中文标题】文件大小过多的 Java【英文标题】:Filesize excessive Java 【发布时间】:2013-05-04 21:58:22 【问题描述】:我对这两个类有问题,当要发送\接收的文件大小超过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();
在此先感谢,对于帖子中的任何错误,我们深表歉意。
【问题讨论】:
在较小的文件上可以正常工作吗? 你不能把这个类标记化并分块做吗? 文件大小在 100 MB 到 1GB @DaveRlz 之间正常工作 @ChrisCooney 抱歉,我没看懂问题xD 将文件分割成更小的块并对它们执行相同的操作。 【参考方案1】:如果我正确阅读了您的代码,问题是您的发送方格式与您的接收方格式不匹配。
当您发送时,请执行以下操作:
-
发送文件名
发送文件大小
发送块大小
发送块大小的字节
转到3
收到后请执行以下操作:
-
发送块大小
发送块大小的字节
去1
如果这不是问题,请提供 SSCCE ...以便我们检查您实际运行的代码。
【讨论】:
对不起SSCCE,我刚刚读到了,但是,问题不在于Decripter没有使用该部分。无论如何,尽快给你一个 SSCCE,因为这两个类是项目客户端服务器的一部分...... 我发现了错误。变量检查是一个整数,因此当大小超过 2,147,483,647(int 中可表示的最大数)时,变量检查变为负数。总之谢谢大家。以上是关于文件大小过多的 Java的主要内容,如果未能解决你的问题,请参考以下文章