黑马程序员技术交流社区

标题: Properties集合 [打印本页]

作者: 洛奇亚    时间: 2015-9-23 13:42
标题: Properties集合
Properties

1、Properties集合:

     *  特点:
     * 1,该集合中的键和值都是字符串类型。
     * 2,集合中的数据可以保存到流中,或者从流获取。


2、Properties集合基本操作:
package cn.itcast.io.p2.properties;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.FieldPosition;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;
public class PropertiesDemo {
        /*
         * Map |---Hashtable |---Properties
         *
         * Properties集合:
         *  特点:
         * 1,该集合中的键和值都是字符串类型。
         * 2,集合中的数据可以保存到流中,或者从流获取。
         *
         * 通常该集合用于操作以键值对形式存在的 配置文件。
         */
        public static void main(String[] args) throws IOException {
                //propertiesDemo_4();
                MyLoad();
        }
       
        //对已有的配置文件中的信息进行修改。
        /*
         * 读取这个文件。
         * 并将这个文件中的键值数据存储到集合中,再通过集合对数据进行修改。
         * 再通过流将修改后的数据存储到文件中。
         *
         */
       
        public static void test() throws IOException{
               
                //读取这个文件
                File file=new File("info.txt");
               
                if(!file.exists()){
                 
                        file.createNewFile();
                       
                }
                FileReader fr= new FileReader("info.txt");
               
                //创建集合存储配置信息
               
                Properties prop =new Properties();
               
                //将流中信息存储到集合中
                prop.load(fr);
               
                prop.setProperty("wangwu","16");
               
                FileWriter fw= new FileWriter(file);
               
                prop.store(fw, "");
               
                //prop.list(System.out);
               
                fr.close();
                fw.close();
        }
       
        //模拟一下load()方法
        public static void MyLoad() throws IOException{
                Properties prop =new Properties();
               
                BufferedReader bufr= new BufferedReader(new FileReader("info.txt"));
               
                String line=null;
               
                while((line=bufr.readLine())!=null){
                       
                        if(line.startsWith("#"))
                                continue;
                       
                        String [] arr= line.split("=");
                       
                        //System.out.println(arr[0]+":");
                       
                        prop.setProperty(arr[0], arr[1]);
                }
               
                prop.list(System.out);
               
                bufr.close();
        }
       
        public static void propertiesDemo_4() throws IOException {
               
                Properties prop =new Properties();
               
                /*
                 * 集合总的数据来自于一个文件
                 * 注意:必须要保证该文件中的数据是键值对。
                 * 需要使用到读取流。
                 *
                 */
                FileInputStream fis =new FileInputStream("info.txt");
               
                //使用load方法。
               
                prop.load(fis);
               
                prop.list(System.out);
               
               
        }
        public static void propertiesDemo_3() throws IOException {
               
                Properties prop = new Properties();
                // 存储元素
                prop.setProperty("xx", "xs");
               
                //想要将这些集合中的字符串键值信息持久化存储到文件中。
                //需要关联输出流
               
                FileOutputStream fos =new FileOutputStream("info.txt");
               
                //将集合中数据存储到文件中,使用store方法。不能出现中文信息。
                prop.store(fos, "name+age");
               
                fos.close();
               
               
        }
        /**
         * 演示Properties集合和流对象相结合的功能。
         *
         */
        public static void propertiesDemo_2() {
                Properties prop = new Properties();
                // 存储元素
                prop.setProperty("真实", "xs");
               
                prop=System.getProperties();
               
                prop.list(System.out);
        }
        /*
         * Properties集合的存和取。
         */
        public static void propertiesDemo() {
                // 创建一个Properties集合。
                Properties prop = new Properties();
                // 存储元素
                prop.setProperty("真实", "xs");
                // 修改元素
                prop.setProperty("真实", "sd");
                // 取出元素
                Set<String> names = prop.stringPropertyNames();
                for (String name : names) {
                        String value = prop.getProperty(name);
                        System.out.println(name + ":" + value);
                }
                Iterator<Entry<Object, Object>> it = prop.entrySet().iterator();
                while (it.hasNext()) {
                        Entry<Object, Object> me = it.next();
                        String str = (String) me.getKey();
                        String str1 = (String) me.getValue();
                        System.out.println("姓名:" + str + "    " + "年龄:" + str1);
                }
        }
}

3、定义功能,获取一个应用程序运行的顺序,如果超过5次,给出使用次数已到请注册的提示。并不要运行程序。
package cn.itcast.io.p2.properties;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
/*
* 定义功能,获取一个应用程序运行的顺序,如果超过5次,给出使用次数已到请注册的提示。并不要运行程序。
*
* 思路:
* 1,应该有计数器;
* 每次程序启动都需要计数一次。并且是在原有的次数上进行计数。
*
* 2,计数器就是一个变量。突然冒出一想法:程序启动时进行计数,计数器必须存在于内存中,并进行计算。
* 可是程序一结束,计数器消失了。那么再次启动该程序,计数器有重新被初始化了。
* 而我们需要多次启动同一个应用程序,使用的是同一个计数器。
* 这就需要计数器的生命周期变长,从内存存储到硬盘文件中。
*
* 3,如何使用这个计数器呢?
* 首先,程序启动时,应该先读取这个用于记录计数器的配置文件
* 获取上一次计数次数。并进行试用次数判断。
* 其次,对该次数进行自增,并自增后的次数重新存储到配置文件中。
*
* 4,文件中的信息该如何进行存储并体现。
* 直接存储次数值可以,但是不明确该数据的含义。
* 这就有了名字和值的对应,所以可以使用键值对。
* 可是映射关系map集合搞定,有需要读取硬盘上的数据,所以map+io=properties
*
*
*/
public class PropertiesTest {
       
        public static void main(String[] args) throws IOException {
               
                getAppCount();
               
        }
       
        public static void getAppCount() throws IOException{
               
                File confile =new File("count.properties");
               
                if(!confile.exists()){
                       
                        confile.createNewFile();
                       
                }
            FileInputStream fis =new FileInputStream(confile);
            
            Properties prop =new Properties();
            
            prop.load(fis);
            
            //从集合中通过键获取次数。
            String value =prop.getProperty("time");
            
            //定义计数器,记录获取到的次数,。
            int count=0;
            if(value!=null){
                   
                    count=Integer.parseInt(value);
                   
                    if(count>=5){
                            //System.out.println("使用次数已到,请注册!");
          
                            throw new RuntimeException("使用次数已到,请注册!");
                    }
                   
            }
            
            count++;
            
            
            prop.setProperty("time", count+"");
            
            FileOutputStream fos =new FileOutputStream(confile);
            
            prop.store(fos, "");
            
            fos.close();
            
            fis.close();
       
       
        }
}

4、获取指定目录下,指定扩展名的文件(包含子目录中的)
* 这些文件的绝对路径写入到一个文本文件中。
* 简单的说,就是建立一个指定扩展名的文件的列表。
package cn.itcast.io.p3.test;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/*
* 获取指定目录下,指定扩展名的文件(包含子目录中的)
* 这些文件的绝对路径写入到一个文本文件中。
* 简单的说,就是建立一个指定扩展名的文件的列表。
*
* 思路:
* 1,必须进行深度遍历;
* 2,要在遍历的过程中进行过滤,将符合条件的内容存储容器中。
* 3,按照需求对容器中的内容进行遍历并将绝对路径写入到文件中。
*
*/
public class Test {
       
        public static void main(String[] args) throws IOException {
               
                File dir= new File("d:\\java");
               
                FilenameFilter filter =new FilenameFilter() {
                       
                        @Override
                        public boolean accept(File dir, String name) {
                               
                                return name.endsWith(".txt");
                        }
                };
               
                List<File> list =new ArrayList<File>();
               
                getFiles(dir,filter,list);
               
                File destFile =new File(dir,"javalist.txt");
               
                write2File(list, destFile);
               
        }
        /**
         * 对指定目录中的内容进行深度遍历,并按照指定过滤器,进行过滤;
         * 将过滤后的内容存储到指定容器List中。
         *
         */
       
        public  static void getFiles(File dir,FilenameFilter filter,List<File> list){
               
                File[] files =dir.listFiles();
               
                for(File file :files){
                        if(file.isDirectory()){
                                //递归:
                                getFiles(file,filter,list);
                        }else{
                                //对遍历到的文件进行过滤器的过滤,将符合条件的File对象存储到List集合中。
                                if(filter.accept(dir, file.getName())){
                                        list.add(file);
                                }
                        }
                }
               
        }
       
        public static void write2File(List<File> list,File destFile) throws IOException{
               
                BufferedWriter bufw =null;
                try {
                        bufw=new BufferedWriter(new FileWriter(destFile));
               
                        for(File file: list){
                                bufw.write(file.getAbsolutePath());
                                bufw.newLine();
                                bufw.flush();
                        }
                       
                }/* catch (IOException e) {
                       
                        throw new RuntimeException("写入失败");
                       
                }*/finally{
                       
                        if(bufw!=null)
                                try {
                                        bufw.close();
                                } catch (IOException e) {
                                       
                                        throw new RuntimeException("关闭失败");
                                }
                }
               
        }
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2