简体   繁体   English

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

[英]How to use java.nio.channels.FileChannel to write a byte[] to a file - Basics

I do not have experience using Java channels. 我没有使用Java通道的经验。 I would like to write a byte array to a file. 我想将字节数组写入文件。 Currently, I have the following code: 目前,我有以下代码:

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

With this code, the output file is created, and truncated if it exists. 使用此代码,将创建输出文件,如果存在则将其截断。 Also, in the IntelliJ debugger, I can see that buffer contains data. 另外,在IntelliJ调试器中,我可以看到该buffer包含数据。 Also, the line outChannel.write() is successfully called without throwing an exception. 同样,成功调用outChannel.write()行而不会引发异常。 However, after the program exits, the data does not appear in the output file. 但是,程序退出后,数据不会出现在输出文件中。

Can somebody (a) tell me if the FileChannel API is an acceptable choice for writing a byte array to a file, and (b) if so, how should the above code be modified to get it to work? 有人可以(a)告诉我FileChannel API是否是将字节数组写入文件的可接受选择;并且(b)可以告诉我,如何修改上述代码才能使其工作?

As gulyan points out, you need to flip() your byte buffer before writing it. 正如gulyan指出的那样,您需要在写入字节缓冲区之前先flip()它。 Alternately, you could wrap your original byte array: 或者,您可以包装原始字节数组:

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

To guarantee the write is on disk, you need to use force() : 为了保证写操作在磁盘上,您需要使用force()

outChannel.force(false);

Or you could close the channel: 或者您可以关闭频道:

outChannel.close();

You should call: 您应该致电:

buffer.flip();

before the write. 在写之前。

This prepares the buffer for reading. 这将准备读取缓冲区。 Also, you should call 另外,你应该打电话

buffer.clear();

before putting data into it. 在将数据放入其中之前。

To answer your first question 回答您的第一个问题

tell me if the FileChannel API is an acceptable choice for writing a byte array to a file 告诉我FileChannel API是否是将字节数组写入文件的可接受选择

It's ok but there's simpler ways. 可以,但是有更简单的方法。 Try using a FileOutputStream . 尝试使用FileOutputStream Typically this would be wrapped by a BufferedOutputStream for performance but the key is both of these extend OutputStream which has a simple write(byte[]) method. 通常,这将由BufferedOutputStream包装以提高性能,但关键是这两个扩展OutputStream都具有简单的write(byte[])方法。 This is much easier to work with than the channel/buffer API. 这比使用channel / buffer API容易得多。

Here is a complete example of FileChannel. 这是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();
                }

            }

        }

    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM