java 读写操作大文件 BufferedReader和RandomAccessFile

老问这问题,两个都答出来算加分项?

具体代码如下,没什么好说的直接说对比。

BufferedReader和RandomAccessFile的区别
RandomAccessFile 在数据越大,性能越差。因为他是数据文件的一个channel,支持读改原数据文件。

BufferedReader是读改数据文件的一个在内存的副本。

那RandomAccessFile的优点?

1.RandomAccessFile忽略了字符编码的处理,加快了处理速度

2.若是对数据操作在BufferedReader创立buffer的时候就做完了,RandomAccessFile自然就快了。

ps.

小文件RandomAccessFile,大文件BufferedReader

按行生成文件和按大小生成文件都实现了

BufferedReader提供处理字符编码的方式,使用InputStreamReader或者DataInputStream之类的。

    private static void fileRead() throws IOException {
        long time = System.currentTimeMillis();

        int bufSize = 10 * 1024 * 1024;
        byte[] bs = new byte[bufSize];
        ByteBuffer byteBuf = ByteBuffer.allocate(bufSize);
        FileChannel channel = new RandomAccessFile(input_path, "r").getChannel();
        FileWriter fw = null;
        for (int i = 0; channel.read(byteBuf) != -1; i++) {
            byteBuf.rewind();
            int size = byteBuf.limit();
            byteBuf.get(bs);

            fw = new FileWriter(String.format(output_path_format1, i));
            String line = new String(bs, 0, size);
            fw.append(line + System.getProperty("line.separator"));
            fw.flush();
            byteBuf.clear();
        }
        fw.close();
        time = System.currentTimeMillis() - time;
        System.out.println("file read time = " + time);
    }

    private static void bufferRead() throws IOException {
        long time = System.currentTimeMillis();
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(input_path)));

        int bufferSize = 10 * 1024 * 1024;
        BufferedReader in = new BufferedReader(new InputStreamReader(bis, "utf-8"), bufferSize);
        FileWriter fw = new FileWriter(String.format(output_path_format2, 0));

        for (int i = 0; in.ready(); i++) {
            if (i % 100 == 0) {
                fw = new FileWriter(String.format(output_path_format2, i / 100));
            }
            String line = in.readLine();
            fw.append(line + System.getProperty("line.separator"));
            if (i % 100 == 0) {
                fw.flush();
            }
        }
        in.close();
        fw.close();
        time = System.currentTimeMillis() - time;
        System.out.println("buffer read time = " + time);
    }

这是生成大文件的代码,修改for循环次数控制文件大小,下面生成的文件大小是2G左右

    private static String input_path = System.getProperty("user.dir") + File.separator + "data" + File.separator + "bigdata.txt";
    private static String output_path_format1 = System.getProperty("user.dir") + File.separator + "data" + File.separator + "part_1_%s.txt";
    private static String output_path_format2 = System.getProperty("user.dir") + File.separator + "data" + File.separator + "part_2_%s.txt";
    private static  int bufSize = 10 * 1024 * 1024;

     private static void makeBigData() throws IOException {
        FileWriter fw = new FileWriter(input_path);
        String line = "start ";
        for (int i = 0; i < 20000; i++) {
            line += i;
            fw.append(line + System.getProperty("line.separator"));
        }
        fw.flush();
        fw.close();
        System.out.println("end");
    }

因为是自己琢磨的,总感觉写的有点丑,特别是生成大文件那里,希望各位指正一番。

源码地址 https://github.com/247292980/spring-boot 。fork的比star还多什么道理啊。

原文地址:https://www.cnblogs.com/ydymz/p/10141343.html

时间: 2024-11-08 00:49:07

java 读写操作大文件 BufferedReader和RandomAccessFile的相关文章

php学习基础-文件系统(二) 文件读写操作、文件资源处理

一.文件的打开与关闭 /* *读取文件中的内容 * file_get_contents(); //php5以上 * file() * readfile(); * * 不足:全部读取, 不能读取部分,也不能指定的区域 * * fopen() * fread() * fgetc() * fgets() * * * * * 写入文件 * file_put_contents("URL", "内容字符串"); //php5以上 * 如果文件不存在,则创建,并写入内容 * 如果

C/C++关于文件的读写操作以及文件的打开和保存

通过近来的学习,总结一下关于文件的读写操作以及文件的打开和保存的方法. 一.文件的读写操作: (1)C语言对文件的读写操作 在C语言中,对文件的读写操作是用FILE结构体和常用的对文件操作的函数实现的,下面总结一下C语言中对文件操作的常用函数: fopen()   打开以文件名指定的文件 fwrite()  写文件 fread()  读文件 fseek()  移动文件的指针到新的位置通过该函数的参数设定的偏移量和初始位置 rewind()  移动文件的指针到文件流的开始位置,在通常情况下可用fs

使用java api操作Hadoop文件 Robbin

1 package cn.hadoop.fs; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.net.URI; 6 import java.net.URISyntaxException; 7 8 import org.apache.hadoop.conf.Configuration; 9 import org.apache.hadoop.fs.FSDataOutputStream; 10 i

java 流操作对文件的分割和合并的实例详解_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 java 流操作对文件的分割和合并的实例详解 学习文件的输入输出流,自己做一个小的示例,对文件进行分割和合并. 下面是代码: package com.dufy.file; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import jav

java操作大文件复制

1.大文件的复制可以用Java nio中的channel-to-channel传输,Channel-to-channel传输是可以极其快速的,特别是在底层操作系统提供本地支持的时候.某些操作系统可以不必通过用户空间传递数据而进行直接的数据传输.对于大量的数据传输,这会是一个巨大的帮助. 2.代码 package com.dingwang.File; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; i

jdbc mysql crud dao模型 sql注入漏洞 jdbc 操作大文件

day17总结 今日内容 l JDBC 1.1 上次课内容总结 SQL语句: 1.外键约束:foreign key * 维护多个表关系! * 用来保证数据完整性! 2.三种关系: * 一对多: * 一个客户可以对应多个订单,一个订单只属于一个客户! * 建表原则: * 在多的一方创建一个字段,作为外键指向一的一方的主键!!! * 多对多: * 一个学生可以选择多个课程,一个课程也可以被多个学生选择! * 建表原则: * 创建第三张表,第三张表中放入两个字段,作为外键分别指向多对多双方的主键! *

Java高效读取大文件

1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung (http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分. 2.在内存中读取 读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path)); 这种

文件流读写、大文件移动 FileStream StreamWriter

文件流读写 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace _09文件流 { class Program { static void Main(string[] args) { //string msg = "飞流直下三千尺"; ////字符串转字节数组 //byte[] buffer = System.Tex

Java高效读取大文件(转)

1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung(http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分. 2.在内存中读取 读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: 1 2 3 Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path)