随机流RandomAccessFile的用法及随机流与IO缓冲流的效率对比

随机流和IO流的原理是不同的。随机流的优点就是可以随意从指定的位置读取文件。

IO流:字节流:FileInputStream和FileOutputStream  

           字节缓冲流:BufferedInputStream和BufferedOutputStream(对字节流进行封装)

           字符流:FileReader和FileWriter

随机流:RandomAccessFile(既可以读也可以写,可用多线程上传、下载)的优点是可以从指定位置读,指定位置写的一个类,多用于多线程下载一个大文件。

 常用构造方法:RandomAccessFile ra_read = newRandomAccessFile(File file, String mode);

 参数 mode 的值可选 "r":可读,"w" :可写,"rw":可读性;

成员方法:

                将指针移动到某个位置开始读写: void seek(int index)

                给写入文件预留空间:setLength(long len)

                读取一行:String readLine()

                跳过字节:int skipBytes(int n)

下面我们介绍随机流的用法:

1.普通单独使用:RandomAccessFile

单独使用RandomAccessFile和io缓冲流效率对比

public class TestRoundomFile {
    public static void main(String[] args) throws IOException {
        long start = System.currentTimeMillis();
        // 调用普通io缓冲流
//        testIO();
        // 调用随机流
        testRandomAccessFile();
        long end = System.currentTimeMillis();
        System.out.println("2.6G文件复制所用时间 : " + (end - start));
        /**
         * 调用普通io缓冲流时,打印结果为--2.6G文件复制所用时间 : 14443ms
         * 调用随机流时,打印结果为--2.6G文件复制所用时间 : 22091ms
         */
    }

    private static void testRandomAccessFile() throws IOException {
        RandomAccessFile ra_read = new RandomAccessFile("d:/TEST/testfile.zip", "r");
        RandomAccessFile ra_desc = new RandomAccessFile("d:/TEST/testfile-copy.zip", "rw");
        // 源和目的都从0开始(可随意跳)
        ra_read.seek(0);
        ra_desc.seek(0);

        byte[] bys = new byte[1024];
        int len;
        while ((len = ra_read.read(bys)) != -1) {
            ra_desc.write(bys, 0, len);
        }
        ra_read.close();
        ra_desc.close();
    }

    private static void testIO() throws IOException {
        // 传参要是对应的流,缓冲流底层默认一次8192数组
        BufferedInputStream bis = new BufferedInputStream(
                new FileInputStream("d:/TEST/testfile.zip"));
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream("d:/TEST/testfile-COPY.zip"));
        byte[] bys = new byte[1024];
        int len;
        while ((len = bis.read(bys)) != -1) {
            bos.write(bys, 0, len);
        }
        bis.close();
        bos.close();
    }
}

通过对比RandomAccessFile不使用多线程的情况下,效率低于io缓冲流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值