Java NIO学习之RandomAccessFile

一、 RandomAccessFile简介

  1. RandomAccessFile既可以读取文件内容,也可以向文件输出数据。同时,RandomAccessFile支持“随机访问”的方式,程序快可以直接跳转到文件的任意地方来读写数据。

  2. 由于RandomAccessFile可以自由访问文件的任意位置,所以如果需要访问文件的部分内容,而不是把文件从头读到尾,使用RandomAccessFile将是更好的选择。

  3. 与OutputStream、Writer等输出流不同的是,RandomAccessFile允许自由定义文件记录指针,**RandomAccessFile可以不从开始的地方开始输出,因此RandomAccessFile可以向已存在的文件后追加内容。**如果程序需要向已存在的文件后追加内容,则应该使用RandomAccessFile。

  4. RandomAccessFile的方法虽然多,但它有一个最大的局限,就是只能读写文件,不能读写其他IO节点。

  5. RandomAccessFile的一个重要使用场景就是网络请求中的多线程下载及断点续传。

二、RandomAccessFile中的方法

1. RandomAccessFile的构造函数

1. public RandomAccessFile(String name, String mode)
2. public RandomAccessFile(File file, String mode)

mode
在这里插入图片描述

2. 重要方法

// 从此文件中读取最多 b.length 个字节的数据到一个字节数组中。此方法会阻塞,直到至少有一个字节的输入可用,当读取到文件末尾时返回 -1
public int read(byte b[], int off, int len) throws IOException {
        return readBytes(b, off, len);
    }
// 将指定字节数组中的b.length个字节写入此文件,从当前文件指针开始。
public void write(byte b[]) throws IOException {
        writeBytes(b, 0, b.length);
    }
public native long getFilePointer()  //返回文件记录指针的当前位置
void seek(long pos )  //将文件指针定位到pos位置

三、RandomAccessFile的使用

package IODemos;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

public class RandomAccessFileDemo {
    public static void main(String[] args) {
        String filePath = "C:\\Users\\HR\\Desktop\\JavaIO\\RandomAccessFile.txt";
        File file = new File(filePath);
        RandomAccessFileDemo rafDemo = new RandomAccessFileDemo();
        rafDemo.readAndWrite(file);
    }
    //写文件 另外指定位置读取文件
    public void readAndWrite(File file){
        try {
            if (!file.exists()) {
                file.createNewFile();
            }
        }catch (IOException e){
            e.printStackTrace();
        }
        try {
            RandomAccessFile raf = new RandomAccessFile(file, "rw");
            String str1 = "晴天,阴天,多云,小雨,大风,中雨,小雪,雷阵雨";    // 要写入的字符串
            String str2 = new String(str1.getBytes("GBK"),"ISO-8859-1");    // 编码转换
            raf.writeBytes(str2);

            System.out.println("当前指针位置: "+raf.getFilePointer());
            raf.seek(6); //移动文件指针
            System.out.println("从文件头跳过6个字节。。。");
            byte[] buffer = new byte[2];
            int len;
            while ((len = raf.read(buffer, 0, 2)) != -1) {
                String s = new String(buffer, 0, len, "gbk"); //读文件 编码转换
                System.out.print(s);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值