java如何读取大文件

hcqhappy 2006-11-07 04:32:20
现在做一个程序 需要对cvs格式的txt文件 操作 读取其中的数据 处理后再写入另一个文件
当测试文件为20K左右时 程序运行正常 可是如果测试数据很多 现在用的 是6m的一个txt文件 原来的程序就出现问题 读取出来的数据都是乱码 请教如何处理
...全文
832 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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,635

社区成员

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

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