IO流很深奥的问题

x1aoweiliang 2013-10-08 09:56:33
1'~'Afghanistan#@#@#2'~'Albania#@#@#3'~'Algeria#@#@#5'~'Andorra#@#@#6'~'Angola#@#@#7'~'Anguilla#@#@#8'~'Antarctica#@#@#9'~'Antigua & Barbuda#@#@#10'~'Argentina#@#@#11'~'Armenia#@#@#12'~'Aruba#@#@#13'~'Australia#@#@#14'~'Austria#@#@#15'~'Azerbaijan#@#@#16'~'Bahamas#@#@#17'~'Bahrain#@#@#18'~'Bangladesh#@#@#19'~'Barbados#@#@#20'~'Belarus#@#@#21'~'Belgium#@#@#22'~'Belize#@#@#23'~'Benin#@#@#24'~'Bermuda#@#@#25'~'Bhutan#@#@#26'~'Bolivia#@#@#27'~'Bosnia-Herzegovina#@#@#28'~'Botswana#@#@#30'~'Brazil#@#@#31'~'Brunei#@#@#32'~'Bulgaria#@#@#33'~'Burkina Faso#@#@#34'~'Burundi#@#@#35'~'Cambodia#@#@#36'~'Cameroon#@#@#37'~'Canada#@#@#38'~'Cape Verde#@#@#39'~'Cayman Islands#@#@#40'~'Central African Republic#@#@#41'~'Chad#@#@#42'~'Chile#@#@#43'~'China#@#@#46'~'Colombia#@#@#47'~'Comoros#@#@#48'~'Republic of the Congo#@#@#49'~'Cook Islands#@#@#50'~'Costa Rica#@#@#51'~'Croatia#@#@#52'~'Cuba#@#@#53'~'Cyprus#@#@#54'~'Czech Republic#@#@#55'~'Denmark#@#@#56'~'Djibouti#@#@#57'~'Dominica#@#@#58'~'Dominican Republic#@#@#60'~'Ecuador#@#@#61'~'Egypt#@#@#62'~'El Salvador#@#@#63'~'Equatorial Guinea#@#@#

就像以上一段字符串,我需要从文本中读取出来。然后存入数据库,分析格式是这样的,'~'为分隔不同字段的数据,#@#@#分隔为不同组。
问题是我用流去读取的时候比如说读取一行一行的,读取一行末尾不是以#@#@#结尾而是#@#之列的,就会把字段弄混了,出现bug。用指定大小的去读文件也是相同的问题。
...全文
505 17 打赏 收藏 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐的2 2013-10-25
  • 打赏
  • 举报
回复
文件不是很大的话全部读取出来加载到内容String中,然后处理,直接读Line是行不通的,因为你不能确定你的一个标记规则内是否允许有换行符. 文件很大的话还是按byte的方式读取吧,看了你的输入应该都是英文,直接读byte就可以.像协议处理那样.
我现在在路上 2013-10-24
  • 打赏
  • 举报
回复
写思路是最重要的.....
白开水MD5 2013-10-24
  • 打赏
  • 举报
回复
引用 11 楼 sca4441479 的回复:
解决问题的思路很重要。。顶下9楼,尽管4楼写了那么多,结果没人看都。。
我觉得主要原因是你这样写看起来不是很方便
sca4441479 2013-10-24
  • 打赏
  • 举报
回复
引用 13 楼 zlamnz 的回复:
4楼写那么多,也不鸟人家一下,参考4楼啊。
感动的热泪盈眶啊~
zlamnz 2013-10-11
  • 打赏
  • 举报
回复
4楼写那么多,也不鸟人家一下,参考4楼啊。
无聊找乐 2013-10-08
  • 打赏
  • 举报
回复
文件不是很大的话, 一次性全读到内存里,然后转成String处理好了。
sca4441479 2013-10-08
  • 打赏
  • 举报
回复
package cn.com.io; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class FileRead { static FileReader fr=null; static char[] ch=new char[8192]; static List list=new ArrayList<String[]>(); String[] s=new String[2]; public static void main(String[] args) { read("D:\\javatest\\新建文本文档.txt"); print(list); } public static void read(String path){ int n=0; try { fr=new FileReader(new File(path)); try { while(fr.read(ch, 0, ch.length)!=-1){ String st=new String(ch); String sp[]=st.split("'~'"); for(String str:sp){ String sp1[]=str.split("#@#@#"); if(sp1.length==2){ list.add(sp1); } } String st1=st.substring(st.length()-3); if((n=st1.indexOf("'~'"))!=-1||(n=st1.indexOf('#'))!=-1){ ch=new char[n]; continue; } ch=new char[8192]; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void print(List<String[]> listStr){ for(String[] str:listStr){ System.out.println(str[0]+"\t"+str[1]); } } } 楼主可以试试,如果能解决问题 请回复下
x1aoweiliang 2013-10-08
  • 打赏
  • 举报
回复
引用 2 楼 rumlee 的回复:
读取的时候自己建立一个缓冲区,按照流式的处理(从前往后处理,类似于xml的sax解析方法一样),不能直接用split之类的。
哦哦,你QQ多少?
rumlee 2013-10-08
  • 打赏
  • 举报
回复
读取的时候自己建立一个缓冲区,按照流式的处理(从前往后处理,类似于xml的sax解析方法一样),不能直接用split之类的。
x1aoweiliang 2013-10-08
  • 打赏
  • 举报
回复
真的很紧急,对流很有研究的但是对我这问题可能不是太明白的,我们可以加QQ交流
骑单车看夕阳 2013-10-08
  • 打赏
  • 举报
回复
用正则表达式 匹配 别自己打断了.累...
sca4441479 2013-10-08
  • 打赏
  • 举报
回复
解决问题的思路很重要。。顶下9楼,尽管4楼写了那么多,结果没人看都。。
livend 2013-10-08
  • 打赏
  • 举报
回复
用正则表达式分段,然后处理
安特矮油 2013-10-08
  • 打赏
  • 举报
回复
1.如果文件不大,可以直接内存中全部读出来处理 2.还是一行一行的处理,但是在处理每行数据的时候注意 a)通过indexOf 和 substring来截取字符串,如果最后找不到分隔符了就把剩余的字符串缓存起来 b)上一行剩余的字符串加上这行新读取出来的字符串拼起来再做处理,如此类推就可以解决
赏金--猎人 2013-10-08
  • 打赏
  • 举报
回复
同意 5楼 6楼!
valid25f 2013-10-08
  • 打赏
  • 举报
回复
没看懂。。。。。。。。
尘缘udbwcso 2013-10-08
  • 打赏
  • 举报
回复

line = "";
while(){
	line = line + readLine();
	String[] str = line.split("#@#@#");
	String tmp = str[str.length - 1];
	if(tmp.endWith("#") || tmp.endWith("@")){
		line = tmp;
		处理str中下标从0到str.length - 2;
	}else{
		处理str中下标从0到str.length - 1;
	}
}

62,620

社区成员

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

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