一、properties集合
集合对象Properties类,继承Hashtable,实现Map接口,可以和IO对象结合使用,实现数据的持久存储。
特点:
- Hashtable的子类,map集合中的方法都可以用。
- 该集合没有泛型。键值都是字符串。
- 它是一个可以持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备。
- 有和流技术相结合的方法。
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:\\")); }