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'~'Den#@#@#56'~'Djibouti#@#@#57'~'Dominica#@#@#58'~'Dominican Republic#@#@#60'~'Ecuador#@#@#61'~'Egypt#@#@#62'~'El Salvador#@#@#63'~'Equatorial Guinea#@#@#就像以上一段字符串,我需要从文本中读取出来。然后存入数据库,分析格式是这样的,'~'为分隔不同字段的数据,#@#@#分隔为不同组。  
问题是我用流去读取的时候比如说读取一行一行的,读取一行末尾不是以#@#@#结尾而是#@#之列的,就会把字段弄混了,出现bug。用指定大小的去读文件也是相同的问题。IO流困扰

解决方案 »

  1.   

    读取的时候自己建立一个缓冲区,按照流式的处理(从前往后处理,类似于xml的sax解析方法一样),不能直接用split之类的。
      

  2.   

    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]);
    }
    }
    }
    楼主可以试试,如果能解决问题 请回复下
      

  3.   

    文件不是很大的话, 一次性全读到内存里,然后转成String处理好了。
      

  4.   


    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.   

    1.如果文件不大,可以直接内存中全部读出来处理
    2.还是一行一行的处理,但是在处理每行数据的时候注意
          a)通过indexOf 和  substring来截取字符串,如果最后找不到分隔符了就把剩余的字符串缓存起来
          b)上一行剩余的字符串加上这行新读取出来的字符串拼起来再做处理,如此类推就可以解决
      

  6.   

    文件不是很大的话全部读取出来加载到内容String中,然后处理,直接读Line是行不通的,因为你不能确定你的一个标记规则内是否允许有换行符.
    文件很大的话还是按byte的方式读取吧,看了你的输入应该都是英文,直接读byte就可以.像协议处理那样.