java如何读取大文件

hcqhappy 2006-11-07 04:32:20
现在做一个程序 需要对cvs格式的txt文件 操作 读取其中的数据 处理后再写入另一个文件
当测试文件为20K左右时 程序运行正常 可是如果测试数据很多 现在用的 是6m的一个txt文件 原来的程序就出现问题 读取出来的数据都是乱码 请教如何处理
...全文
828 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
andlyLiu2013 2010-06-11
  • 打赏
  • 举报
回复
我的是20M 的没搞出了,结果就…… 很严重……
我那个是比较ip txt中是ip段
  • 打赏
  • 举报
回复
6M是不大,你们最大读的是多大,上百M的话,读起来很慢,有没有好的办法。有什么来读比较好,还有可能是上G的文件怎么读
hcqhappy 2006-11-12
  • 打赏
  • 举报
回复
新的问题
文件是unicode 格式的 这个就是引起乱码的原因 请问如果读取才可以正确显示汉字呢 还有读取后 处理后 也写入一个unicode 中
请大家指导下 谢谢
JAVA_WEB 2006-11-09
  • 打赏
  • 举报
回复
用nio吧
softdn2 2006-11-09
  • 打赏
  • 举报
回复
6M很小的。用BUFFER吧。然后你乱码可能分割什么的问题


------ 以下是签名 ------
SoftDN.com, 提供免费的项目管理平台:SVN仓库、需求管理、BUG跟踪、任务管理、在线论坛、网站空间、项目存储及完整的备份等。欢迎网友光临建立项目,开创自己的梦想。
地址:http://www.softdn.com http://www.softdn.cn
d5aaron 2006-11-09
  • 打赏
  • 举报
回复
6m 真的不算大.

如果txt规定了具体格式的话(如 一行一条记录之类的)建议用BufferedReader读

不然,二进制的只能用InputStream读了.

另外,乱码的话,感觉是你一次文件独得不完全,造成解码失败.
angelleecash 2006-11-09
  • 打赏
  • 举报
回复
我认为应该根据换行的标记(lz好像用的是TAB)来确定每一行的内容,读出来,处理,然后下一行这样速度不会损失,也会占用最小的内存,我的想法大概是
final int BUFFER_SIZE = 256;
final String ENCODING = "UTF-8";
InputStream is = getClass().getResourceAsStream("cvs.txt");
byte b = -1;
byte newLine = '\t';
byte[] buffer = new byte[BUFFER_SIZE];
String content = null;
int counter = 0;
try {
while ((b = (byte) is.read()) != -1) {
if (b != newLine) {
buffer[counter++] = b;
}else{
//已经到了此行的结尾,可以对buffer中的数据进行处理了
content = new String(buffer,0,counter,ENCODING);
//然后处理
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
hbwhwang 2006-11-09
  • 打赏
  • 举报
回复
试试这个:
BufferedReader in=new BufferedReader(new FileReader("1.txt"));
hcqhappy 2006-11-09
  • 打赏
  • 举报
回复
File file = new File("1.txt");
BufferedReader in = new BufferedReader(new InputStreamReader(
new FileInputStream(file)));
String line = in.readLine();

我这么读的
hbwhwang 2006-11-09
  • 打赏
  • 举报
回复
用BufferedReader,按字符读!
不要用Stream,InputStream是按字节读的,所以有乱码了
千里冰封820 2006-11-08
  • 打赏
  • 举报
回复
你可以一部分一部分读,没有必要全部一次性读入内存
hcqhappy 2006-11-08
  • 打赏
  • 举报
回复
1/10/2006 00:04:09 86-29-88986203 86-29-88986203 陕西 西安 86-29-81944866 陕西 西安 Outgoing Message CTC(PHS) 35 Call was answered

这个是完整的一样 数据用tab分割的
hcqhappy 2006-11-08
  • 打赏
  • 举报
回复
肯定有问题的 下边是文件的内容 他是一个cvs的txt文件 要读取数据进行处理 按行读取 用stream 怎么才能分割的正好的呢 搞不定 那位帮忙 谢谢

1/10/2006 00:04:09 86-29-88986203 86-29-88986203 陕西 西安 86-29-81944866 陕西 西安 Outgoing Message CTC(PHS) 35 Call was answered
01/10/2006 00:04:50 86-29-88986203 86-29-81944866 陕西 西安 86-29-88986203 陕西 西安 Reply CTC(PHS) 17 Call was answered
01/10/2006 00:16:02 86-29-81265732 86-29-81265732 陕西 西安 86-29-83079593 陕西 西安 Outgoing Message CTC(PHS) 24 Call was answered
01/10/2006 00:18:18 86-29-81265732 86-29-81265732 陕西 西安 86-29-81068734 陕西 西安 Outgoing Message CTC(PHS) 33 Call was answered
捏造的信仰 2006-11-08
  • 打赏
  • 举报
回复
用 stream 一部分一部分的读。
healer_kx 2006-11-07
  • 打赏
  • 举报
回复
6MB太小了...100来兆都不大,你就读吧...
mengfanpp 2006-11-07
  • 打赏
  • 举报
回复
分次读取,一次读多少,处理完成后再继续读。

应该会有搂主说的问题,我原来的同事好像碰到过。
mathsfan 2006-11-07
  • 打赏
  • 举报
回复
看不懂了
hcqhappy 2006-11-07
  • 打赏
  • 举报
回复
谁能帮忙写个用缓存 分次读取 数据 然后分析 操作后 在读取下一部分的程序
angelleecash 2006-11-07
  • 打赏
  • 举报
回复
如果没有多线程的话,不应该乱码吧,不知道,帮顶
  • 打赏
  • 举报
回复
楼主把CVS的内容都用一个有效的记录填充,如果在几十K之内没问题,看看在几十M的时候有没有问题。如果真有数量限制,也可以测出来究竟临界值是多大。然后再说其余的。
加载更多回复(1)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧