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

Java28缓冲/转换/序列化/打印流,Properties

Java中的IO流如何理解——精简

转换流,打印流,序列化

25_IO_第25天(Properties序列化流打印流CommonsIO)