Properties-转换流-打印流-序列化和反序列化-Commons-IO工具类
一.Properties 类(java.util)
概述:Properties 是一个双列集合;Properties 属于map的特殊的孙子类;Properties 类没有泛型,properties集合的key和value都是固定的数据类型(String),该集合提供了一些特有的方法存取值,是唯一一个可以与IO流相结合的集合;
定义:public class Properties extends Hashtable 注: public class Hashtable extends Dictionary implements Map, Cloneable, Serializable 构造方法:Properties():创建一个无默认值的空属性列表
[注: public class Hashtable extends Dictionary implements Map, Cloneable, Serializable
]
构造方法:Properties():创建一个无默认值的空属性列表
常用方法:
特有方法: public String getProperty(String key){}:用指定的键在此属性列表中搜索属性
public Object setProperty(String key, String value){}:调用 Hashtable 的方法 put()向集合中存键值对;
public Set<String> stringPropertyNames(){}:返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。
与IO流结合的方法:
public void load(InputStream instream) throws IOException{}:从输入流中读取属性列表(键和元素对)。(文件-->集合)
public void load(Reader reader) throws IOException{}:按简单的面向行的格式从输入字符流中读取属性列表(键和元素对). (文件-->集合)
public void store(OutputStream out, String comments) throws IOException{}:以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。Comments 是对整个文件的解释说明的话,不能写中文,因为固定使用ISO8859-1的编码,一般直接写""; (集合-->文件)
public void store(Writer writer, String comments) throws IOException{}:以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符。(集合-->文件)
注意事项:
1:一般情况下如果一个文件与properties集合相结合,那么文件的后缀名是:.properties;
也可以自定义后缀名;如果后缀名是:.properties;那么文件中的内容自动使用ISO8859-1编码;
如果后缀名是其他的,文件使用工作空间默认的编码;使用load方法,加载数据的时候,注释的内容会被忽略;
2:与properties集合结合的文件中的数据格式,必须以键值对的形式存在;
代码演示1:
- 1 /*
- 2 Properties的基本使用:创建/添加/取值/迭代
- 3 */
- 4 import java.util.Properties;
- 5 import java.util.Set;
- 6 public class PropertiesDemo{
- 7 public static void main(String[] args){
- 8 //创建Properties集合对象
- 9 Properties p = new Properties();
- 10 //向集合中添加元素
- 11 p.setProperty("1","Jack");
- 12 p.setProperty("2","Rose");
- 13 p.setProperty("3","Smith");
- 14 //取值
- 15 String name = p.getProperty("1");
- 16 System.out.println(name);//Jack
- 17 //迭代
- 18 //把键值取出stringPropertyNames(),返回set集合
- 19 Set<String> keySet = p.stringPropertyNames();
- 20 for(String s : keySet){
- 21 System.out.println(s+"===>"+p.getProperty(s));
- 22 }
- 23 }
- 24 }
代码演示2:
- 1 /*
- 2 向Properties集合中添加元素并以字节流的形式存入到硬盘文件(txt,GBK)
- 3 再读取到集合中
- 4 */
- 5 import java.util.Properties;
- 6 import java.io.FileOutputStream;
- 7 import java.io.IOException;
- 8 import java.io.FileInputStream;
- 9 public class PropertiesDemo02{
- 10 public static void main(String[] args) throws IOException{
- 11 //创建Properties集合
- 12 Properties p = new Properties();
- 13 //向集合中添加元素
- 14 p.setProperty("1","Rose");
- 15 p.setProperty("2","Jack");
- 16 //创建基本输出字节流
- 17 FileOutputStream fout = new FileOutputStream("names.txt");//如果不是.properties结尾的文件默认为工作空间的编码格式
- 18 //存入磁盘
- 19 p.store(fout,"");
- 20 //关闭流
- 21 fout.close();
- 22
- 23 //创建基本输入字节流
- 24 FileInputStream fin = new FileInputStream("names.txt");
- 25 //读入集合
- 26 p.load(fin);
- 27 //关闭流
- 28 fin.close();
- 29 System.out.println(p);//{2=Jack, 1=Rose}
- 30 }
- 31 }
二.记住四套继承关系:
字节流两套:
java.lang.Object--java.io.OutputStream--java.io.FileOutputStream
java.lang.Object--java.io.InputStream--java.io.FileInputStream
高效字节流两套:
java.lang.Object--java.io.OutputStream--java.io.FilterOutputStream--java.io.BufferedOutputStream
java.lang.Object--java.io.InputStream--java.io.FilterInputStream--java.io.BufferedInputStream
字符流两套:
java.lang.Object--java.io.Writer--java.io.OutputStreamWriter (转换流)--java.io.FileWriter
java.lang.Object--java.io.Reader--java.io.InputStreamReader (转换流)--java.io.FileReader
缓冲字符流两套:
java.lang.Object--java.io.Writer--java.io.BufferedWriter
java.lang.Object--java.io.Reader--java.io.BufferedReader
三.转换流
按照方向,转换流可以分为:
用于读数据的转换流,字节流-->字符流的桥梁!
用于写数据的转换流,字符流-->字节流的桥梁!
Java 中的类:
OutputStreamWriter(程序-->硬盘 写数据 字符流对象转换成字节流对象)
InputStreamReader (硬盘-->程序 读数据 将输入的字节流变为字符流)
两个转换流都属于字符流的范畴;
作用:可以读或写指定编码的文件!
OutputStreamWriter 有一个直接子类:FileWriter; Writer--OutputStreamWriter--FileWriter
InputStreamReader 有一个直接子类:FileReader; Reader--InputStreamReader--FileReader
适用场景:
当不需要考虑编码的时候,建议使用子类;
如果需要考虑编码的时候,使用父类(OutputStreamWriter/OutputStreamReader 转换流);
四.OutputStreamWriter 类(java.io)
介绍:OutputStreamWriter 主要用于向硬盘中写指定编码格式的信息;
定义:public class OutputStreamWriter extends Writer
构造方法:
OutputStreamWriter(OutputStream out, String charsetName):创建使用指定字符集的 OutputStreamWriter。
OutputStreamWriter(OutputStream out):创建使用默认字符编码的 OutputStreamWriter。
常用方法:
public void close() throws IOException(){}:关闭流(关闭前先刷新);
public void flush() throws IOException(){}:刷新流;
public void write(char[] cbuf, int off, int len){}:写入字符数组的某一部分
public void write(int c) throws IOException(){}:写入单个字符
public void write(String str, int off, int len){}:写入字符串的某一部分
注意:write()方法可以直接写入字符串,但是read()方法不能直接读取,需转成char[]
五.InputStreamReader 类(java.io)
介绍:InputStreamReader 主要用于从硬盘中读指定编码格式的信息. 构造时可以指定字符集编码
定义:public class InputStreamReader extends Reader
构造方法:
InputStreamReader(InputStream in, String charsetName):创建使用指定字符集的 InputStreamReader。
InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader。
常用方法:
public void close() throws IOException{}:关闭流
public int read() throws IOException{}:读取单个字符
public int read(char[] cbuf,int offset,int length) throws IOException{}:读入字符数组中的某一部分
回顾:
String(char[] value, int offset, int count):分配一个新的 String,它包含取自字符数组参数一个子数组的字符
代码演示:
- 1 import java.io.FileInputStream;
- 2 import java.io.InputStreamReader;
- 3 import java.io.IOException;
- 4 import java.io.FileOutputStream;
- 5 import java.io.OutputStreamWriter;
- 6 public class StreamDemo02{
- 7 public static void main(String[] args) throws IOException{
- 8 //创建字节输出流
- 9 FileOutputStream out = new FileOutputStream("E:\\JAVAPractice\\IO\\stream.txt");
- 10 //创建转换流,以UTF-8的编码写入
- 11 OutputStreamWriter ow = new OutputStreamWriter(out,"UTF-8");
- 12 //准备写入的内容
- 13 String s = "我爱APPLE";
- 14 ow.write(s);
- 15 ow.close();
- 16
- 17 //创建字节输入流
- 18 FileInputStream in = new FileInputStream("E:\\JAVAPractice\\IO\\stream.txt");
- 19 //创建转换流,告诉程序应该是什么编码系统
- 20 InputStreamReader inr = new InputStreamReader(in, "UTF-8");
- 21 //定义i用来存储读取到的字节码值
- 22 int i = -1;
- 23 char[] c = new char[1024];
- 24 while((i = inr.read(c)) != -1){
- 25 String str = new String(c,0,i);
- 26 System.out.print(str);
- 27 }
- 28 inr.close();
- 29 }
- 30 }
六.打印流
概述:打印流仅用于向文件中输出内容用,打印流在输出数据的时候,不会抛出IO异常;打印流一共有2个:
printStream:属于字节流;早期版本;1.0
printWriter:属于字符流;后来的版本,1.1;
这两个流的功能几乎是一致;
特点:
所见即所得!
区别:
1:自动刷新的方式不同;
2:主要操作的内容不同,printStream主要操作字节数据,printWriter主要操作字符数据;
两套继承关系:
java.lang.Object--java.io.OutputStream--java.io.FilterOutputStream--java.io.PrintStream
java.lang.Object--java.io.Writer--java.io.PrintWriter
七.PrintStream (打印流)类(java.io)
定义:public class PrintStream extends FilterOutputStream implements Appendable, Closeable
构造方法:
PrintStream(File file) 创建具有指定文件且不带自动行刷新的新打印流。
PrintStream(File file, String csn) 创建具有指定文件名称和字符集且不带自动刷新的新打印流。
-------------------------------------------------------------------------------------------
PrintStream(OutputStream out) 创建新的打印流。
PrintStream(OutputStream out, boolean autoFlush) 创建新的打印流,若为true,可自动刷新
PrintStream(OutputStream out, boolean autoFlush, String encoding) :创建新的打印流。若为true,可自刷新,并指定字符集
-------------------------------------------------------------------------------------------------------------------
PrintStream(String fileName):创建具有指定文件名称且不带自动行刷新的新打印流
PrintStream(String fileName, String csn):创建具有指定文件名称和字符集且不带自动行刷新的新打印流。
-----------------------------------------------------------------------------------------------------
常用方法:
public void print(Object obj):
public void println():
八.PrintWriter (打印流)类(java.io)
定义:public class PrintWriter extends Writer
构造方法:
PrintWriter(File file):使用指定文件创建不具有自动行刷新的新 PrintWriter。
PrintWriter(File file, String csn):创建具有指定文件和字符集且不带自动刷行新的新 PrintWriter。
-------------------------------------------------------------------------------------------
PrintWriter(OutputStream out):根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter。
PrintWriter(OutputStream out, boolean autoFlush):通过现有的 OutputStream 创建新的 PrintWriter。
----------------------------------------------------------------------------------------------
PrintWriter(String fileName):创建具有指定文件名称且不带自动行刷新的新 PrintWriter。
PrintWriter(String fileName, String csn):创建具有指定文件名称和字符集且不带自动行刷新的新 PrintWriter。
-------------------------------------------------------------------------------------------------------
PrintWriter(Writer out):创建不带自动刷新的新 PrintWriter。
PrintWriter(Writer out, boolean autoFlush):创建新 PrintWriter。
---------------------------------------------------------------------------------------------
常用方法:同PrintStream
九.序列化和反序列化
概述:
序列化:将程序中的对象,保存到硬盘上,这个过程称为序列化;Java 中提供了一个类:ObjectOutputStream,用于序列化;
反序列化:将硬盘上对象读取到程序中,并形成一个新的java对象,个过程称为反序列化;ObjectInputStream,用于反序列化;
十.ObjectOutputStream 类(java.io) 用于序列化
概述:
ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。
注意事项:
1:被序列化的对象必须实现Serializable接口;
2:必须提供属性的getXxx与setXXx方法;
3:必须有空参数的构造方法;
定义:public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants
构造方法:
ObjectOutputStream(OutputStream out)
常用方法:
public final void writeObject(Object obj) throws IOException{}:将指定的对象写入 ObjectOutputStream。
十一.ObjectInputStream 类(java.io) 用于反序列化
概述:ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
定义:public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants
构造方法:
public ObjectInputStream(InputStream in) throws IOException
常用方法:
public final Object readObject() throws IOException, ClassNotFoundException{}:从 ObjectInputStream 读取对象。调用一次,读一个对象,如果文件中没有下一个对象了,再调用该方法,会抛出异常;
建议:每个文件中只保存一个对象,只读一次;
反序列化注意事项:
1:如果一个对象已经序列化了,不能修改java类,否则会报错;解决:手动添加一个属性,定死一个版本号即可;
2:如果属性不想序列化,可以使用关键字:transient或static;
十二.工具类的使用步骤:
1:从网上下载对应的zip并解压;
2:复制核心jar包到工程中;
3:将jar添加到本地工程;(add to build path)
4:直接使用核心类,调用方法;
十三.Commons-IO 工具类
工具的核心类:
FileUtils:主要用于文件与文件夹的IO操作;
FileNameUtils:主要用于文件名的操作;
核心jar包:commons-io-2.4.jar
FileUtils 常用方法:(一般均为静态方法,类名直接调用即可)
public static void copyDirectory(File srcDir, File destDir){}:复制文件夹,(不包含srcDir)(自动递归);
public static void copyDirectoryToDirectory(File srcDir, File destDir){}:复制文件夹,(包含srcDir)(自动递归);
public static void copyFile(File srcFile, File destFile){}:复制文件;
public static String readFileToString(File file){}:将文件的内容读成一个字符串并返回;
public static void writeStringToFile(File file, String data){}:将字符串写入到指定的文件中;
Properties-转换流-打印流-序列化和反序列化-Commons-IO工具类的更多相关文章
- IO流的Properties集合,序列化流与反序列化流,打印流及commons-IO
内容介绍 Properties集合 序列化流与反序列化流 打印流 commons-IO Properties类 Properties类介绍 Properties 类表示了一个持久的属性集.Proper ...
- Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)
1.操作基本数据类型的流 1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出 ...
- Java自学第10期——File类与IO流(输入输出流、处理流、转换流、缓冲流、Properties集合、打印流)
1.IO简介 IO(输入输出)通过java.io包下的类和接口来支持,包下包括输入.输出两种IO流,每种输入输出流又可分为字符流和字节流两大类. 2.File类 File类是io包下与平台无关的文件和 ...
- java 转换流 打印流 数据流
转换流 InputStreamReader 和 OutputStreamWriter处理流用于将字节流转化成字符流,字符流与字节流之间的桥梁InputStreamReader 的作用是把 InputS ...
- Java——IO流 对象的序列化和反序列化流ObjectOutputStream和ObjectInputStream
对象的输入输出流 : 主要的作用是用于写入对象信息与读取对象信息. 对象信息一旦写到文件上那么对象的信息就可以做到持久化了 对象的输出流: ObjectOutputStream 对象的输入流: Ob ...
- 6.5(java学习笔记)其他流(字节数组流,数据流,对象流,打印流)
一.字节数组流 之前使用输入输出流的操作的对象是文件,而这里字节数组流操作的对象是内存,内存可以看做是一个字节数组. 使用字节数组流读写就可以看做是从内存A到内存B的读写,对象时内存即字节数组. 1. ...
- JAVA笔记12__字节、字符缓冲流/打印流/对象流/
/** * !!:以后写流的时候一定要加入缓冲!! * 对文件或其它目标频繁的读写操作,效率低,性能差. * 缓冲流:好处是能更高效地读写信息,原理是将数据先缓冲起来,然后一起写入或读取出来. * * ...
- 34 io流-- 打印流和对象流
概述 io流分为字符流和字节流,具体分类相见下图 字符流:char 一些基本文本的数据传输 字节流:byte 图片.视频等用文本查看器查看不了的文件都是二进制文件,只能用字节流传输,使用字符流cp的看 ...
- C#序列化及反序列化Json对象通用类JsonHelper
当今的程序界Json大行其道.因为Json对象具有简短高效等优势,广受广大C#码农喜爱.这里发一个序列化及反序列化Json对象通用类库,希望对大家有用. public class JsonHelper ...
随机推荐
- JAVA,MYSQL,ORACLE的数据类型对比
MySQL Data Type Oracle Data Type Java BIGINT NUMBER(19, 0) java.lang.Long BIT RAW byte[] BLOB BLOB, ...
- Centos7 安装vim8
一.卸载旧版本的vim yum -y remove vim* 二.安装终端字符处理库ncurses yum -y install ncurses-devel 三.下载Vim8 wget https:/ ...
- Centos7更新阿里yum源
一.下载repo文件 wget http://mirrors.aliyun.com/repo/Centos-7.repo 二.备份并替换系统的repo文件 cp Centos-7.repo /etc/ ...
- Linux下使用sendEmail发送带附件的邮件(转载)
转载:http://www.ttlsa.com/linux/use-sendemail-send-file/ sendEmail是一个轻量级,命令行的SMTP邮件客户端.如果你需要使用命令行发送邮件, ...
- 数据库路由中间件MyCat - 源代码篇(5)
此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 3. 连接模块 如之前所述,MyCat的连接分为前端和后端,下面是连接基本相关类图: 3.1 Closabl ...
- Unity手游之路自动寻路Navmesh之高级主题
http://blog.csdn.net/janeky/article/details/17492531 之前我们一起学习了如何使用Navmesh组件来实现最基本的角色自动寻路.今天我们再继续深入探索 ...
- solidity 学习笔记(6)call 函数
call() 方法 call()是一个底层的接口,用来向一个合约发送消息,也就是说如果你想实现自己的消息传递,可以使用这个函数.函数支持传入任意类型的任意参数,并将参数打包成32字节,相互拼接后向合约 ...
- [Xcode 实际操作]六、媒体与动画-(15)使用AudioPlayer播放音乐
目录:[Swift]Xcode实际操作 本文将演示如何播放音频素材. 在项目名称上点击鼠标右键,弹出右键菜单, 选择[Add Files to "DemoApp"],往项目中导入文 ...
- [Xcode 实际操作]六、媒体与动画-(12)检测UIView动画的结束事件:反转动画并缩小至不可见状态
目录:[Swift]Xcode实际操作 本文将演示UIView视图反转动画的制作,并检测其动画结束事件. 即视图在进行反转动画的同时,将移动到目标位置,并缩小至不可见状态. 在项目导航区,打开视图控制 ...
- 数组常用API(1)
数组常用API: 1. push 作用:数组尾部添加: 特点:可以添加一个或多个值: 返回值是数组最新的长度:会改变原数组: 示例: var arr = [10,20,30,40]; ...