java bufferedrandomaccessfile_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() throwsIOException {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= newFileWriter(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() throwsIOException {long time =System.currentTimeMillis();

BufferedInputStream bis= new BufferedInputStream(new FileInputStream(newFile(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() throwsIOException {

FileWriter fw= newFileWriter(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还多什么道理啊。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值