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

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

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还多什么道理啊。

最新文章

  1. NPOI读取Excel帮助类,支持xls与xlsx,实现公式解析,空行的处理
  2. .net混淆、反编译工具调查
  3. 第二章平稳时间序列模型——ACF和PACF和样本ACF/PACF
  4. SQL Server 2014 BI新特性(三)Power Query和Power Map功能预览
  5. 【转】前端精选文摘:BFC 神奇背后的原理
  6. [javascirpt] Regex
  7. windows不能在本地计算机启动SQL Server(MSSQLSERVER)
  8. sqlserver 增加用户并分配权限
  9. iOS ... NS_REQUIRES_NIL_TERMINATION
  10. iOS 用户密码 数字字母特殊符号设置 判断
  11. SpaceSyntax【空间句法】之DepthMapX学习:第二篇 输出了什么东西 与 核心概念
  12. 前端笔记知识点整合之JavaScript(二)关于运算符&amp;初识条件判断语句
  13. Your accoutn already has a valid IOS Distribution certificate
  14. Quartz.Net分布式任务管理平台
  15. v-for
  16. Rhino
  17. 修改 Input placeholder 的样式
  18. Jquery2 基础核心
  19. php5.4.0以后加入trait实现代码复用【摘录】
  20. WebLogic 1036的镜像构建

热门文章

  1. 解决golang windows调试问题:Could not determine version number: could not find symbol value for runtime.buildVersion
  2. 微信H5或PC支付常见问题汇总
  3. Android手机中怎么样在没root的情况下 修改 hosts 文件
  4. Python爬虫:带参url的拼接
  5. Eclipse 使用TFS
  6. 删除outlook2007账户
  7. Android---16进制与字节数组
  8. Tomcat 配置文件的解析
  9. Qt 学习之路 2(27):渐变
  10. Android Activity实例应用(选择QQ头像)