文件大小过多的 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的主要内容,如果未能解决你的问题,请参考以下文章

火花 |生成过多的零件文件

Spark 处理小文件

web文件上传大小限制

如何使用 PIL 减小图像文件大小

java file 获取文件大小 是啥单位

oracle 数据库中udump文件中日志过多,导致系统磁盘使用率达到100%,怎么解决。