Java读写大文本文件(2GB以上)

如下的程序,将一个行数为fileLines的文本文件平均分为splitNum个小文本文件,其中换行符‘r‘是linux上的,windows的java换行符是‘\r\n‘:

  1. package kddcup2012.task2.FileSystem;
  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedReader;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileWriter;
  7. import java.io.IOException;
  8. import java.io.InputStreamReader;
  9. public class FileSplit
  10. {
  11. public static void main(String[] args) throws IOException
  12. {
  13. long timer = System.currentTimeMillis();
  14. int bufferSize = 20 * 1024 * 1024;//设读取文件的缓存为20MB
  15. //建立缓冲文本输入流
  16. File file = new File("/media/Data/毕业设计/kdd cup/数据/userid_profile.txt");
  17. FileInputStream fileInputStream = new FileInputStream(file);
  18. BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
  19. InputStreamReader inputStreamReader = new InputStreamReader(bufferedInputStream);
  20. BufferedReader input = new BufferedReader(inputStreamReader, bufferSize);
  21. int splitNum = 112-1;//要分割的块数减一
  22. int fileLines = 23669283;//输入文件的行数
  23. long perSplitLines = fileLines / splitNum;//每个块的行数
  24. for (int i = 0; i <= splitNum; ++i)
  25. {
  26. //分割
  27. //每个块建立一个输出
  28. FileWriter output = new FileWriter("/home/haoqiong/part" + i + ".txt");
  29. String line = null;
  30. //逐行读取,逐行输出
  31. for (long lineCounter = 0; lineCounter < perSplitLines && (line = input.readLine()) != null; ++lineCounter)
  32. {
  33. output.append(line + "\r");
  34. }
  35. output.flush();
  36. output.close();
  37. output = null;
  38. }
  39. input.close();
  40. timer = System.currentTimeMillis() - timer;
  41. System.out.println("处理时间:" + timer);
  42. }
  43. }

以上程序处理大文本文件只需要30MB左右的内存空间(这和所设的读取缓冲大小有关),但是速度不是很快,在磁盘没有其他程序占用的情况下,将200MB文件分割为112份需要20秒(机器配置:Centrino2 P7450 CPU,2GB DDR3内存,Ubuntu 11.10系统,硬盘最大读写速度大约60MB/S)。

另外,对于几百兆到2GB大小的文件,使用内存映射文件的话,速度会块一些,但是内存映射由于映射的文件长度不能超过java中int类型的最大值,所以只能处理2GB以下的文件。

时间: 2024-08-05 11:17:07

Java读写大文本文件(2GB以上)的相关文章

Java查询大文本文件的处理方法

有时我们需要查询大文本而不是数据库,这时就需要流式读入文件并实现查询算法,还要进行并行处理以提高性能.但JAVA本身缺少相应的类库,需要硬编码才能实现结构化文件计算,代码复杂且可读性差,难以实现高效的并行处理. 使用免费的集算器可以弥补这一不足.集算器封装了丰富的结构化文件读写和游标计算函数,书写简单代码就能实现并行计算,并提供了易用的JDBC接口.JAVA应用程序可以将集算器脚本文件当做数据库存储过程执行,传入参数并用JDBC获得返回结果. 集算器与Java应用程序的集成结构如下: 下面举例说

java读取大文本文件

原文:http://blog.csdn.net/k21325/article/details/53886160 小文件当然可以直接读取所有,然后放到内存中,但是当文件很大的时候,这个方法就行不通了,内存不是这么玩的~~ 那么,下面是解决方法: 1.Java底层:调用java的java.util.Scanner类扫描文件内容,一行一行,连续读取 FileInputStream inputStream = null; Scanner sc = null; try { inputStream = ne

java filechannel大文件的读写

java读取大文件 超大文件的几种方法 转自:http://wgslucky.blog.163.com/blog/static/97562532201332324639689/ java 读取一个巨大的文本文件既能保证内存不溢出又能保证性能 2010-09-25 11:18:50|  分类: 默认分类 |字号 订阅 import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.

Java查询大文本

但JAVA本身缺少相应的类库,需要硬编码才能实现结构化文件计算,代码复杂且可读性差,难以实现高效的并行处理. 使用免费的集算器可以弥补这一不足.集算器封装了丰富的结构化文件读写和游标计算函数,书写简单代码就能实现并行计算,并提供了易用的JDBC接口.JAVA应用程序可以将集算器脚本文件当做数据库存储过程执行,传入参数并用JDBC获得返回结果 下面举例说明集算器协助JAVA查询大文本的过程. 源数据sOrder.txt如下: 要查询起止时间是startDate.endDate之间,金额大于argA

[PHP学习教程]003.高速读写大数据“二进制”文件,不必申请大内存(Byte Block)

引言:读写大“二进制”文件,不必申请很大内存(fopen.fread.fwrite.fclose)!做到开源节流,提高速度! 每天告诉自己一次,『我真的很不错』.... 加速读写大文件,在实际工作过程当中其实想必很多人都有这样的经历-大家知道,如果使用记事本(notepad)打开10M的文本文件,那会卡到无响应,但是如果使用Sublime或者Notepad++则瞬间打开. 不展开讲了,接口简单,多说无益,直接上码. 函数 <?php /** * 读写大二进制文件,不必申请很大内存 * 只有读取到

Java读写资源文件类Properties

Java中读写资源文件最重要的类是Properties 1) 资源文件要求如下: 1.properties文件是一个文本文件 2.properties文件的语法有两种,一种是注释,一种属性配置. 注    释:前面加上#号 属性配置:以“键=值”的方式书写一个属性的配置信息. 3.properties文件的一个属性配置信息值可以换行,但键不可以换行.值换行用“\”表示. 4.properties的属性配置键值前后的空格在解析时候会被忽略. 5.properties文件可以只有键而没有值.也可以仅

java读写

IO流下分为字节流与字符流,每个流又分为输入输出以及读写. 字节流的两个基类为InputStream与OutputStream. 字符流为Reader和Writer 一般的缓冲流读写字符: BufferedReader br = new BufferedReader(new FileReader("b.txt")); 如果有编码格式的话使用: BufferedReader br = new BufferedReader(new InputStreamReader(new FileInp

读取大文本文件

目录 大容量文件读写并统计 #思路 io流的初始化 Treemap的建立和读取起点 判断是否为出现最多 结果 参考 大容量文件读写并统计 https://www.cnblogs.com/outmanx/p/9694493.html 在这个项目的基础上,我稍作了修改,并能让程序进行低占存的大文本文件读写,并统计出行数和出现最多的字符串 #思路 参考https://www.cnblogs.com/zhujiabin/p/5660541.html的思路,通过RandomAccessfile的类方法进行

java读写文件

读文件 package tool; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.OutputStreamWriter; public class ReadFile { pu