Java 使用newByteChannel(Channel I/O)读写文件方法及示例代码 stream I/O一次读取一个字符,而通道channel I/O一次读取一个缓冲区。本文主要介绍通过使用newByteChannel(Channel IO)读写文件(file),及使用的示例代码。

1、ByteChannel、SeekableByteChannel和newByteChannel

ByteChannel接口提供了基本的read和write功能性。A SeekableByteChannelByteChannel具有维持频道中位置并更改该位置的能力。A SeekableByteChannel还支持截断与通道关联的文件并查询文件的大小。

能够移动到文件中的不同点,然后从该位置读取或写入该位置的功能使对文件的随机访问成为可能。有关更多信息,请参见 随机访问文件

有两种读取和写入通道I / O的方法。

注:  该newByteChannel方法返回的一个实例SeekableByteChannel。使用默认文件系统,您可以将此可搜索的字节通道转换为 FileChannel提供对更高级功能的访问,例如将文件的区域直接映射到内存中以加快访问速度,锁定文件的区域以便其他进程无法访问它或读取从绝对位置写入字节,而不会影响通道的当前位置。

这两种newByteChannel方法都可以指定OpenOption选项列表。除了一个选项之外,newOutputStream还支持该方法使用的相同OpenOption:READ由于SeekableByteChannel支持读和写,因此是必需的:

指定READ将打开阅读通道。指定WRITE或APPEND打开用于写入的通道。如果未指定这些选项,则打开通道进行读取。

2、使用newByteChannel读写文件

//读取文件
try (SeekableByteChannel sbc = Files.newByteChannel(file)) {
    ByteBuffer buf = ByteBuffer.allocate(10);
//为这个平台读取正确编码的字节。如果
//你跳过这一步,你可能会看到像这样的东西
//当你希望看到拉丁风格的汉字时,就会想到汉字。
    String encoding = System.getProperty("file.encoding");
    while (sbc.read(buf) > 0) {
        buf.rewind();
        System.out.print(Charset.forName(encoding).decode(buf));
        buf.flip();
    }
} catch (IOException x) {
    System.out.println("caught exception: " + x);

以下示例是为UNIX和其他POSIX文件系统编写的,它创建具有一组特定文件权限的日志文件。此代码创建一个日志文件,或者如果已经存在则追加到该日志文件。创建的日志文件具有所有者的读/写权限和组的只读权限。

//写文件
import static java.nio.file.StandardOpenOption.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.io.*;
import java.util.*;
public class LogFilePermissionsTest {
  public static void main(String[] args) {
    // 创建一组附加到文件的选项。
    Set<OpenOption> options = new HashSet<OpenOption>();
    options.add(APPEND);
    options.add(CREATE);
    // 创建自定义权限属性。
    Set<PosixFilePermission> perms =
      PosixFilePermissions.fromString("rw-r-----");
    FileAttribute<Set<PosixFilePermission>> attr =
      PosixFilePermissions.asFileAttribute(perms);
    // 将字符串转换为ByteBuffer。
    String s = "Hello World! ";
    byte data[] = s.getBytes();
    ByteBuffer bb = ByteBuffer.wrap(data);
    Path file = Paths.get("./permissions.log");
    try (SeekableByteChannel sbc =
      Files.newByteChannel(file, options, attr)) {
      sbc.write(bb);
    } catch (IOException x) {
      System.out.println("Exception thrown: " + x);
    }
  }
}

相关文档https://docs.oracle.com/javase/tutorial/essential/io/file.html