Java实用经验总结--其他

 
Java 实用经验总结 -- 其他
1.   Map的遍历
有人看了这个标题可能发笑,因为这实在太简单,难道我在凑字数?可是根据我自己的经验来说,人的岁数长的时候记忆力却不跟着长,倒有不进反退的现象。我就是虽然写过很多遍但仍然用到的时候就忘个干净,在这里写一下强化记忆 J
SortedMap pDataMap = new TreeMap();
Iterator itor = pDataMap.entrySet().iterator();
       while (itor.hasNext()){
           Map.Entry vEntry = (Entry) itor.next();
            vEntry.getKey();
    vEntry.getValue();
            // 做一些其他的事 ……
}
2.   文件操作
本文主要关注简单的对象序列化的相关操作,对于更为详细的操作过程,请参照《Java编程思想 2e》。
2.1.文件过滤器
文件过滤器主要用在FileChooser或者File.listFiles()方法中,用于过滤掉一些与本程序无关的类型文件。本例给出一个察看给定文件后缀名的文件过滤器,对于给定的文件察看其文件名,如果和给定的后缀名一致则返回true,否则返回false。
public class RecorderFileFilter implements FilenameFilter
{
    /** 后缀名   **/
        String postfixStr ;
 
        public RecorderFileFilter(String postfix){
            this . postfixStr = postfix;
        }
 
        public boolean accept(File dir, String name) {
            /** 只判断后文件的缀名是否正确即可   **/
            if ( name.endsWith( postfixStr ) )
                    return true ;
                else
                    return false ;
        }
}
2.2.对象的保存与读取
首先介绍一下我的程序的存储结构:我的数据保存在两种类型的文件中,即“时间字符串.data”和“时间字符串.plan”两种类型。其中.data文件是一个HashMap<String,String>类的序列化文件,而.plan文件是一个SortedMap<String,String>类的序列化文件。他们都保存在“user.dir/data”目录下。下面的这些方法的功能是读取/保存这个目录下数据文件,如果你想保存你自定义的文件到指定目录,下面的代码至需要稍微修改一下即可使用:
/** 用以标识读入数据的类型,也是文件后缀名 **/
    public static final String DATA_TYPE = ".data" ;
    public static final String PLAN_TYPE = ".plan" ;
 
    /** 以程序运行目录作为基目录 **/
    public static File appDir = new File(System.getProperty( "user.dir" ));
    public static File imgDir = new File( appDir , "img" );
    public static File dataDir = new File( appDir , "data" );
    public static File reportDir = new File( appDir , "report" );
 
    public static FileInputStream fIn ;
    public static FileOutputStream fOut ;
    public static ObjectInputStream objIn ;
    public static ObjectOutputStream objOut ;
 
 
    /** --------------- 功能函数部分 ---------------------- **/
    /**
     * 查找并读入 "user.home/data/" 目录下所有的记录文件,将其放到一个 Map
     * HashMap Key 为文件名,也是欠款人帐户的 ID 号。
     * 关于获得的文件的具体信息请参照技术说明书。
     * 如果 pType=DATA_TYPE ,则 dataMap 的格式为 <String,HashMap>
     *      pType=PLAN_TYPE ,则 dataMap 的格式为 <String,SortedMap>
     * @return SortedMap
     */
    public static HashMap loadAll(String pType){
        /**   数据文件名 ( 简历账号的时间 ) 即为 ID   **/
        HashMap vDataMap = new HashMap();
 
        /** 后缀名为 data 的即为数据文件 **/
        File[] dataFiles = dataDir .listFiles( new RecorderFileFilter(pType));
 
        for ( int i = 0; i < dataFiles. length ; i++){
            try {
                if ( pType.equals(FileUtil. DATA_TYPE ) ){
                    HashMap<String,String> hMap = (HashMap<String,String>)loadObjectFromFile(dataFiles[i]);
                    /** 去掉文件名的后缀名即或得 key ,也就是欠款帐户 ID **/
                    vDataMap.put(hMap.get( "id" ),hMap);
                } else if ( pType.equals(FileUtil. PLAN_TYPE ) ){
                    SortedMap<String,SortedMap> hMap = (SortedMap<String,SortedMap>)loadObjectFromFile(dataFiles[i]);
                    /** 去掉文件名的后缀名即或得 key ,也就是欠款帐户 ID **/
                    vDataMap.put(StringUtil.clearFileName(dataFiles[i]) ,hMap);
                } else
                    throw new Exception( " 读取了错误的文件类型 " );
 
            }
            catch (Exception ex) {
                MessageUtil.showErrMsg( " 读取数据时出现错误,数据有可能丢失! " +
                    "/n 文件名为 :" +dataFiles[i].getName());
            }
        }
        return  vDataMap;
    }
 
 
    /**
     * 将给定内容存入文件中 .
     * @param pContentMap Map 其所装内容为 <id(String), HashMap SortedMap>
     */
    public static void saveAll(HashMap<String,String> pDataMap,SortedMap<String,String> pPlanMap){
        Iterator itor = pDataMap.entrySet().iterator();
        while (itor.hasNext()){
            Map.Entry vEntry = (Entry) itor.next();
            String id = (String) vEntry.getKey();
            saveToFile(id,pDataMap,pPlanMap);
        }
    }
 
 
    /**
     * 将制定欠款账户的信息存入文件中
     * @param id String           这个信息在保存欠款协议时不可或缺
     * @param pDataMap SortedMap
     * @param pPlanMap SortedMap
     */
    public static void saveToFile(String id, HashMap<String,String> pDataMap,
        SortedMap<String,String> pPlanMap){
        try {
        if ( pDataMap != null )
       saveObjectToFile( new File( dataDir ,id+ DATA_TYPE ), pDataMap);
            if ( pPlanMap != null )
                saveObjectToFile( new File( dataDir ,id+ PLAN_TYPE ), pPlanMap);
    }
        catch (Exception ex) {
            MessageUtil.showErrMsg( " 保存数据时出现错误,数据没有被正确保存! " );
        }
    }
 
 
    /**
     * 将文件中的序列化对象读出来
     * @param pFile File
     * @return Object
     * @throws Exception
     */
    public static Object loadObjectFromFile(File pFile) throws Exception {
        fIn = new FileInputStream(pFile);
        objIn = new ObjectInputStream( fIn );
        Object obj = objIn .readObject();
        fIn .close();
        objIn .close();
        return obj;
    }
 
 
    /**
     * 将对象序列化到相应的文件中去 -- 保存数据时候专用,因为该函数将数据保存在 appDir/data 目录下
     * @param pFileName String
     * @param obj Object
     * @throws Exception
     */
    public static void saveObjectToFile(File pFile,Object pObj) throws Exception
    {
        fOut = new FileOutputStream(pFile);
        objOut = new ObjectOutputStream( fOut );
        objOut .writeObject(pObj);
        fOut .close();
        objOut .close();
    }
 
2.3.其他
由于每个程序都有图标文件,所以从制定目录读入图标应该是每个程序都会用到的。其次,删除指定目录下的指定类型文件似乎也很常用 J
    /** img 文件夹中获取图标 **/
    public static ImageIcon getImageIcon(String pImageFileName){
       File imgFile = new File( imgDir ,pImageFileName);
       ImageIcon imageIcon = new ImageIcon(imgFile.getAbsolutePath());
       return imageIcon;
    }
 
    /** 清除 reportDir 目录下所有 html 文件 **/
    public static void clearReportFiles(){
        File vReportDir = new File( reportDir .getAbsolutePath());
        File[] vReportFiles = vReportDir.listFiles( new FilenameFilter(){
        public boolean accept(File dir, String name){
                if ( name.endsWith( "html" ))
                    return true ;
                return false ;
        }
    });
        for ( int i = 0; i < vReportFiles. length ; i++)
            vReportFiles[i].delete();
}
 
 
 

你可能感兴趣的:(Java实用经验总结--其他)