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();
}
}
io中的特殊流Properties的更多相关文章
- Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)
1.操作基本数据类型的流 1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出 ...
- Java IO流-Properties
2017-11-05 21:37:50 Properties Properties:Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载.属性列表中每个键及其 ...
- Java编程基础23——IO(其他流)&Properties
1_序列流(了解) 1.什么是序列流 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推. 2.使用方式 整合两个: S ...
- Java(35)IO特殊操作流&Properties集合
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228454.html 博客主页:https://www.cnblogs.com/testero ...
- Java IO流体系中常用的流分类
Java输入/输出流体系中常用的流分类(表内容来自java疯狂讲义) 注:下表中带下划线的是抽象类,不能创建对象.粗体部分是节点流,其他就是常用的处理流. 流分类 使用分类 字节输入流 字节输出流 字 ...
- Java IO中转换流的作用
在<Java网络编程>中,有这样一段话: ”Reader和Writer最重要的子类是InputStreamReader和OutputStreamWriter类. InputStreamRe ...
- IO流——Properties类、序列化流、反序列化流、打印流、commons-IO
一. Properties类 1. Properties类介绍 Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串 ...
- 【Java基础】【22IO(其他流)&Properties】
22.01_IO流(序列流)(了解) 1.什么是序列流 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推. 2.使用方 ...
- 转换流 Properties集合 序列化 工具
今日内容介绍1.转换流2.缓冲流3.Properties集合4.序列化流与反序列化流5.commons-IO============================================== ...
随机推荐
- Spring RestTemplate 之post请求
●post请求:在RestTemplate中,POST请求可以通过如下三个方法来发起,但post提交方式又有两种 formData 和 payLoad,而且接口设计与传统的浏览器使用的提交方式又有差异 ...
- 前端开发入门到进阶第一集【使用sublime快速编写Html和Css】
1,安装sublime编辑器,下载地址:http://www.sublimetext.com/3 2,要使用sublime的插件机制必须安装package control:https://packag ...
- aptitude软件状态标志i、v、p
输出的结果分三栏,分别为状态.包名和描述.而状态则由p.i.v等字母表示.查询后才知道这些标识的含义是这样的: i - 包已经成功安装,并且所有依赖都满足. c - 包已经被移除,但是配置文件被保留. ...
- sync/fsync/fdatasync的简单比较
此文主要转载自 http://blog.csdn.net/zbszhangbosen/article/details/7956558 官网上有关于MySQL的flush method的设置参数说明,但 ...
- MYSQL时间戳和日期相互转换 笔记整理
相关函数: date_format(date, format) 函数,MySQL日期格式化函数date_format() unix_timestamp() 函数 str_to_date(str, fo ...
- 笛卡尔树-P2659 美丽的序列
P2659 美丽的序列 tag 笛卡尔树 题意 找出一个序列的所有子段中子段长度乘段内元素最小值的最大值. 思路 我们需要找出所有子段中贡献最大的,并且一个子段的贡献为其长度乘区间最小值. 这--不就 ...
- SQL注入之二次,加解密,DNS等注入
#sql注入之二次注入 1.注入原理 二次注入可以理解为,构造恶意数据存储在数据库后,恶意数据被读取并进入到了SQL查询语句所导致的注入.恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当 ...
- 论文笔记:(2019CVPR)PointConv: Deep Convolutional Networks on 3D Point Clouds
目录 摘要 一.前言 1.1直接获取3D数据的传感器 1.2为什么用3D数据 1.3目前遇到的困难 1.4现有的解决方法及存在的问题 二.本文idea 2.1 idea来源 2.2 初始思路 2.3 ...
- AuthorizationFailed""The client '***' with object id '***' does not have authorization to perform action 'or the scope is invalid. If access was recently granted, please refresh your credentials
Warning SyncLoadBalancerFailed 4m9s (x11 over 29m) service-controller Error syncing load balanc ...
- Android开发音视频方向学习路线及资源分享,学完还怕什么互联网寒冬?
接触Android音视频这一块已经有一段时间了,跟普通的应用层开发相比,的确更花费精力.期间为了学习音视频的录制,编码,处理也看过大大小小的几十个项目.总体感觉就是知识比较零散,对刚入门的朋友比较不友 ...