Java——Properties集合,Object序列化流与反序列化流,打印流,commons-IO文件工具类

一、properties集合

集合对象Properties类,继承Hashtable,实现Map接口,可以和IO对象结合使用,实现数据的持久存储。

特点:

  1. Hashtable的子类,map集合中的方法都可以用。
  2. 该集合没有泛型。键值都是字符串。
  3. 它是一个可以持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备。
  4. 有和流技术相结合的方法。

1、基本使用

private static void func() {
    //没有泛型
    Properties pro = new Properties();
    //使用setProperty设置键值对,等同Map接口的set
    pro.setProperty("a", "1");
    pro.setProperty("b", "2");
    pro.setProperty("c", "3");
    System.out.println(pro);    //{a=1, b=2, c=3}

    //由键获取值,等同Map接口的get
    String v = pro.getProperty("c");
    System.out.println(v);

    //方法stringPropertyNames,将集合中的键存储到Set集合,类似于Map接口的方法keySet
    Set<String> set = pro.stringPropertyNames();
    for(String k : set){
        System.out.println(k+"..."+pro.getProperty(k));
    }
}

2、读取文件中的键值对保存到集合

/*
 * Properties集合特有方法 load
 * load(InputStream in)
 * load(Reader r)
 * 传递任意的字节或者字符输入流
 * 流对象读取文件中的键值对,保存到集合
 */
private static void func() throws IOException {
    //实例化properties集合
    Properties pro = new Properties();
    //实例化字符/字节输入流
    FileReader fr = new FileReader("/home/x54256/桌面/pro.properties");
    //读取数据,保存到Propertie集合中
    pro.load(fr);
    //关闭文件
    fr.close();
    //打印
    System.out.println(pro);    // {name=x5456, age=23, email=123@qq.com}
}

文件格式

name=x5456
age=23email=123@qq.com

3、存到文件中

/*
 * Properties集合的特有方法store
 * store(OutputStream out)
 * store(Writer w)
 * 接收所有的字节或者字符的输出流(需要flush),将集合中的键值对,写回文件中保存
 */
private static void func() throws IOException {
    Properties pro = new Properties();
    pro.setProperty("name","x5456");
    pro.setProperty("age","12");
    pro.setProperty("email","123@gmail.com");

    //键值对格式存回文件,使用集合的方法store传递字符输出流
    FileOutputStream fos = new FileOutputStream("/home/x54256/桌面/1.txt");
    pro.store(fos,"save msg");
    fos.close();
}

二、序列化流与反序列化流

用于从流中读取对象的操作流ObjectInputStream 称为反序列化流,用于向流中写入对象的操作流ObjectOutputStream 称为序列化流

  • 特点:用于操作对象。可以将对象写入到文件中,也可以从文件中读取对象。

Person类

import java.io.Serializable;

public class Person implements Serializable {   //需要实现接口Serializable
    private String name;
    private /*transient关键字:阻止成员变量序列化*/ int age;
    //类,自定义了序列号,编译器不会计算序列号(就算保存到文件后修改了java代码,也没关系)
    private static final long serialVersionUID = 1478652478456L;

    //tostring,init,get,set方法...
}

1、将对象写入文件中

/*
 * ObjectOutputStream
 * 构造方法: ObjectOutputStream(OutputSteam out)
 * 传递任意的字节输出流
 * void writeObject(Object obj)写出对象的方法
 */
private static void func() throws IOException {
    FileOutputStream fos = new FileOutputStream("/home/x54256/桌面/2.txt");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    Person p = new Person("x5456",23);
    oos.writeObject(p);
    oos.close();
}

2、从文件中读取对象

/*
 * ObjectInputStream
 * 构造方法:ObjectInputStream(InputStream in)
 * 传递任意的字节输入流,输入流封装文件,必须是序列化的文件
 * Object readObject()  读取对象
 */
private static void func() throws IOException, ClassNotFoundException {
    FileInputStream fis = new FileInputStream("/home/x54256/桌面/2.txt");
    //创建反序列化流,构造方法中,传递字节输入流
    ObjectInputStream ois = new ObjectInputStream(fis);
    //调用反序列化流的方法 readObject()读取对象
    Object obj = ois.readObject();
    System.out.println(obj);
    ois.close();
}

三、打印流

打印流添加输出数据的功能,使它们能够方便地打印各种数据值表示形式。

打印流根据流的分类:

  • 字节打印流 PrintStream:构造方法,接收File类型,接收字符串文件名,接收字节输出流OutputStream

  • 字符打印流 PrintWriter:构造方法,接收File类型,接收字符串文件名,接收字节输出流OutputStream, 接收字符输出流Writer

 

方法:

 

void print(String str): 输出任意类型的数据,

void println(String str): 输出任意类型的数据,自动写入换行操作

特点:

  • 1. 此流不负责数据源,只负责数据目的
  • 2. 为其他输出流,添加功能
  • 3. 永远不会抛出IOException,但可能抛出别的异常

1、写入文件

/*
 * 打印流,向File对象的数据目的写入数据
 * 方法print println  原样输出
 * write方法走码表
 */
public static void function() throws FileNotFoundException{
	//文件
	File file = new File("c:\\1.txt");
	PrintWriter pw = new PrintWriter(file);
	//字符串		
	PrintWriter pw = new PrintWriter("c:\\2.txt");		
	pw.println(100);	//100
	pw.write(100);		//d
	//字节输出流
	FileOutputStream fos = new FileOutputStream("c:\\3.txt");
	PrintWriter pw = new PrintWriter(fos);
	//字符输出流
	FileWriter fw = new FileWriter("c:\\4.txt");
	PrintWriter pw = new PrintWriter(fw);

	pw.close();
}

2、自动刷新

/*
 * 打印流实现文本复制
 *   读取数据源  BufferedReader+File 读取文本行
 *   写入数据目的 PrintWriter+println 自动刷新
 */
public static void main(String[] args) throws IOException{
	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文件工具类

1、获取文件扩展名

/*
 * FilenameUtils类的方法
 * static String getExtension(String filename)
 * 获取文件名的扩展名
 */
 public static void function(){
	 String name = FilenameUtils.getExtension("c:\\windows");
	 System.out.println(name);
 }

2、获取文件名

/*
 * FilenameUtils类的方法
 * static String getName(String filename)
 * 获取文件名
 */
public static void function_1(){
	String name = FilenameUtils.getName("c:\\windows\\");
	System.out.println(name);
}

3、判断文件后缀

/*
 * FilenameUtils类的方法
 * static boolean isExtension(String filename,String extension)
 * 判断文件名的后缀是不是extension
 */
public static void function_2(){
	boolean b = FilenameUtils.isExtension("Demo.java", "java");
	System.out.println(b);
}

4、读取文本

/*
 * 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);
 }

5、写入文本

/*
 * FileUtils工具类的方法
 * static void writeStringToFile(File src,String date)
 * 将字符串直接写到文件中
 */
public static void function_1() throws IOException{
	FileUtils.writeStringToFile(new File("c:\\b.txt"),"我爱Java编程");
}

6、复制文件

/*
 * 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"));
}

7、复制文件夹

/*
 * FileUtils工具类方法
 * static void copyDirectoryToDirectory(File src,File desc)
 * 复制文件夹
 */
public static void function_3() throws IOException{
	FileUtils.copyDirectoryToDirectory(new File("d:\\demo"), new File("c:\\"));
}

 

posted @ 2018-02-11 17:02  想54256  阅读(441)  评论(0编辑  收藏  举报