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左右
ps.
操作文件时,尽量使用以下动态的的符号
File.separator是分隔符不同系统是不一样的
System.getProperty("line.separator")是换行符不同系统是不一样的
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还多什么道理啊。
java 读写操作大文件 BufferedReader和RandomAccessFile的更多相关文章
- Java快速读取大文件
Java快速读取大文件 最近公司服务器监控系统需要做一个东西来分析Java应用程序的日志. 第一步探索: 首先我想到的是使用RandomAccessFile,因为他可以很方便的去获取和设置文件指针,下 ...
- 使用JAVA读写Properties属性文件
使用JAVA读写Properties属性文件 Properties属性文件在JAVA应用程序中是经常可以看得见的,也是特别重要的一类文件.它用来配置应用程序的一些信息,不过这些信息一般都是比较少的数 ...
- java 流操作对文件的分割和合并的实例详解_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 java 流操作对文件的分割和合并的实例详解 学习文件的输入输出流,自己做一个小的示例,对文件进行分割和合并. 下面是代 ...
- jdbc mysql crud dao模型 sql注入漏洞 jdbc 操作大文件
day17总结 今日内容 l JDBC 1.1 上次课内容总结 SQL语句: 1.外键约束:foreign key * 维护多个表关系! * 用来保证数据完整性! 2.三种关系: * 一对多: * 一 ...
- java 读写properties (配置)文件
Properties属性文件在Java应用程序中是经常可以看得见的,也是特别重要的一类文件.它用来配置应用程序的一些信息,不过这些信息一般都是比较少的数据,没有必要使用数据库文件来保存,而使用一般的文 ...
- 【基础巩固】文件流读写、大文件移动 FileStream StreamWriter File Path Directory/ ,m资料管理器(递归)
C#获取文件名 扩展名 string fullPath = @"d:\test\default.avi"; string filename = Path.GetFileName(f ...
- java+上传大文件
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...
- java+批量下载大文件
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...
- java 上传大文件以及文件夹
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...
随机推荐
- 「CF622F」The Sum of the k-th Powers「拉格朗日插值」
题意 求\(\sum_{i=1}^n i^k\),\(n \leq 10^9,k \leq 10^6\) 题解 观察可得答案是一个\(k+1\)次多项式,我们找\(k+2\)个值带进去然后拉格朗日插值 ...
- leetcode 106. 从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inorder and Postorder Traversal)
目录 题目描述: 示例: 解法: 题目描述: 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 示例: 给出 中序遍历 inorder = [9,3,15,20,7] ...
- Ubuntu下安装部署MongoDB以及设置允许远程连接
最近因为项目原因需要在阿里云服务器上部署MongoDB,操作系统为Ubuntu,网上查阅了一些资料,特此记录一下步骤. 1.运行apt-get install mongodb命令安装MongoDB服务 ...
- IntersectionObserver
创建对象 var io = new IntersectionObserver(callback, option); IntersectionObserver是浏览器原生提供的构造函数,接受两个参数:c ...
- 洛谷 P3695 CYaRon!语 题解 【模拟】【字符串】
大模拟好啊! 万一远古计算机让我写个解释器还真是得爆零了呢. 题目背景 「千歌です」(我是千歌).「曜です」(我是曜).「ルビィです」(我是露比).「3人合わせて.We are CYaRon! よろし ...
- HDU 6351 (带技巧的暴力)
题意:给定一个数,和一个最多交换次数k,问在不超过k次操作的情况,问可以得到的最大值和最小值是多少? 个人解题的艰辛路程 , 开始是想到了暴力枚举的可能 , 打出来发现在判断枚举的数组与原来数组交换了 ...
- 江西理工大学南昌校区排名赛 F: 单身狗的骑马游戏
题目描述 萌樱花是一只单身狗. 萌樱花今天在学姐那里做了一道题: 假设赛马场上有n只马儿,第i只马儿的起点在第i米的位置,这些马儿都会朝着同一个方向奔跑. 每只马儿的速度都不一样,而且大家都不知道这些 ...
- 天梯赛easy题
2 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> ...
- SpringBoot 精简笔记
0. Fundamental a. @SpringBootApplication //启动类 b. pom.xml //Maven基本依赖 <parent> <groupId> ...
- Promise 多重链式调用
Promise对象是用于异步操作的. Promise的真正强大之处在于它的多重链式调用,可以避免层层嵌套回调.如果我们在第一次ajax请求后,还要用它返回的结果再次请求呢? 使用Promise,我们就 ...