我有一个ini文件的读取,是照以前做的一个C语言改过来的,所以风格像C语言,不过还是挺好用,代码如下:test_getini.java文件:import java.io.*;public class test_getini
{
public static void main(String args[])
{
String s_rtn1="";
String value1="";
String s_section="file_path";
String s_key="client";
String s_section_list1[]=new String[100];
int i=0,i_count=0;
c_get_ini getit=new c_get_ini();

s_rtn1=getit.get_ini("config.ini",s_section,s_key,2);
System.out.println("return value in main is: {"+s_rtn1+"}");

i_count=getit.get_key_count("config.ini",s_section,s_key);
System.out.println("key count: "+i_count);

i_count=getit.get_section_list("config.ini",s_section_list1);
System.out.println("section count: "+i_count);
for(i=0;i<i_count;i++)
System.out.println("section "+(i+1)+" :  "+s_section_list1[i]);
}
}
class c_get_ini
{
private final int MAX_LINE=1000;
private String s_fileContent[]=new String[MAX_LINE];
private int i_fileLineCount=0;

public String get_ini(String s_fileName,String s_section,String s_key,int i_num)
{
String s_value="";
int i=0,i_sameKeyCount=0;
int i_t1=0,i_t2=0;
String s_line="",s_section_temp="",s_key_temp="";
    if(i_num<=0)
    {
     System.out.println("the parameter 'i_num' cann't below zero!");
     return "not_found";
    }

//read file
    file_string fs1=new file_string();    
    i_fileLineCount=fs1.file2string(s_fileName,s_fileContent);
    
    for(i=0;i<i_fileLineCount;i++)
    {
     if(s_fileContent[i].startsWith("#"))
     {
     //System.out.println("the "+i+" line is a comment!");
     continue;
     }
     s_line=s_fileContent[i].trim();
     if(!((s_line.startsWith("["))&&(s_line.endsWith("]"))))
     {
     //System.out.println("this line not a section,   line number:"+i);
     continue;
     }
     i_t1=s_fileContent[i].indexOf("[");
     i_t2=s_fileContent[i].indexOf("]");
     s_section_temp=s_fileContent[i].substring(i_t1+1,i_t2).trim();
     //System.out.println("current section is : "+s_section_temp);
     if(!(s_section_temp.equals(s_section)))
     {
     //System.out.println("current section is not which you want");
     continue;
     }
     i_sameKeyCount=0;
    
     while(true)
     {
     i++; //进入文件下一行
     if(i==i_fileLineCount) //若到文件尾
     return "not_found";
     if((s_fileContent[i].startsWith("["))&&(s_fileContent[i].endsWith("]")))
     return "not_found";
     i_t1=s_fileContent[i].indexOf("=");
     if(!(i_t1>0))
     continue;
     s_key_temp=s_fileContent[i].substring(0,i_t1).trim();
     //System.out.println("current line key is : "+s_key_temp);    
     if(!(s_key_temp.equals(s_key)))
     {
     //System.out.println("unequal--> s_key_temp:'"+s_key_temp+"'\t"+"s_key:'"+s_key+"'");
     continue;
     }
     i_sameKeyCount++;     i_t2=s_fileContent[i].length();
     s_value=s_fileContent[i].substring(i_t1+1,i_t2).trim();    
     if(i_num==i_sameKeyCount)
     {
     //System.out.println("success return: "+s_value);
     return s_value;
     }
     else
     {
     //System.out.println("fetch value is: "+s_value);
     continue;
     }    
     } //end while(true);
    
    } //end for
    return "not_found";
} //end get_ini()

  public int get_key_count(String s_fileName,String s_section,String s_key)
  {
String s_value="";
int i=0,i_sameKeyCount=0;
int i_t1=0,i_t2=0;
String s_line="",s_section_temp="",s_key_temp="";

try
{
//read file
    file_string fs1=new file_string();    
    i_fileLineCount=fs1.file2string(s_fileName,s_fileContent);
    
    for(i=0;i<i_fileLineCount;i++)
    {
     if(s_fileContent[i].startsWith("#"))
     {
     //System.out.println("the "+i+" line is a comment!");
     continue;
     }
     s_line=s_fileContent[i].trim();
     if(!((s_line.startsWith("["))&&(s_line.endsWith("]"))))
     {
     //System.out.println("this line not a section,   line number:"+i);
     continue;
     }
     i_t1=s_fileContent[i].indexOf("[");
     i_t2=s_fileContent[i].indexOf("]");
     s_section_temp=s_fileContent[i].substring(i_t1+1,i_t2).trim();
     //System.out.println("current section is : "+s_section_temp);
     if(!(s_section_temp.equals(s_section)))
     {
     //System.out.println("current section is not which you want");
     continue;
     }
     i_sameKeyCount=0;
    
     while(true)
     {
     i++; //进入文件下一行
     if((i==i_fileLineCount)&&(i_sameKeyCount>0)) //若到文件尾
     return i_sameKeyCount;
    if(i==i_fileLineCount)
    return 0;      if((s_fileContent[i].startsWith("["))&&(s_fileContent[i].endsWith("]"))&&(i_sameKeyCount>0))
     return i_sameKeyCount;
     if((s_fileContent[i].startsWith("["))&&(s_fileContent[i].endsWith("]")))
     return 0;
     i_t1=s_fileContent[i].indexOf("=");
     if(!(i_t1>0))
     continue;
     s_key_temp=s_fileContent[i].substring(0,i_t1).trim();
     //System.out.println("current line key is : "+s_key_temp);    
     if(!(s_key_temp.equals(s_key)))
     {
     //System.out.println("unequal--> s_key_temp:'"+s_key_temp+"'\t"+"s_key:'"+s_key+"'");
     continue;
     }
     i_sameKeyCount++;

     } //end while(true);
    
    } //end for
    return 0;
  }
  catch(Exception e)
  {
     return 0;
    }
  } //end get_key_count()
  
  //返回指定配置文件的小节的个数和内容
  public int get_section_list(String s_fileName,String s_section_list[])
  {
   int i_count_section=0;
   //---------------
int i=0;
int i_t1=0,i_t2=0;
String s_line="",s_section_temp=""; try
{
//read file
    file_string fs1=new file_string();    
    i_fileLineCount=fs1.file2string(s_fileName,s_fileContent);
    
    i_count_section=0;
    for(i=0;i<i_fileLineCount;i++)
    {
     if(s_fileContent[i].startsWith("#"))
     {
     //System.out.println("the "+i+" line is a comment!");
     continue;
     }
     s_line=s_fileContent[i].trim();
     if(!((s_line.startsWith("["))&&(s_line.endsWith("]"))))
     {
     //System.out.println("this line not a section,   line number:"+i);
     continue;
     }
     i_t1=s_fileContent[i].indexOf("[");
     i_t2=s_fileContent[i].indexOf("]");
     s_section_temp=s_fileContent[i].substring(i_t1+1,i_t2).trim();
     s_section_list[i_count_section]=s_section_temp;
     i_count_section++;
     //System.out.println("current section is : "+s_section_temp);
    
    } //end for

   //---------------
   return i_count_section;
  }
  catch(Exception ee3)
  {
   System.out.println("Error in get_section_list: "+ee3);
   return 0;
  }
  } //end get_section_list()

} //end class c_get_ini
class file_string
{
public int file2string(String fileName,String Result[])
{
int pointer=0;
boolean done=false;
try
{
File file_in = new File(fileName);
BufferedReader in=new BufferedReader(new FileReader(file_in)); //read the file content and put it into array:Result[]
while(!done)
{
Result[pointer]=in.readLine();
if(Result[pointer]==null)
done=true;
else
pointer++;
}
                        in.close();
return pointer;
}
catch(IOException e)
{
System.out.println("Error: "+e);
return 0;
}
} public int string2file(String Source[],String fileName,int lineCount)
{
int i;
try
{
File file_out=new File(fileName);
PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter(file_out)));
for(i=0;i<lineCount;i++)
{
out.println(Source[i]);
//System.out.println(Source[i]);
}
out.flush();
                        out.close();
return i;
}
catch(IOException e)
{
System.out.println("Error: "+e);
return 0;
}
}
}

解决方案 »

  1.   

    不知道为什么,贴上来的代码没有缩进。上例中用到的config.ini文件内容如下(文件中空格、tab可以随意加):
    #You can add comment in config file, 
    #but the comment line should begin with the symbol "#" as this config file.[transfer_mode]
    mode=2 [  address  ]  
    ip  = 196.97.1.168  
     ip=aaaa
    ip=asdf[file_path]
    client =  D:\MyCode\  
    server= /data/biller/tuxftp/tt/  
    client=  D:\asdf  [filetype]
    type=*.wf
      

  2.   

    对于java的文件操作,没有太好的类,其实不仅仅是java,就是其他的语言也不会有太好的办法。
    在java中一个StringTokenizer的类,这个类,可以根据分割符,自动的提取数据,在C/C++中也有类似的函数,之前使用BufferedReader读取数据,这样相对要好一些,
    下面是一个简单的例子import java.io.*;
    import java.util.*;
    import java.sql.*;public class LoadFile
    {
    public static void main(String[] Args){
        String sGetOneLine;
        String sTemplateFileName = new String("e:\\temp\\Cargo1.txt"); 
        /******
         *tag is "/"
         */
        Vector RecordTagPlaceBuffer = new Vector(); 
        try{
    BufferedReader readfileobject = new BufferedReader(new FileReader(sTemplateFileName));
    while ((sGetOneLine = readfileobject.readLine()) != null){
        StringTokenizer st = new StringTokenizer(sGetOneLine,"/");
        while(st.hasMoreTokens()){
         System.out.println(st.nextToken());
        } 
    }
        }
        catch(IOException e){
    System.err.println("IOException: " + e);
        }
        System.out.println("is ok!");
    }
    }
    我认为这样会方便一点。
    ok?
      

  3.   

    我在做符合美国aicc标准的一个远程教育平台。
    规范里规定了文件的格式,否则我当然会用xml或者数据库。
      

  4.   

    用java的java.util.Properties类。
    InputStream is = getClass().getResourceAsStream("/db.properties");
            Properties dbProps = new Properties();
            try {
                dbProps.load(is);
            }
            catch (Exception e) {
                System.err.println("Can't read the properties file. " +
                    "Make sure db.properties is in the CLASSPATH");
                return;
            }
            String logFile = dbProps.getProperty("logfile", "DBConnectionManager.log");
            try {
                log = new PrintWriter(new FileWriter(logFile, true), true);
            }
            catch (IOException e) {
                System.err.println("Can't open the log file: " + logFile);
                log = new PrintWriter(System.err);
            }