2

在我的应用程序中,我以块的形式获取 excel 文件作为输入。比方说,如果 excel 文件大小为 20 MB,那么我将得到 4 个块,其中每个块(字节 [])为 5MB。我正在将每个块(字节 [])写入临时文件(没有扩展名)。我正在使用这个临时文件来重新生成以多个块发送给我的实际 excel 文件。我的要求是生成的 excel 文件必须与我分块得到的 excel 文件相同。

示例代码:

  1. 读取excel文件,转换成块并将这些块写入临时文件。

    公共静态无效 readExcelFileBytes(String srcFile) 抛出 IOException {

    File file = new File(srcFile);
    
    FileInputStream fis = new FileInputStream(file);
    
    byte[] buf = new byte[1024 * 5]; // 5KB
    int totalNoOfBytes = 0;
    try {
        for (int readNum; (readNum = fis.read(buf)) != -1;) {               
            appendByteArrayToTempFile(buf);
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    System.out.println("Read: Total Size Bytes" + totalNoOfBytes);
    
    }
    
    public static boolean appendByteArrayToTempFile(byte[] byteArray) {
    
    boolean result = false;
    BufferedWriter writeout = null;
    File bodfile = null;
    FileOutputStream out = null;
    try {
        bodfile = new File("C://tempFile");
        out = new FileOutputStream(bodfile, true);
        out.write(byteArray);           
    
        result = true;
    
    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        try {
            //writeout.close();
            out.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    return result;
    }
    
  2. 使用 temp byte[] 重新生成 excel 文件。

公共静态 void tempToFile(String srcFilePath) 抛出 IOException{

   File file = new File("C://tempFile");

   FileInputStream fis = new FileInputStream(file);

   ByteArrayOutputStream bos = new ByteArrayOutputStream();
   byte[] buf = new byte[1024];
   try {
       for (int readNum; (readNum = fis.read(buf)) != -1;) {
           bos.write(buf, 0, readNum); //no doubt here is 0                

       }
   } catch (IOException ex) {
       ex.printStackTrace();
   }
   byte[] bytes = bos.toByteArray();

   // Create source file from Temp's byte array
   FileOutputStream fileOuputStream =  new FileOutputStream(srcFilePath); 
   fileOuputStream.write(bytes);
   fileOuputStream.flush();
   fileOuputStream.close();
}

问题:

公共静态 void main(String s[]) 抛出 IOException {

    // XLS POC
    readExcelFileBytes("C://Input.xlsx");
    tempToFile("C://Output.xlsx");

}

但是当使用临时文件 byte[] 生成 excel 文件时,它会被修改。有人可以帮助我是否遵循正确的方法使用临时文件字节 [] 重新生成 excel 文件?

4

2 回答 2

2

这段代码肯定是错的:

for (int readNum; (readNum = fis.read(buf)) != -1;) {               
    appendByteArrayToTempFile(buf);
}

您忽略了实际读入的字节数,并且每次都buf无条件地写出整个字节数。buf你需要

for (int readNum; (readNum = fis.read(buf)) != -1;) {               
    appendByteArrayToTempFile(buf, readNum);
}

appendByteArrayToTempFile据此实施。

于 2013-01-04T12:00:46.873 回答
2

使用自动复制文件的现有库不是更好吗?

其中一个图书馆是 Jakarta Commons

它已被数百名开发人员使用;它经过了很好的测试,肯定会帮助您完成文件复制任务。

编辑

如果您收到损坏的文件,检查您的文件复制机制(您自己的任何库中的一种)是否工作正常的最佳方法是检查输入和输出文件校验和。输入文件校验和应与输出文件校验和相同。

假设您的输入和输出java.io.File是您的代码检查文件校验和可能如下所示:inputFileoutput

long inputChecksum = FileUtils.checksumCRC32(input);

// if there is an issue with file copy IOException is thrown
FileUtils.copyFile(input, output);

// inputChecksum should be the same as outputChecksum
long outputChecksum = FileUtils.checksumCRC32(output);
于 2013-01-04T11:45:45.313 回答