如何使用java.nio.channels.FileChannel将byte []写入文件 - 基础知识

时间:2012-04-15 20:55:16

标签: java

我没有使用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 个答案:

答案 0 :(得分:3)

正如gulyan指出的那样,在编写之前需要flip()字节缓冲区。或者,您可以包装原始字节数组:

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

为了保证写入在磁盘上,您需要使用force()

outChannel.force(false);

或者您可以关闭频道:

outChannel.close();

答案 1 :(得分:3)

你应该致电:

buffer.flip();
在写之前

这准备了缓冲区以供阅读。 另外,你应该打电话给

buffer.clear();

将数据放入其中。

答案 2 :(得分:1)

回答你的第一个问题

  

告诉我FileChannel API是否是将字节数组写入文件的可接受选择

没关系,但有更简单的方法。尝试使用FileOutputStream。通常,这将由BufferedOutputStream包装以获得性能,但关键是这两个扩展OutputStream,它具有简单的write(byte[])方法。这比通道/缓冲API更容易使用。

答案 3 :(得分: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();
                }

            }

        }

    }