如何使用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(); } } } }