web-dev-qa-db-ja.com

Java --Apache POI-.xlsxファイルの読み取り/書き込み-ファイルが破損し、空になります

Javaプログラムを使用して既存の.xlsxファイル(同じファイル)を読み書きしていますが、ファイルが破損しており、ファイルサイズがゼロバイトになっているため、" org.Apache.poi.EmptyFileException:提供されたファイルは空でした(長さ0バイト)」

もう1つ、これは一貫して発生していません。プログラムはほとんどの場合ファイルの読み取りと書き込みを適切に行っていますが、10〜15回の実行に1回発生します。誰かがこれに対する解決策を持っているなら、それは役に立ちます。ところで、Apache POI3.13を使用しています。

ファイルプログラムの読み取り:

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();
    }
}

エラートレース:

Exception in thread "main" org.Apache.poi.EmptyFileException: The supplied file was empty (zero bytes long)
at org.Apache.poi.util.IOUtils.peekFirst8Bytes(IOUtils.Java:55)
at org.Apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.Java:201)
at org.Apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.Java:168)
at ExcelLibrary.getExcelData(ExcelLibrary.Java:139)
at Driver.main(Driver.Java:82)
7
chivas_hvn

org.Apache.commons.io.IOUtils.closeQuietly(fos)とfisを使用してFileInputStreamとFileOutputStreamを閉じる必要があります。

3
PhstKv

同じファイルの読み取りと書き込みを同時に行っています。 FileOutputStream fosに書き込む前に、まずFileInputStreamfisを閉じてみてください。または、一時ファイルを使用して新しい結果を書き込み、名前を元の結果に変更します。

ところで。 closeは自動的にフラッシュを実行するため、個別に呼び出す必要はありません。

2
TouDick

ファイルに書き込むときは、 flush を使用していないようです。さらに、closeコードはfinallyブロックで実行して、何か問題が発生した場合でもストリームが閉じられるようにする必要があります。

0
Valentin Rocher

Java devとして、try-catchブロックを使用するときはfinallyブロックを使用する必要があります。finallyブロックで、FileInputStreamを閉じてFileOutputStream。閉じなかったため、ファイルハンドラーが開いている可能性があります。

0