Properties-转换流-打印流-序列化和反序列化-Commons-IO工具类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Properties-转换流-打印流-序列化和反序列化-Commons-IO工具类相关的知识,希望对你有一定的参考价值。
一.Properties 类(java.util)
概述:Properties 是一个双列集合;Properties 属于map的特殊的孙子类;Properties 类没有泛型,properties集合的key和value都是固定的数据类型
(String),该集合提供了一些特有的方法存取值,是唯一一个可以与IO流相结合的集合;
定义:public class Properties extends Hashtable<Object,Object>
注: public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, 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:
/* Properties的基本使用:创建/添加/取值/迭代 */ import java.util.Properties; import java.util.Set; public class PropertiesDemo{ public static void main(String[] args){ //创建Properties集合对象 Properties p = new Properties(); //向集合中添加元素 p.setProperty("1","Jack"); p.setProperty("2","Rose"); p.setProperty("3","Smith"); //取值 String name = p.getProperty("1"); System.out.println(name);//Jack //迭代 //把键值取出stringPropertyNames(),返回set集合 Set<String> keySet = p.stringPropertyNames(); for(String s : keySet){ System.out.println(s+"===>"+p.getProperty(s)); } } }
代码演示2:
/* 向Properties集合中添加元素并以字节流的形式存入到硬盘文件(txt,GBK) 再读取到集合中 */ import java.util.Properties; import java.io.FileOutputStream; import java.io.IOException; import java.io.FileInputStream; public class PropertiesDemo02{ public static void main(String[] args) throws IOException{ //创建Properties集合 Properties p = new Properties(); //向集合中添加元素 p.setProperty("1","Rose"); p.setProperty("2","Jack"); //创建基本输出字节流 FileOutputStream fout = new FileOutputStream("names.txt");//如果不是.properties结尾的文件默认为工作空间的编码格式 //存入磁盘 p.store(fout,""); //关闭流 fout.close(); //创建基本输入字节流 FileInputStream fin = new FileInputStream("names.txt"); //读入集合 p.load(fin); //关闭流 fin.close(); System.out.println(p);//{2=Jack, 1=Rose} } }
二.记住四套继承关系:
字节流两套:
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,它包含取自字符数组参数一个子数组的字符
代码演示:
import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.IOException; import java.io.FileOutputStream; import java.io.OutputStreamWriter; public class StreamDemo02{ public static void main(String[] args) throws IOException{ //创建字节输出流 FileOutputStream out = new FileOutputStream("E:\\JAVAPractice\\IO\\stream.txt"); //创建转换流,以UTF-8的编码写入 OutputStreamWriter ow = new OutputStreamWriter(out,"UTF-8"); //准备写入的内容 String s = "我爱APPLE"; ow.write(s); ow.close(); //创建字节输入流 FileInputStream in = new FileInputStream("E:\\JAVAPractice\\IO\\stream.txt"); //创建转换流,告诉程序应该是什么编码系统 InputStreamReader inr = new InputStreamReader(in, "UTF-8"); //定义i用来存储读取到的字节码值 int i = -1; char[] c = new char[1024]; while((i = inr.read(c)) != -1){ String str = new String(c,0,i); System.out.print(str); } inr.close(); } }
六.打印流
概述:打印流仅用于向文件中输出内容用,打印流在输出数据的时候,不会抛出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工具类的主要内容,如果未能解决你的问题,请参考以下文章
day17-缓冲流&转换流&序列化流&打印流&Properties
day17-缓冲流&转换流&序列化流&打印流&Properties