在我的应用程序中,我将块中的excel文件作为输入。假设,如果excel文件大小为20 MB,那么我将获得4个块,其中每个块(byte [])为5MB。我正在将每个块(byte [])写入临时文件(没有扩展名)。我正在使用此临时文件重新生成实际的excel文件,该文件以多个块的形式发送给我。我的要求是生成的excel文件必须与我在块中获得的excel文件相同。
示例代码:
读取excel文件,转换为块并将这些块写入临时文件。
public static void 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;
}
使用temp byte []重新生成excel文件。
public static 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();
}
问题:
public static void main(String s [])抛出IOException {
// XLS POC
readExcelFileBytes("C://Input.xlsx");
tempToFile("C://Output.xlsx");
}
但是当使用临时文件byte []生成excel文件时,它会被获取。有人可以帮助我是否遵循使用临时文件byte []?
重新生成excel文件的正确方法答案 0 :(得分:2)
使用现有的自动复制文件的库不是更好吗?
其中一个图书馆是Jakarta Commons
它已被数百名开发人员使用;它经过了很好的测试,肯定会帮助您完成文件复制任务。
修改强>
如果您收到损坏的文件,最好的方法是检查文件复制机制(您自己的库中的任何一个)是否正常工作以检查输入和输出文件校验和。输入文件校验和应与输出文件校验和相同。
假设您的输入java.io.File
为input
且输出File
为output
,则您的代码检查文件校验和可能如下所示:
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);
答案 1 :(得分: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
。