Java IO(Properties/对象序列化/打印流/commons-io)
Properties
Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串
主要方法
setProperty等同与Map接口中的put , setProperty(String key, String value)
通过键获取值, getProperty(String key)
-
load() 加载配置文件, 加载完毕以后可以通过 getProperty(String key) 取出对应的值
构造方法
- load(InputStream in) - load(Reader r)
示例
Properties pro = new Properties();
FileReader fr = new FileReader("c:\\pro.properties");
//调用集合的方法load,传递字符输入流
pro.load(fr);
String name = pro.getProperty("name");
fr.close();
System.out.println(pro); -
store() 将Properties中的键值对写入到文件中保存
构造方法
- store(OutputStream out,String common) - store(Writer w,String common)
示例
Properties pro = new Properties();
pro.setProperty("name", "zhangsan");
pro.setProperty("age", "31");
pro.setProperty("email", "123456789@163.com");
FileWriter fw = new FileWriter("c:\\pro.properties");
//键值对,存回文件,使用集合的方法store传递字符输出流
pro.store(fw, ""); // 后面一个为注释
fw.close();
对象的序列化与反序列化
序列化为将对象的信息存储到文件中,反序列化为将文件存储的对象信息读取出来.
ObjectOutputStream(对象序列化)
构造方法
- ObjectOutputStream(OutputStream out)
主要方法
- writeObject(Object obj)写出对象的方法
示例
//创建字节输出流,封装文件
FileOutputStream fos = new FileOutputStream("c:\\person.txt");
//创建写出对象的序列化流的对象,构造方法传递字节输出流
ObjectOutputStream oos = new ObjectOutputStream(fos);
Person p = new Person("lisi",25);
//调用序列化流的方法writeObject,写出对象
oos.writeObject(p);
oos.close();
ObjectInputStream(对象反序列化)
构造方法
- ObjectInputStream(InputStream in) // 传递任意的字节输入流,输入流封装文件,必须是序列化的文件
主要方法
- Object readObject() 读取对象 , 读取出来的对象为Object
示例
FileInputStream fis = new FileInputStream("c:\\person.txt");
//创建反序列化流,构造方法中,传递字节输入流
ObjectInputStream ois = new ObjectInputStream(fis);
//调用反序列化流的方法 readObject()读取对象
Object obj =ois.readObject();
System.out.println(obj);
ois.close();
序列化与反序列化过程中注意事项
静态变量不能被序列化 因为序列化是把对象数据进行持久化存储,而静态的东西不属于对象,而属于类
transient(瞬态)关键字,被transient修饰的成员变量不会被序列化
Serializable接口, 需要序列化的类必须实现这个接口才可以被序列化
-
序列化中的序列号冲突问题, 对象实现Serializable接口接口后,会给对象创建一个serialVersionUID用作标识对象,如果更改了源代码,则这个表示会改变, 在反序列化的时候java会对比文件和类的的标识是否对应,如果不对应就会报错
- 解决方法 : 给类自定义serialVersionUID,
private static final long serialVersionUID = 1478652478456L;
- 解决方法 : 给类自定义serialVersionUID,
打印流
只负责输出数据,使它们能够方便地打印各种数据值表示形式.
-
打印流的分类
PrintStream
PrintWriter
-
打印流的特点
不负责数据源,只负责数据目的(只提供输操作)
永远不会抛出IOException,但是可能抛出别的异常
两个打印流的方法,完全一致
构造方法,就是打印流的输出目的端
PrintStream构造方法 : 接收File类型,接收字符串文件名,接收字节输出流OutputStream
PrintWriter构造方法 : 接收File类型,接收字符串文件名,接收字节输出流OutputStream, 接收字符输出流Writer
主要方法
- void print(String str): 输出任意类型的数据, print和println是原样输出,不去对照码表
- void println(String str): 输出任意类型的数据,自动写入换行操作
- void write() ; 向文件中写入字节, 方法使用和ava.io.Writer一致
示例
File file = new File("c:\\1.txt");
PrintWriter pw = new PrintWriter(file);
pw.println(100); // 100
pw.write(100); // b
pw.close();
打印流开启自动刷新
/*
* 打印流,可以开启自动刷新功能
* 满足2个条件:
* 1. 输出的数据目的必须是流对象
* OutputStream Writer
* 2. 必须调用println,printf,format三个方法中的一个,启用自动刷新
*/
public static void function_3()throws IOException{
//File f = new File("XXX.txt");
FileOutputStream fos = new FileOutputStream("c:\\5.txt");
PrintWriter pw = new PrintWriter(fos,true);
pw.println("i");
pw.println("love");
pw.println("java");
pw.close();
}
打印流复制文本文件
示例
BufferedReader bfr = new BufferedReader(new FileReader("c:\\a.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("d:\\a.txt"),true);
String line = null;
while((line = bfr.readLine())!=null){
pw.println(line);
}
pw.close();
bfr.close();
}
commons_io工具类
- apache封装的对文件的操作
IO工具类FilenameUtils
主要方法
- getExtension(String path):获取文件的扩展名;
- getName():获取文件名;
- isExtension(String fileName,String ext):判断fileName是否是ext后缀
IO工具类FileUtils
主要方法
- readFileToString(File file):读取文件内容,并返回一个String;
- writeStringToFile(File file,String content):将内容content写入到file中;
- copyDirectoryToDirectory(File srcDir,File destDir);文件夹复制
- copyFile(File srcFile,File destFile);文件复制
示例
/*
* FileUtils工具类方法
* static void copyDirectoryToDirectory(File src,File desc)
* 复制文件夹
*/
public static void function_3() throws IOException{
FileUtils.copyDirectoryToDirectory(new File("d:\\demo"), new File("c:\\"));
}
/*
* FileUtils工具类的方法
* static void copyFile(File src,File desc)
* 复制文件
*/
public static void function_2() throws IOException{
FileUtils.copyFile(new File("c:\\k.jpg"),new File("d:\\k.jpg"));
}
/*
* FileUtils工具类的方法
* static void writeStringToFile(File src,String date)
* 将字符串直接写到文件中
*/
public static void function_1() throws IOException{
FileUtils.writeStringToFile(new File("c:\\b.txt"),"我爱Java编程");
}
/*
* FileUtils工具类的方法
* static String readFileToString(File src)读取文本,返回字符串
*/
public static void function() throws IOException{
String s = FileUtils.readFileToString(new File("c:\\a.txt"));
System.out.println(s);
}