zoukankan      html  css  js  c++  java
  • io中的特殊流Properties

    对于去年学习IO的时候一些代码贴上来:

    初识properties,因为继承自hashtable,其中可以使用put操作:

    package special;
    
    import java.util.Properties;
    import java.util.Set;
    
    /**
     *    继承者  java.util.Hashtable<Object,Object>
     *    	继承者  java.util.Properties
     * @author 半步疯子
     * 
     * Properties 继承自 Hashtable
     * 属性集合类:
     * 
     * 		Properties 类表示了一个持久的属性集。
     * 		Properties 可保存在流中或从流中加载。
     * 		属性列表中每个键及其对应值都是一个字符串。 
     * 
     * 是Hashtable的子类,说明是一个Map集合。
     * 
     */
    public class PropertiesDemo01 {
    	// 对与Properties 要注意的是API上的修饰没有泛型
    	// 所以不能因为以前使用的集合都有泛型,就给Properties加上泛型
    	public static void main(String[] args) {
    		Properties prop = new Properties();
    		// System.out.println("prop:" + prop);
    		// 对于打印输出:首先要先默认输出的格式
    		// Propreties继承自HashTable(map)可以直接使用输出名字进行成员遍历
    		// 输出的话,也不需要进行for循环
    		// 没有泛型,put方法默认为Object类型
    		prop.put("002", "hello");
    		prop.put("001", "world");
    		prop.put("003", "java");
    		System.out.println("prop:" + prop);
    		
    		// 遍历集合 map
    		Set<Object> set = prop.keySet();
    		for(Object key : set) {
    			Object value = prop.get(key);
    			System.out.println(key + "---" + value);
    		}
    		
    	}
    }

    因为Properties 的需求应运而生的

            所以其实现setProperty的方法其实是对HashTable中的put方法进行了封装:

            限制了value只能为String类型来实现的此方法

    /*
     * 因为Properties 的需求应运而生的:
     * 		setProperty(String key, String value)
     * 
     * class Hashtable<K, V> {
     * 		public V put() {
     * 			...
     * 		}
     * 
     * }
     * 还是调用的Hashtable中的put方法进行封装的
     * 但是限制死了只能用String进行传参
     * class Properties extends Hashtable {
     * 		public V setProperty(String key, String value) {
     *			return put(key, value); 			
     * 		}	
     * }
     */

     

    其中提供的一些方法的使用:

        1.设置属性值

    package special;
    
    import java.util.Properties;
    import java.util.Set;
    
    public class PropertiesDemo02 {
    	/*
    	 * 对于Properties中的特殊的功能:
    	 * 		
    	 * setProperty(String key, String value)  
    	 * 		调用 Hashtable 的方法 put。
    	 * 
    	 * getProperty(String key)  
    	 * 		用指定的键在此属性列表中搜索属性。
    	 * 
    	 * getProperty(String key, String defaultValue)   
    	 * 		用指定的键在属性列表中搜索属性。
    	 * 
    	 * public Set<String> stringPropertyNames()
    	 * 		返回此属性列表中的键集,
    	 * 		其中该键及其对应值是字符串,
    	 * 		如果在主属性列表中未找到同名的键,
    	 * 		则还包括默认属性列表中不同的键。
    	 */
    	public static void main(String[] args) {
    		// 创建集合对象
    		Properties prop = new Properties();
    		
    		// 添加元素
    		prop.setProperty("张三", "30");
    		prop.setProperty("李四", "40");
    		prop.setProperty("王五", "50");
    		
    		Set<String> set = prop.stringPropertyNames();
    		for(String key : set) {
    			String value = prop.getProperty(key);
    			System.out.println(key + " --- " + value);
    		}
    	}
    }
    

        2.加载属性值(读出来)

    package special;
    
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Reader;
    import java.io.Writer;
    import java.util.Properties;
    
    /**
     * 对于Properties中的特殊的操作:
     * 
     * 加载:
     * load(InputStream inStream) 
     * 从输入流中读取属性列表(键和元素对)。
     * 
     * load(Reader reader)  
     * 按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。
     * 
     * 存储:
     * store(OutputStream out, String comments) 
     * 以适合使用 load(InputStream) 方法
     * 加载到 Properties 表中的格式,
     * 将此 Properties 表中的属性列表(键和元素对)写入输出流。
     * 
     * store(Writer writer, String comments) 
     * 以适合使用 load(Reader) 方法的格式,
     * 将此 Properties 表中的属性列表(键和元素对)写入输出字符。
     * 
     * 
     * @author 半步疯子
     *
     *
     *	常用于:进度保存和加载
     */
    public class PropertiesDemo03 {
    	public static void main(String[] args) throws IOException {
    		Properties prop = new Properties();
    		
    		// public void load(Reader reader)
    		// 因为Properties是map键值对集合
    		// 所以文件中的信息也应该是键值对
    		
    		Reader r = new FileReader("prop.txt");
    		prop.load(r);
    		r.close();
    		
    		System.out.println("prop:" + prop);
    		// 如果我没有使用键值对的形式:
    		// 输出就会如下一样:只有键没有值
    		
    		// 。。。。。=
    		
    		myLoad();
    		myStore();
    	}
    
    	private static void myStore() throws IOException {
    		// 创建集合对象
    		Properties prop = new Properties();
    		
    		prop.setProperty("mzy01", "20");
    		prop.setProperty("mzy02", "19");
    		prop.setProperty("mzy03", "18");
    		
    		Writer w = new FileWriter("name.txt");
    		prop.store(w, "propDemo");
    		// 第一个参数是传入一个流:
    		// 第二个参数是传入一个comment描述:
    		// 如下:
    		// 文件注释用#
    		/* 
    			#propDemo 
    			#Wed Jan 24 12:59:59 CST 2018
    			mzy03=18
    			mzy02=19
    			mzy01=20
    		*/
    		
    		w.close();
    	}
    
    	private static void myLoad() throws IOException {
    		Properties prop = new Properties();
    		Reader r = new FileReader("prop.txt");
    		prop.load(r);
    		r.close();
    		
    		System.out.println("prop:" + prop);
    	}
    }

    修改特定properties中特定字段的值:

    package special;
    
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Reader;
    import java.io.Writer;
    import java.util.Properties;
    import java.util.Set;
    
    /**
     * 对于特殊的需求:
     * 		现在我有一个文本文件夹:
     * 			user.txt 我知道数据是键值对的形式,但是我不知道内容是什么
     * 			现在请写一个程序判断是否有“lisi”这样的文件存在,如果有就改
     * 			变其值为100
     * 
     * 
     * @author 半步疯子
     *		A:把文件加载到集合中
     *		B:遍历集合,获取每一个键
     *		C:判断是否有为"lisi"的,如果有就修改为"100"
     *		D:把集合中的数据重新存储到文件中
     */
    public class PropertiesDemo04 {
    	public static void main(String[] args) throws IOException {
    		Properties prop = new Properties();
    		Reader r = new FileReader("user.txt");
    		prop.load(r);
    		r.close();
    		// 如果我原来的文件中有多个lisi,那么最后写了之后只会有一个lisi
    		// 键值对map不允许重复
    		Set<String> set = prop.stringPropertyNames();
    		for(String key : set) {
    			if("lisi".equals(key)) {
    				prop.setProperty("lisi", "100");
    				break;
    			}
    		}
    		
    		Writer w = new FileWriter("user.txt");
    		prop.store(w, null);
    		w.close();
    	}
    }
  • 相关阅读:
    bigtint;int;smallint;tinyint
    修改sqlserver2008默认的数据库文件保存路径
    通过代码来调用log4net写日志
    supersocket中的日志处理
    QuickStart下的CommandFilter项目 github上自己修改过的版本
    演练:实现支持基于事件的异步模式的组件
    BroadcastService的测试用例
    2-Medium下的MultipleCommandAssembly
    如何获取supersocket的源代码
    supersocket中quickstart文件夹下的MultipleCommandAssembly的配置文件分析
  • 原文地址:https://www.cnblogs.com/mzywucai/p/11053443.html
Copyright © 2011-2022 走看看