我正在使用Java程序来读取和写入现有的.xlsx文件(相同文件),但文件已损坏,文件大小变为零字节,导致“org.apache.poi.EmptyFileException :提供的文件为空(零字节长)“。
还有一件事 - 这种情况不会持续发生。程序在大多数情况下正确地读取和写入文件,但在10-15次运行中发生一次。如果有人有解决方案,那将会很有帮助。顺便说一句,我正在使用Apache POI 3.13。
阅读文件程序:
MPI_Request request_arr[receivers_list.size() + senders_list.size()];
int request_index = 0;
//read data from senders
int dataRecv[senders_list.size()];
for ( auto &e : senders_list ) {
MPI_Irecv( &dataRecv[request_index], 1, MPI_INT, e.remot_id, MPI_ANY_TAG, MPI_COMM_WORLD, &request_arr[request_index++] );
}
//send a data to all nodes on receiver list
for ( auto &e : receivers_list ) {
//I assume that you want to send the same value to all processes here, so like doing a MPI_Bcast()
MPI_Isend( &data, 1, MPI_INT, e.remot_id, 1234 , MPI_COMM_WORLD, &request_arr[request_index++] );
}
//wait for all receives complete
for ( int count_req = 0; count_req < request_index; ++count_req ) {
int curr_idx;
MPI_Waitany( request_index, request_arr, &curr_idx, MPI_STATUS_IGNORE );
if ( curr_idx < senders_list.size() ) {
//the completed request is a receiving one
//we can therefore freely access dataRecv[curr_idx]
//do some code here ...
}
}
写文件程序:
public String getExcelData(String sheetName, int rowNum, int colNum){
String retVal = null;
try {
FileInputStream fis = new FileInputStream("/Absolute/File/Path/Test-File.xlsx");
Workbook wb = WorkbookFactory.create(fis);
Sheet s = wb.getSheet(sheetName);
Row r = s.getRow(rowNum);
Cell c = r.getCell(colNum);
retVal=(c.getStringCellValue());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return retVal;
错误追踪:
public void writeToExcel(String sheetName,int rowNum,int cellNum,String desc){
try {
FileInputStream fis = new FileInputStream("/Absolute/File/Path/Test-File.xlsx");
Workbook wb = WorkbookFactory.create(fis);
Sheet s = wb.getSheet(sheetName);
Row r = s.getRow(rowNum);
Cell c = r.createCell(cellNum);
c.setCellValue(desc);
FileOutputStream fos = new FileOutputStream("/Absolute/File/Path/Test-File.xlsx");
wb.write(fos);
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
答案 0 :(得分:3)
您需要使用org.apache.commons.io.IOUtils.closeQuietly(fos)和fis关闭FileInputStream和FileOutputStream。
答案 1 :(得分:2)
您正在同时读取和写入同一文件。尝试在写入FileOutputStream fos之前先关闭FileInputStream fis。 或者使用临时文件写入新结果,然后将其重命名为原始结果。
顺便说一句。 close会自动执行flush,因此不必单独调用。
答案 2 :(得分:0)
当您写入文件时,您似乎没有使用flush
。此外,您的close
代码应在finally
块中完成,以确保即使发生错误也会关闭流。
答案 3 :(得分:0)
作为java dev,当您使用finally
块时,需要使用try-catch
块。
在你的finally块中,你必须关闭FileInputStream
和FileOutputStream
。当你没有关闭时,可能会打开文件处理程序。