1

Javaチャネルの使用経験はありません。バイト配列をファイルに書き込みたいのですが。現在、私は次のコードを持っています:

String outFileString = DEFAULT_DECODED_FILE; // Valid file pathname
FileSystem fs = FileSystems.getDefault();
Path fp = fs.getPath(outFileString);

FileChannel outChannel = FileChannel.open(fp, EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE));

// Please note: result.getRawBytes() returns a byte[]
ByteBuffer buffer = ByteBuffer.allocate(result.getRawBytes().length);
buffer.put(result.getRawBytes());

outChannel.write(buffer); // File successfully created/truncated, but no data

このコードを使用すると、出力ファイルが作成され、存在する場合は切り捨てられます。また、IntelliJデバッガーでは、データが含まれていることがわかりbufferます。outChannel.write()また、例外をスローせずに回線が正常に呼び出されます。ただし、プログラムの終了後、データは出力ファイルに表示されません。

誰かが(a)FileChannel APIがバイト配列をファイルに書き込むための許容可能な選択であるかどうかを教えてもらえますか?(b)そうであれば、それを機能させるために上記のコードをどのように変更する必要がありますか?

4

4 に答える 4

3

gulyanが指摘しているように、flip()書き込む前にバイトバッファを使用する必要があります。または、元のバイト配列をラップすることもできます。

ByteBuffer buffer = ByteBuffer.wrap(result.getRawBytes());

書き込みがディスク上にあることを保証するには、次を使用する必要がありますforce()

outChannel.force(false);

または、チャネルを閉じることができます。

outChannel.close();
于 2012-04-15T20:59:20.747 に答える
3

あなたは電話する必要があります:

buffer.flip();

書き込みの前に。

これにより、読み取り用のバッファーが準備されます。また、あなたは電話する必要があります

buffer.clear();

データを入れる前に。

于 2012-04-15T21:01:01.320 に答える
1

最初の質問に答えるには

FileChannelAPIがバイト配列をファイルに書き込むための許容可能な選択であるかどうかを教えてください

大丈夫ですが、もっと簡単な方法があります。を使用してみてくださいFileOutputStream。通常、これはパフォーマンスのためにforでラップされBufferedOutputStreamますが、重要なのはこれらの両方の拡張OutputStreamであり、簡単なwrite(byte[])方法があります。これは、チャネル/バッファAPIよりもはるかに簡単に操作できます。

于 2012-04-15T21:02:41.223 に答える
1

これがFileChannelの完全な例です。

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
    import java.nio.channels.WritableByteChannel;


    public class FileChannelTest {
        // This is a Filer location where write operation to be done.
        private static final String FILER_LOCATION = "C:\\documents\\test";
        // This is a text message that to be written in filer location file.
        private static final String MESSAGE_WRITE_ON_FILER = "Operation has been committed.";

        public static void main(String[] args) throws FileNotFoundException {
            // Initialized the File and File Channel
            RandomAccessFile randomAccessFileOutputFile = null;
            FileChannel outputFileChannel = null;
            try {
                // Create a random access file with 'rw' permission..
                randomAccessFileOutputFile = new RandomAccessFile(FILER_LOCATION + File.separator + "readme.txt", "rw");
                outputFileChannel = randomAccessFileOutputFile.getChannel();
                //Read line of code one by one and converted it into byte array to write into FileChannel.
                final byte[] bytes = (MESSAGE_WRITE_ON_FILER + System.lineSeparator()).getBytes();
                // Defined a new buffer capacity.
                ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
                // Put byte array into butter array.
                buffer.put(bytes);
                // its flip the buffer and set the position to zero for next write operation.
                buffer.flip();
                /**
                 * Writes a sequence of bytes to this channel from the given buffer.
                 */
                outputFileChannel.write(buffer);
                System.out.println("File Write Operation is done!!");

            } catch (IOException ex) {
                System.out.println("Oops Unable to proceed file write Operation due to ->" + ex.getMessage());
            } finally {
                try {
                    outputFileChannel.close();
                    randomAccessFileOutputFile.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

        }

    }
于 2017-01-10T05:49:57.673 に答える