Properties类,序列化流与反序列流,关键字transient,打印流,classpath中的FilenameUtils,以及FileUtils

Properties类:

      Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

      特点:

            1、Hashtable的子类,map集合中的方法都可以用,实现了map接口。不可以使用普通for遍历,没有下标。

            2、该集合没有泛型。键值都是字符串。

            3、它是一个可以持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备。

            4、有和流技术相结合的方法

  Properties类,序列化流与反序列流,关键字transient,打印流,classpath中的FilenameUtils,以及FileUtils

      将数据存到集合中:

            

public class Demo01 {
public static void main(String[] args) {
    //创建Properties集合
    Properties pro=new Properties();
    //存值
    pro.put("url","jdbc:mysql://loacathost:8080...");
    pro.put("user","root");
    pro.put("pwd", "13456");
    //取值
    System.out.println(pro.getProperty("url"));
    System.out.println(pro.getProperty("user"));
    System.out.println(pro.getProperty("pwd"));
}
}

    Properties类,序列化流与反序列流,关键字transient,打印流,classpath中的FilenameUtils,以及FileUtils

     方法应用:

        

public class Demo02 {

    public static void main(String[] args) throws IOException {
        // 创建Properties集合
        Properties pro=new Properties();
        //明确数据源
        FileInputStream frs=new FileInputStream("src/com/oracle/demo04/pro.properties");
        //将文件中的键值对读取到集合中
        pro.load(frs);
        System.out.println(pro);
    }

}

    

public class Demo03 {

    public static void main(String[] args) throws IOException {
        // 创建Properties集合
        Properties pro=new Properties();
        pro.put("name", "tom");
        pro.put("age", "20");
    //明确目的地
        FileWriter fw=new FileWriter("src/com/oracle/demo04/pro.properties",true);
        //将集合中的数据存储到文件中
        pro.store(fw,"This is a person");//只能是英文
    }

}

  

driver=com.mysql.jdba.Driver
url=jdbc:mysql://localhost:8080
user=root
pwd=123456#
#Mon Nov 02 19:18:56 CST 2020
age=20
name=tom
#This is a person
#Mon Nov 02 19:19:58 CST 2020
age=20
name=tom

    只能存入以properties结尾的文件,其他文件都不行,并且properties文件不能有空格,分号,只能存键值对。

Properties的通常用法:

      解决硬编码问题。

      

public class JDBCUtils {
//获取连接对象
    public static Connection getConn(){
        Connection conn=null;
        try {
            // 2:获取连接对象
            Properties pro=new Properties();
            FileInputStream fis=new FileInputStream("src/com/oracle/tools/db.properties");
            pro.load(fis);
            Class.forName(pro.getProperty("driver"));
            String url = pro.getProperty("url");
            String user =pro.getProperty("user");
            String pwd =pro.getProperty("pwd");
            conn = DriverManager.getConnection(url, user, pwd);
            
            
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;
    }
#driver=com.mysql.jdbc.Driver
#url=jdbc:mysql://localhost:3306/demo0803?characterEncoding=utf8
#user=root
#pwd=123456


#driver=com.oracle.jdbc.Driver
#url=jdbc:oracle://localhost:3306/demo0803?characterEncoding=utf8
#user=root
#pwd=123456

      可以注释,只需要改动部分代码。

序列化流与反序列化流:

      将一个对象存到文件中,将文件取出来用反序列化流。

      ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。

      Properties类,序列化流与反序列流,关键字transient,打印流,classpath中的FilenameUtils,以及FileUtils

       Properties类,序列化流与反序列流,关键字transient,打印流,classpath中的FilenameUtils,以及FileUtils

       需要明确目的地:依旧是功能流。

      代码:

        

public class Person implements Serializable{
    //瞬态关键字
private transient String name;
private static int age;
private static final long serialVersionUID=123l;
public Person() {
    super();
}    //构造方法倒数第三行
public Person(String name, int age) {
    super();
    this.name = name;
    this.age = age;
}
public String getName() {
return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
public class Demo01 {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        Person p=new Person("张三",18);
        //明确目的地
        FileOutputStream fos=new FileOutputStream("D:\io0803\person.txt");
        //创建一个序列化流
        ObjectOutputStream oos=new ObjectOutputStream(fos);
        //将对象写入文件中
        oos.writeObject(p);
        //释放资源
        oos.close();
    }
}

类通过实现 java.io.Serializable 接口以启用其序列化功能。

反序列化流:

      ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。支持 java.io.Serializable接口的对象才能从流读取。

      Properties类,序列化流与反序列流,关键字transient,打印流,classpath中的FilenameUtils,以及FileUtils

       Properties类,序列化流与反序列流,关键字transient,打印流,classpath中的FilenameUtils,以及FileUtils

       

public class Demo02 {

    public static void main(String[] args) throws ClassNotFoundException, IOException {
        //明确数据源
        FileInputStream fis=new FileInputStream("D:\io0803\person.txt");
        //创建反序列化流对象
        ObjectInputStream ois=new ObjectInputStream(fis);
        //读出一个对象
        Person p=(Person)ois.readObject();//将Object转为Person,强转
        System.out.println(p);
        //释放资源
        ois.close();
        //创建对象的方式,反序列化
    }
                //不能用字符流
}

注意事项:

    程序序列化过程:

          Properties类,序列化流与反序列流,关键字transient,打印流,classpath中的FilenameUtils,以及FileUtils    person.java编译时,只要实现此接口,就会形成序列化号,对象存入文件中的时候,会将类的序列化号存入文件中,当反序列化时,2个号会对比,一样就成功,不一样会报错。

    Serializable标记接口。该接口给需要序列化的类,提供了一个序列版本号。serialVersionUID. 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。private static final long       serialVersionUID=123L

瞬态关键字:

    当一个类的对象需要被序列化时,某些属性不需要被序列化,这时不需要序列化的属性可以使用关键字transient修饰。只要被transient修饰了,序列化时这个属性就不会序列化了。

同时静态修饰也不会被序列化,因为序列化是把对象数据进行持久化存储,而静态的属于类加载时的数据,不会被序列化。

    private transient String name;

 打印流:

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

      打印流根据流的分类:

      字节打印流  PrintStream

      字符打印流  PrintWriter

      方法:

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

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

      字节与字符的方法打印流都可以使用

    PrintWriter:   

    Properties类,序列化流与反序列流,关键字transient,打印流,classpath中的FilenameUtils,以及FileUtils   

     可以通过构造方法,完成文件数据的自动刷新功能

       构造方法:

       开启文件自动刷新写入功能

        public PrintWriter(OutputStream out, boolean autoFlush)

        public PrintWriter(Writer out, boolean autoFlush)

      代码:

        

public class Demo03 {

    public static void main(String[] args) throws IOException {
        // 明确数据源
FileReader fr=new FileReader("D:\io0803\demo01.txt");
        //添加创建缓冲字符输入流加速
BufferedReader br=new BufferedReader(fr);
//明确目的地
FileWriter fw=new FileWriter("D:\demo01.txt");
//创建打印流,开启自动刷新功能
PrintWriter pw=new PrintWriter(fw,true);
//开始复制
String line=null;
while((line=br.readLine())!=null){
    //写一行
    pw.println(line);
}
//释放资源
br.close();
pw.close();
    }

工具类:commons-IO

    1:导入classpsth

      加入classpath的第三方jar包内的class文件才能在项目中使用

      创建lib文件夹

      将commons-io.jar拷贝到lib文件夹

      右键点击commons-io.jar,Build Path→Add to Build Path

    2:FilenameUtils

        这个工具类是用来处理文件名(译者注:包含文件路径)的,他可以轻松解决不同操作系统文件名称规范不同的问题

         常用方法:

          getExtension(String path):获取文件的扩展名;

          getName(String filename):获取文件名;

          isExtension(String fileName,String ext):判断fileName是否是ext后缀名;

    3:FileUtils

        提供文件操作(移动文件,读取文件,检查文件是否存在等等)的方法。

          常用方法:

          readFileToString(File file):读取文件内容,并返回一个String;

          writeStringToFile(File file,String content):将内容content写入到file中;

          copyDirectoryToDirectory(File srcDir,File destDir);文件夹复制

          copyFile(File srcFile,File destFile);文件复制

  

public class Demo01 {

    public static void main(String[] args) {
        //获取文件扩展名
        String ext=FilenameUtils.getExtension("D:\io0803\demo01.txt");
        System.out.println(ext);
        //获取文件名
        String name=FilenameUtils.getName("D:\io0803\demo01.txt");
        System.out.println(name);
        //判断文件是否以某后缀结尾
        boolean flag=FilenameUtils.isExtension(name,"java");
        System.out.println(flag);
        //读取文件内容,并返回下一个String
    
    }

}
    public static void main(String[] args) throws IOException {
        // 复制文件夹
        //明确数据源
        //File file1=new File("D:\io0803");
        //明确目的地
        //File file2=new File("D:\io0804");
        //复制
        //FileUtils.copyDirectoryToDirectory(file1, file2);
        //读取文件内容,并返回一个String
        /*File file3=new File("D:\io0803\demo01.txt");
        String aa1=FileUtils.readFileToString(file3);
        System.out.println(aa1);*/
        //File file=new File("D:\io0803\demo02.txt");
        //FileUtils.writeStringToFile(file,"将字符内容写入文件中");
        File file1=new File("D:\io0803\demo02.txt");
        File file2=new File("D:\io0803\demo000.txt");
        FileUtils.copyFile(file1, file2);
    }

}