3

指定したファイルに書き込もうとすると、以下のエラーが発生します。FileInputStream を閉じようとしましたが、それでも同じ問題が発生します。

関連するコードは次のとおりです。

エラーログ:

エラー: C:\Path\Hours Log.csv (ユーザー マップ セクションが開いているファイルでは、要求された操作を実行できません)

コード:

ログの作成:

private void writeLog() throws IOException{

    //set up vars and write directories
    File yearStatDir = new File("C:\\Path);
    File yearStatPath = new File(yearStatDir + "\\" + "Hours Log.csv");
    String yearStatString = yearStatPath.toString();

    //read the files
    String existingYearLog = readLogFile(yearStatString, yearStatPath);

    //write the updated file
    String hoursString = "1";
    String dataYear = existingYearLog + hoursString;
    String folderYear = "Satistics\\Yearly data\\" + yearString;
    writeFile(dataYear, ".csv", folderYear, "Hours Log");
}

ファイルの書き込み:

private void writeFile(String data, String fileType, String folder, String fileName){
    try{
        File fileDir = new File("C:\\Path\\" + folder);
        File filePath = new File(fileDir + "\\"+ fileName + fileType);
        writeDir(fileDir);
        // Create file 
        FileWriter fstream = new FileWriter(filePath);
        try (BufferedWriter out = new BufferedWriter(fstream)) {
            out.write(data);                        
            }
        }catch (Exception e){//Catch exception if any
            System.err.println("Error: " + e.getMessage());
        }
    }

ファイルの読み取り:

private static String readLogFile(String path, File f) throws IOException {
    if (f.exists()){
        try (FileInputStream stream = new FileInputStream(new File(path))) {
            FileChannel fc = stream.getChannel();
    MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
    /* Instead of using default, pass in a decoder. */
    fc.close();
    return Charset.defaultCharset().decode(bb).toString();

        }
    }
    else {
        return "";
    }
}  
4

1 に答える 1

2

これに出くわした人のために、私が現在使用している代替コードを次に示します。

private static String readLogFile(String path) throws IOException {
    File f = new File(path);
    if(f.exists()) {
        FileInputStream fis = new FileInputStream(f);
        Integer fileLength = (int) (long) f.length();
        byte[] b = new byte[fileLength];
        int read = 0;
        while (read < b.length) {
            read += fis.read(b, read, b.length - read);
        }
        String text = new String(b);
        return text;
    } else {
        String text = "";
        return text;
    }
}
于 2012-09-07T04:28:36.090 に答える