2

ビジネス オブジェクトをファイルに書き込むための次のコード セットがあります。書き込みは通常 2 つの部分で行われますが、writeTrxここで -helper は一時ファイルの書き込みと名前変更の両方を行います。

public static void writeTrx(File dbDir, Trx trx, String idString) throws IOException {
    UnfinishedTrx temp = writeTempTrxFile(dbDir, trx, idString);
    finishWritingTrx(temp);
}

public static UnfinishedTrx writeTempTrxFile(File dbDir, Trx trx, String idString) throws IOException {
    File tempDir = getAndCreateTempDir(dbDir);
    Path tempFilePath = Files.createTempFile(tempDir.toPath(), idString, ".tmp_trx");
    try (OutputStream fos = Files.newOutputStream(tempFilePath)) {
        writeTrx(fos, trx);
    }
    return new UnfinishedTrx(dbDir, idString, tempFilePath);
}

public static void writeTrx(OutputStream out, Trx trx) throws IOException {
    try (BufferedOutputStream bos = new BufferedOutputStream(out);
         ObjectOutputStream oos = new ObjectOutputStream(bos)) {
        oos.writeObject(trx);
    }
}

しかし、私は時々これから得ますjava.nio.channels.ClosedChannelException

at sun.nio.ch.FileChannelImpl.ensureOpen(FileChannelImpl.java:99)
at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:192)
at java.nio.channels.Channels.writeFullyImpl(Channels.java:78)
at java.nio.channels.Channels.writeFully(Channels.java:101)
at java.nio.channels.Channels.access$000(Channels.java:61)
at java.nio.channels.Channels$1.write(Channels.java:174)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:126)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1876)
at java.io.ObjectOutputStream$BlockDataOutputStream.writeByte(ObjectOutputStream.java:1914)
at java.io.ObjectOutputStream.writeFatalException(ObjectOutputStream.java:1575)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:350)
at foo.TrxHelper.writeTrx(TrxHelper.java:125)
at foo.TrxHelper.writeTempTrxFile(TrxHelper.java:99)
at foo.TrxHelper.writeTrx(TrxHelper.java:91)

それは私を当惑させます。close が呼び出されたときにのみObjectOutputStream がストリームを閉じるような呼び出し構造でチャネルを閉じるにはどうすればよいですか?

私の理解では、ストリーム内ではなく、内部の writeTrx-call が返されるときに、ストリームをできるだけ早く閉じる必要があります。

4

0 に答える 0