当前位置:编程学习 > JAVA >>

IO流很深奥的问题

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。用指定大小的去读文件也是相同的问题。 IO流 困扰 --------------------编程问答-------------------- 真的很紧急,对流很有研究的但是对我这问题可能不是太明白的,我们可以加QQ交流  --------------------编程问答-------------------- 读取的时候自己建立一个缓冲区,按照流式的处理(从前往后处理,类似于xml的sax解析方法一样),不能直接用split之类的。 --------------------编程问答--------------------
引用 2 楼 rumlee 的回复:
读取的时候自己建立一个缓冲区,按照流式的处理(从前往后处理,类似于xml的sax解析方法一样),不能直接用split之类的。


哦哦,你QQ多少? --------------------编程问答-------------------- 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]);
}
}
}


楼主可以试试,如果能解决问题 请回复下 --------------------编程问答-------------------- 文件不是很大的话, 一次性全读到内存里,然后转成String处理好了。

--------------------编程问答--------------------

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;
}
}
--------------------编程问答-------------------- 没看懂。。。。。。。。 --------------------编程问答-------------------- 同意 5楼 6楼! --------------------编程问答-------------------- 1.如果文件不大,可以直接内存中全部读出来处理
2.还是一行一行的处理,但是在处理每行数据的时候注意
      a)通过indexOf 和  substring来截取字符串,如果最后找不到分隔符了就把剩余的字符串缓存起来
      b)上一行剩余的字符串加上这行新读取出来的字符串拼起来再做处理,如此类推就可以解决
--------------------编程问答-------------------- 用正则表达式分段,然后处理 --------------------编程问答-------------------- 解决问题的思路很重要。。顶下9楼,尽管4楼写了那么多,结果没人看都。。 --------------------编程问答-------------------- 用正则表达式 匹配 别自己打断了.累... --------------------编程问答-------------------- 4楼写那么多,也不鸟人家一下,参考4楼啊。 --------------------编程问答--------------------
引用 13 楼 zlamnz 的回复:
4楼写那么多,也不鸟人家一下,参考4楼啊。


感动的热泪盈眶啊~ --------------------编程问答--------------------
引用 11 楼 sca4441479 的回复:
解决问题的思路很重要。。顶下9楼,尽管4楼写了那么多,结果没人看都。。

我觉得主要原因是你这样写看起来不是很方便 --------------------编程问答-------------------- 写思路是最重要的..... --------------------编程问答-------------------- 文件不是很大的话全部读取出来加载到内容String中,然后处理,直接读Line是行不通的,因为你不能确定你的一个标记规则内是否允许有换行符.
文件很大的话还是按byte的方式读取吧,看了你的输入应该都是英文,直接读byte就可以.像协议处理那样.
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,