• 八、Java NIO FileChannel


    所有文章

    https://www.cnblogs.com/lay2017/p/12901123.html

    正文

    Java NIO软件包中的FileChannel表示的是连接到文件上的通道。使用FileChannel,你可以从文件中读取数据,以及写入数据到文件中。

    FileChannel不可以被设置为非阻塞模式,它总是以阻塞模式运行

    打开一个FileChannel

    在使用FileChannel之前,你需要打开它。你无法直接打开FileChannel,只能通过InputStream、OutputStream或者RandomAccessFile,例如

    RandomAccessFile aFile     = new RandomAccessFile("data/nio-data.txt", "rw");
    FileChannel      inChannel = aFile.getChannel();

    从FileChannel读取数据

    想要读取数据,你需要调用read方法

    ByteBuffer buf = ByteBuffer.allocate(48);
    
    int bytesRead = inChannel.read(buf);

    写入数据到FileChannel

    想要写入数据,你需要调用write方法

    String newData = "New String to write to file..." + System.currentTimeMillis();
    
    ByteBuffer buf = ByteBuffer.allocate(48);
    buf.clear();
    buf.put(newData.getBytes());
    
    buf.flip();
    
    while(buf.hasRemaining()) {
        channel.write(buf);
    }

    关闭FileChannel

    channel.close();

    FileChannel的Position

    当读取或者写入数据到FileChannel的时候,你是在一个特定的位置(position)上操作的。你可以获取当前的position,通过position()方法。

    你也可以设置position,通过position(long pos)方法

    long pos channel.position();
    
    channel.position(pos +123);

    如果你设置position为文件的最后一个位置,那么read操作将返回-1.

    如果设置破事同你为文件的最后一个位置,那么write操作将会扩大文件大小并写入数据。这可能导致"文件空洞",硬盘上的物理文件包含的写入数据可能存在缺口。

    FileChannel的size

    size方法可以获取文件的大小

    long fileSize = channel.size();

    FileChannel的truncate

    你可以删除文件内容通过truncate方法。

    channel.truncate(1024);

    这里删除了指定的1024字节长度的文件

    FileChannel的force

    force方法将会把内存中的数据flush到硬盘上,如果不调用force方法,你无法保证Channel中的数据都写入到了硬盘上。

    force方法可以传入一个boolean参数,表示是否文件的元数据(例如:权限)也需要一起flush

    channel.force(true);
  • 相关阅读:
    GO 函数的参数
    GO 函数
    GO 指针
    GO 结构体
    GO 接口
    码云git常用命令
    GO Map的初步使用
    GO Slice
    GO 数组
    GO 键盘输入和打印输出
  • 原文地址:https://www.cnblogs.com/lay2017/p/12906597.html
Copyright © 2020-2023  润新知