如何使用java.nio.channels.FileChannel将byte 写入文件 – 基础知识
我没有使用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()
行而不抛出exception。 但是,程序退出后,数据不会出现在输出文件中。
某人(a)可以告诉我FileChannel API是否是将字节数组写入文件的可接受选择,(b)如果是这样,上述代码应如何修改以使其工作?
正如gulyan指出的那样,你需要在写入之前flip()
你的字节缓冲区。 或者,您可以包装原始字节数组:
ByteBuffer buffer = ByteBuffer.wrap(result.getRawBytes());
要保证写入在磁盘上,您需要使用force()
:
outChannel.force(false);
或者您可以关闭频道:
outChannel.close();
你应该致电:
buffer.flip();
在写之前。
这使缓冲区准备好阅读。 另外,你应该打电话
buffer.clear();
在将数据放入其中之前。
回答你的第一个问题
告诉我FileChannel API是否是将字节数组写入文件的可接受选择
没关系,但有更简单的方法。 尝试使用FileOutputStream
。 通常,这将由BufferedOutputStream
包装以提高性能,但关键是这些扩展OutputStream
都有一个简单的write(byte[])
方法。 这比使用通道/缓冲区API更容易。
这是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(); } } } }