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 ...
随机推荐
- angular Dom属性绑定
- Service Fabric 用 Powershell 部署应用到本地
前置说明 安装 Service Fabric SDK,会在本机 C:\Program Files\Microsoft SDKs\Service Fabric\Tools\PSModule\Servic ...
- DFT到FFT的理解
DFT简化计算理解(FFT) DFT: WN=e^(-j*2*pi/N) DFT复杂度o(N^2) 降低与N^2的依赖 使N = LM (L^2+m^2 <= N^2) N点DFT分解为M ...
- rsync服务搭建--2018.5.8 [优化后最终版]
2018年5月8日 22:09:38 第一步配置基础环境(按照自己的规划配置并非每人的环境都一致) 第一台服务器(RSYNC服务器): rsync外网地址:10.0.0.41 rsync内网地址:1 ...
- Codeforces Round #545 (Div. 2)C(离散化,思维,PAIR排序)
#include<bits/stdc++.h>using namespace std;int a[1007][1007];pair<int,int>p1[1007],p2[10 ...
- kali linux之手动漏洞挖掘一
默认安装漏洞 phpmyadmin/setup默认安装 ubuntu/debian默认安装php5-cgi phpmyadmin/setup默认安装 使用?-d+allow_url_include%3 ...
- 用Hadoop,还是不用Hadoop?
本文由 伯乐在线 - Lex Lian 翻译.英文出处:Anand Krishnaswamy.欢迎加入翻译小组. Hadoop通常被认定是能够帮助你解决所有问题的唯一方案. 当人们提到“大数据”或是“ ...
- Nagios监控平台搭建及配置文件详解
Nagios是一款开源的免费网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报警第一时间通知网站运维人员, ...
- c语言数据结构学习心得——树
树 一对多的树型结构,有且只有一个特定的根结点. 结点的度:结点拥有子树的数量{ 度为0:叶子结点/终端结点. 度不为0:非终端结点/分支结点(除去根结点其它称为内部结点).} 树的度:树中所有结点的 ...
- TX2 自制底板不识别USB
目的:解决自制的底板无法识别USB,使能3个UART接口,使能3个SPI接口. Jetpack版本:Jetpack-3.1 虚拟机:ubuntu14.04 使用dtb文件夹下的文件替换刷机包../64 ...