Java进阶_IO流

IO流

一、流的概念

什么是流

  • 概念:内存与存储设备之间传输数据的通道。

17

  • 水借助管道传输;数据借助流传输。

二、流的分类

1、按方向【重点】

  • 输入流:将<存储设备>中的内容读入到<内存>中。
  • 输出流:将<内存>中的内容写入到<存储设备>中。

2、按单位

  • 字节流:以字节为单位,可以读写所有数据。
  • 字符流:以字符为单位,只能读写文本数据。

3、按功能

  • 节点流:具有实际传输数据的读写功能。
  • 过滤流:在节点流的基础之上增强功能。

三、字节流

1、字节流的父类(抽象类)

  • InputStream:字节输入流
public int read() {}

public int read (byte[] b) {}

public int read (byte[] b, int off, int len) {}
  • OutputStream:字节输出流
public void write(int n) {}

public void write(byte[] b) {}

public void write(byte[] b, int off, int len) {}

2、字节流的实现类

2.1、文件字节流

  • FileInputStream:

    • public int read(byte[] b) //从流中读取多个字节,将读到内容存入b数组,返回实际读到的字节数;如果达到文件的尾部,则返回-1。
  • File0utputStream:

    • public void write(byte[] b) //-次写多个字节,将b数组中所有字节,写入输出流。
FileInputStream案例

D盘的记事本:aaa.txt

读取记事本内容

package com.mike.test;

/*
        演示FileInputStream的使用
        文件字节输入流
*/
import java.io.FileInputStream;

public class Demo01 {
    public static void main(String[] args) throws Exception {
        //1、创建FileInputStream对象
        FileInputStream fis = new FileInputStream("d:\\aaa.txt");
        //2、读取文件
        //fis.read()
        //2.1、单个字节读取
//        int data = 0;
//        while ((data=fis.read())!=-1){
//            System.out.print((char) data);
//        }
        //2.2、一次读取多个字节

        byte[] buf = new byte[1024];
        int count = 0;
        while ((count=fis.read(buf))!=-1){
            System.out.println(new String(buf,0,count));
        }
//        int count = fis.read(buf);
//        System.out.println(new String(buf));
//        System.out.println(count);


        //3、关闭
        fis.close();
        System.out.println("执行完毕!");

    }
}
 /*输出结果
                HelloWord!
                执行完毕!
*/
File0utputStream案例
package com.mike.test;

/*
        演示文件字节输出流的使用
        FileOutputStream
*/

import java.io.FileOutputStream;
import java.nio.charset.StandardCharsets;

public class Demo02 {
    public static void main(String[] args) throws Exception{
        //1、创建FileOutputStream对象
//        FileOutputStream fos = new FileOutputStream("d:\\bbb.txt");//没有true表示覆盖原内容
        //FileOutputStream("d:\\bbb.txt",true);true表示如果有内容,运行一次追加一次
        //这里我运行了两次
        FileOutputStream fos = new FileOutputStream("d:\\bbb.txt",true);
        //2、写入文件
//        fos.write(97);
//        fos.write('b');
//        fos.write('c');

//		一次性写入多个字符
        String string = "HelloEarth";
        fos.write(string.getBytes());



        //3、关闭流
        fos.close();
        System.out.println("执行完毕!");
    }
}

/*
                执行完毕!
*/
小案例:实现文件的复制
package com.mike.test;

import java.io.FileInputStream;
import java.io.FileOutputStream;

/*
        实现文件的复制
        FileInputStream,FileOutputStream
*/
public class Demo03 {
    public static void main(String[] args) throws Exception{
        //1、创建流
        //1.1、创建文件输入流
        FileInputStream fis = new FileInputStream("d:\\001.jpg");
        //1.2、创建文件输出流
        FileOutputStream fos = new FileOutputStream("d:\\002.jpg");

        //2、一边读,一边写
        byte[] buf = new byte[1024];
        int count = 0;
        while ((count=fis.read(buf))!=-1){
            fos.write(buf,0,count);
        }

        //3、关闭流
        fis.close();
        fos.close();
        System.out.println("复制完毕!");

    }
}

/*
                复制完毕!
*/
21

2.2、字节缓冲流

  • 缓冲流: BufferedInputStream/ BufferedOutputStream
    • 提高IO效率,减少访问磁盘的次数;
    • 数据存储在缓冲区中,flush是将缓存区的内容写入文件中,也可以直接close。
BufferedInputStream案例
package com.mike.test;

import java.io.BufferedInputStream;
import java.io.FileInputStream;

/*
            使用字节缓冲流读取
            BufferedInputStream
*/
public class Demo04 {
    public static void main(String[] args) throws Exception{
        //1、创建BufferedInputStream
        FileInputStream fis = new FileInputStream("d:\\aaa.txt");
        BufferedInputStream bis = new BufferedInputStream(fis);

        //2、读取
//        int data = 0;
//        while ((data=bis.read())!=-1){
//            System.out.println((char) data);
//        }

        //BufferedInputStream有自己的缓冲区是8k
        //这里我们自己创建一个缓冲区,一次性读取多字节
        byte[] buf = new byte[1024];
        int count = 0 ;
        while ((count=bis.read(buf))!=-1){
            System.out.println(new String(buf,0,count));
        }

        //3、关闭流
        //这里只要关闭缓冲流就行,文件字节流会因为缓冲流的关闭自动关闭
        bis.close();
        System.out.println("利用缓冲流读取完毕!");

    }
}
/*
                HelloWord!
                利用缓冲流读取完毕!
*/
BufferedOutputStream案例
package com.mike.test;

/*
            使用字节缓冲流读取
            BufferedOutputStream
*/

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;

public class Demo05 {
    public static void main(String[] args) throws Exception{
        FileOutputStream fos = new FileOutputStream("d:\\buffer.txt");
        //1、创建字节输出缓冲流
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        //2、写入文件
        String s = "HelloWord\n";
        for (int i = 0; i < 10; i++) {
            bos.write(s.getBytes());
            bos.flush();//刷新到硬盘
        }

        //3、关闭字节输出缓冲流
        bos.close();//内部会调用一次flush();
        System.out.println("利用缓冲流写入完毕!");
    }
}

四、对象流

  • 对象流: ObjectInputStream/ObjectOutputStream
    • 增强了缓冲区功能
    • 增强了读写8种基本数据类型和字符串功能
    • 增强了读写对象的功能
      • readObject( ) 从流中读取一个对象(反序列化)
      • writeObject (Object obj) 向流中写入一个对象(序列化)

使用流传输对象的过程称为序列化、反序列化。

序列化案例

写入操作

Student类

package com.mike.test;

import java.io.Serializable;

public class Student implements Serializable {
    //    serialVersionUID:序列化版本号ID
    private static final 1ong serialVersionUID = 100L ;
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        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 "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

Demo6 类

package com.mike.test;


import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

/*
*使用objectOutputStream实现对象的序列化
* 要求:序列化类必须要实现Serializable接口
 * */
public class Demo6 {
    public static void main(String[] args) throws Exception{
        FileOutputStream fos = new FileOutputStream("d:\\stu.bin");
        //1、创建对象流
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        //2、序列化(写入操作)
        Student zhangsan = new Student("张三",20);
        /*序列化多个对象,用集合来存放
        Student zhangsan=new Student("张三",20);
		Student lisi=new Student("李四", 22);
		ArrayList<student> list = new ArrayList<student>();
		list.add(zhangsan);
		list.add(lisi);
		oos.write0bject(list);
        */
        oos.writeObject(zhangsan);
        //3、关闭流
        oos.close();
        System.out.println("序列化完毕!");

    }
}
/*
用记事本打开stu.bin文件,看到一堆乱码,但是还是可以看到一些信息。这就是序列化操作
*/

反序列化案例

读取操作

package com.mike.test;


import java.io.FileInputStream;
import java.io.ObjectInputStream;

/*
*使用objectInputStream实现反序列化(读取重构成对象)
 * */
public class Demo7 {
    public static void main(String[] args) throws Exception{
        FileInputStream fis = new FileInputStream("d:\\stu.bin");
        //1、创建对象流
        ObjectInputStream ois = new ObjectInputStream(fis);
        //2、反序列化(读取文件)
        Student s = (Student) ois.readObject();//只能读取一次,就像刮卡一样
        //ArrayList<Student> list = (ArrayList<student>)ois.readobject();
        //3、关闭流
        ois.close();
        System.out.println("反序列化完毕!");
        System.out.println(s.toString());
        //System.out.println(list.toString());
    }
}
/*读取stu.bin文件后,输出结果:
                反序列化完毕!
                Student{name='张三', age=20}
*/

注意点

序列化ObjectOutputStream和反序列化ObjectInputStream注意事项:

  • (1)序列化类必须要实现Serializable接口
  • (2)序列化类中对象属性要求实现Serializable接口
  • (3)序列化版本号ID,保证序列化的类和反序列化的类是同一个类
  • (4)使用transient(瞬间的)修饰属性,这个属性不能序列化
  • (5)静态属性不能序列化
  • (6)序列化多个对象,可以借助集合实现

五、编码方式

字符编码

  • ISO-8859-1   收录除ASCII外,还包括西欧、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。
  • UTF-8     针对Unicode码表的可变长度字符编码
  • GB2312    简体中文
  • GBK      简体中文、扩充
  • BIG5      台湾,繁体中文

当编码方式和解码方式不一致时,会出现乱码。

六、字符流

  • 字符流的父类(抽象类) :

    • Reader: 字符输入流
    public int read() {}
    
    public int read (char[] c) {}
    
    public int read (char[] b, int off, int len) {}
    
    • Writer:字符输出流
    public void write(int n) {}
    
    public void write(String str) {}
    
    public void write(char[] c) {}
    

文件字符流

  • FileReader:

    • public int read(char[] c) //从流中读取多个字符,将读到内容存入c数组,返回实际读到的字符数;如果达到文件的尾部,则返回-1。
  • FileWriter:

    • public void write(String str) //一次写多个字符,将b数组中所有字符,写入输出流。

FileReader的使用

package com.mike.test;

/*
        使用FileReader读取文件
*/

import java.io.FileOutputStream;
import java.io.FileReader;


public class Demo02 {
    public static void main(String[] args) throws Exception{
        //1、创建FileReader  文件字符输入流
        FileReader fr = new FileReader("d:\\hello.txt");
        //2、文件读取
        //2.1、单个字符读取
/*        int data = 0;
        while ((data= fr.read())!=-1){
            System.out.print((char) data);
        }*/
        char[] buf = new char[1024];
        int count = 0;
        while ((count= fr.read(buf))!=-1){
            System.out.println(new String(buf,0,count));
        }

        //3、关闭流
        fr.close();
        System.out.println("\n文件字符输入流读取完毕!");
    }
}
/*
            人生最大的悲痛莫过于辜负青春。——薄伽丘

            文件字符输入流读取完毕!
*/

FileWriter的使用

package com.mike.test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;

/*
        使用FileWriter写入文件
*/
public class Demo03 {
    public static void main(String[] args) throws Exception{
        //1、创建FileWriter对象
        FileWriter fw = new FileWriter("d:\\write.txt");
        //写入方法
        for (int i = 0; i < 10; i++) {
            fw.write("Java是世界上最好的语言\t");
            fw.flush();
        }

        //3、关闭FileWriter对象
        fw.close();
        System.out.println("利用FileWriter写入完毕!");

        
    }
}
                /*输出结果
                利用FileWriter写入完毕!
                */

字符流复制文件

package com.mike.test;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;

/*
            使用FileReader和FileWriter复制文本文件,不能复制图片或二进制文件(不能复制图片,声音,视频)

*/
public class Demo04 {
    public static void main(String[] args) throws Exception{
        //1、创建FileRead和FileWriter
        FileReader fr = new FileReader("d:\\write.txt");
        FileWriter fw = new FileWriter("d:\\write2.txt");
        //2、一边读一边写
        int data = 0;
        while ((data=fr.read())!=-1){
            fw.write(data);
        }

/*
        char[] buf = new char[1024];
        int count = 0;
        while ((count= fr.read(buf))!=-1){
            fw.write(buf);
        }
*/

        //3、关闭流
        fr.close();
        fw.close();
        System.out.println("文本复制完毕!");
    }
}
/*输出结果:
                    文本复制完毕!
*/

字符缓冲流

  • 缓冲流: BufferedReader/BufferedWriter
    • 高效读写
    • 支持输入换行符。
    • 可一次写一行、读一行。

BufferedReader的使用

package com.mike.test;

/*
        使用字符缓冲流读取文件
        BufferedReader
*/

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;

public class Demo05 {
    public static void main(String[] args) throws Exception{
        //1、创建缓冲流
        FileReader fr = new FileReader("d:\\write.txt");
        BufferedReader br = new BufferedReader(fr);
        //2、读取文件
        //2.1、第一种方式
/*        char[] buf = new char[1024];
        int count = 0;
        while ((count= br.read(buf))!=-1){
            System.out.print(new String(buf,0,count));
        }*/
        //2.2、第二种方式,一行一行的读取
        String line = null;
        while ((line= br.readLine())!=null){
            System.out.println(line);
        }
        //3、关闭
        br.close();
        System.out.println("读取完毕!");
    }
}
/*输出结果:
                    Java是世界上最好的语言
                    Java是世界上最好的语言
                    Java是世界上最好的语言
                    Java是世界上最好的语言
                    Java是世界上最好的语言
                    Java是世界上最好的语言
                    Java是世界上最好的语言
                    Java是世界上最好的语言
                    Java是世界上最好的语言
                    Java是世界上最好的语言
                    读取完毕!
*/

BufferedWriter的使用

package com.mike.test;


import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.ObjectOutputStream;

/*
    演示BufferedWriter的使用
  */
public class Demo6 {
    public static void main(String[] args) throws Exception{
        //1、创建BufferedWriter对象
        FileWriter fw = new FileWriter("d:\\buffer.txt");
        BufferedWriter bw = new BufferedWriter(fw);
        //2、写入
        for (int i = 0; i < 10; i++) {
            bw.write("好好学习,天天向上!");
            bw.newLine();//写入一个换行符Windows-->\r\n      Linux-->\n
            bw.flush();
        }
        //3、关闭

        bw.close();
        System.out.println("写入完毕!");
    }
}
                /*输出结果
                		写入完毕!
                */

打印流

  • PrintWriter:
    • 封装了print() / println()方法,支持写入后换行。
    • 支持数据原样打印

PrintWriter的使用

package com.mike.test;


import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.PrintWriter;

/*
    演示PrintWriter的使用
  */
public class Demo7 {
    public static void main(String[] args) throws Exception{
        //1、创建打印流
        PrintWriter pw = new PrintWriter("d:\\print.txt");
        //2、打印
        pw.println(97);
        pw.println(true);
        pw.println(3.14);
        pw.println('c');
        //3、关闭
        pw.close();
        System.out.println("打印完毕!");
    }
}

转换流

  • 桥转换流: InputStreamReader/OutputStreamWriter
    • 可将字节流转换为字符流。
    • 可设置字符的编码方式。

InputStreamReader的使用

package com.mike.test;


import java.io.FileInputStream;
import java.io.InputStreamReader;

/*
        使用InputStreamReader读取文件,指定使用的编码
*/
public class Demo08 {
    public static void main(String[] args) throws Exception{
        //1、创建InputStreamReader对象
        FileInputStream fis = new FileInputStream("d:\\write.txt");
        InputStreamReader isr = new InputStreamReader(fis,"utf-8");

        //2、读取文件
        int data = 0;
        while ((data= isr.read())!=-1){
            System.out.print((char) data);
        }

        //3、关闭
        isr.close();
        System.out.println("读取完毕!");
    }
}

/*
            Java是世界上最好的语言
            Java是世界上最好的语言
            Java是世界上最好的语言
            Java是世界上最好的语言
            Java是世界上最好的语言
            Java是世界上最好的语言
            Java是世界上最好的语言
            Java是世界上最好的语言
            Java是世界上最好的语言
            Java是世界上最好的语言
            读取完毕!
*/

OutputStreamWriter的使用

package com.mike.test;

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

/*
        使用OutputStreamWriter写入文件,指定使用的编码
*/
public class Demo09 {
    public static void main(String[] args) throws Exception{
        //1、创建OutputStreamWriter对象
        FileOutputStream fos = new FileOutputStream("d:\\info.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
        //2、写入文件
        for (int i = 0; i < 10; i++) {
            osw.write("我爱北京天安门!!!\r\n");
            osw.flush();
        }

        //3、关闭
        osw.close();
        System.out.println("写入完毕!");

    }
}
                /*输出结果:
                		写入完毕!
                */

七、File类

  • 概念:代表物理盘符中的一个文件或者文件夹。
  • 方法:
    • createNewFile()//创建一一个新 文件
    • mkdir()//创建-一个新目录
    • delete()//删除文件或空目录
    • exists ()//判断File对象所对象所代表的对象是否存在
    • getAbsolutePath()//获取文件的绝对路径
    • getName()//取得名字
    • getParent()//获取文件/目录所在的目录.
    • isDirectory()//是否是目录
    • isFile()//是否是文件
    • length()//获得文件的长度
    • listFiles ()//列出目录中的所有内容
    • renameTo()//修改文件名为

创建文件/文件夹

package com.mike.test;

/*
File类的使用
(1)分隔符
(2)文件操作
(3)文件夹操作
*/

import java.io.File;
import java.util.Date;

public class Demo01 {
    public static void main(String[] args) throws Exception {
        //separator();
        //fileOpe();
        directoryOpe();

    }

    //(1)、分隔符
    public static  void  separator(){
        System.out.println("路径分隔符"+ File.pathSeparator);
        System.out.println("名称分隔符"+ File.separatorChar);
    }

    //(2)、文件操作
    public static void fileOpe() throws Exception{
        //1、创建文件
        File file = new File("d:\\file.txt");
        //System.out.println(file.toString());

        if (!file.exists()){
            boolean b = file.createNewFile();
            System.out.println("创建的结果:"+b);
        }
        //============================================
        //2、删除文件
        //2.1、直接删除
/*        boolean delete = file.delete();
        System.out.println("删除结果:"+delete);*/
        //2.2、使用JVM退出时删除文件
/*        file.deleteOnExit();
        Thread.sleep(5000);//休眠5秒钟后,JVM进程结束*/
        //============================================
        //3、获取文件信息
        System.out.println("获取文件的绝对路径:"+file.getAbsolutePath());
        System.out.println("获取路径:"+file.getPath());
        System.out.println("获取文件名称:"+file.getName());
        System.out.println("获取父目录:"+file.getParent());
        System.out.println("获取文件长度:"+file.length()+"字节");
        System.out.println("获取文件创建时间:"+new Date(file.lastModified()).toLocaleString());

        //4、判断
        //============================================
        System.out.println("文件是否可写:"+file.canWrite());
        System.out.println("是否属于文件:"+file.isFile());
        System.out.println("是否属于隐藏文件:"+file.isHidden());

    }

    //(3)、文件夹操作
    public static  void directoryOpe() throws Exception {
        //1、创建文件夹
        File dir = new File("d:\\aaa\\bbb\\ccc");
        System.out.println(dir.toString());
        if (!dir.exists()){
            //dir.mkdir();//只能创建单级目录
            boolean mkdirs = dir.mkdirs();//可以创建多级目录
            System.out.println("创建文件夹结果:"+mkdirs);
        }
        //2、删除文件夹
        //2.1、直接删除(注意:只能删除空目录)
        /*System.out.println("删除结果:"+dir.delete());*/
        //2.2、使用JVM删除
/*        dir.deleteOnExit();
        Thread.sleep(5000);//睡眠5秒后删除*/
        //3、获取文件夹信息
        System.out.println("获取绝对路径:"+dir.getAbsolutePath());
        System.out.println("获取路径:"+dir.getPath());
        System.out.println("获取文件夹名称:"+dir.getName());
        System.out.println("获取父目录:"+dir.getParent());
        System.out.println("获取文件夹创建时间:"+new Date(dir.lastModified()).toLocaleString());
        //4、判断
        System.out.println("是否属于文件夹:"+dir.isDirectory());
        System.out.println("是否属于隐藏文件夹:"+dir.isHidden());

        //5、遍历文件夹
//        File dir2 = new File("");
//        String[] files = dir2.list();
//        System.out.println("------------------------------");
//        for (String string : files) {
//            System.out.println(string);
//        }
    }
}
 /*输出结果
                d:\aaa\bbb\ccc
                获取绝对路径:d:\aaa\bbb\ccc
                获取路径:d:\aaa\bbb\ccc
                获取文件夹名称:ccc
                获取父目录:d:\aaa\bbb
                获取文件夹创建时间:2022-3-12 20:16:14
                是否属于文件夹:true
                是否属于隐藏文件夹:false
*/

FileFilter接口

  • FileFilter(文件过滤器)

  • public interface FileFilter

    • boolean accept (File pathname)
  • 当调用File类中的listFiles()方法时,支持传入FileFilter接口接口实现类,对获取文件进行过滤,只有满足条件的文件的才可出现在listFiles()的返回值中。

过滤出.jpg文件

package com.mike.test;

/*
File类的使用
(1)分隔符
(2)文件操作
(3)文件夹操作
*/

import java.io.File;
import java.io.FileFilter;
import java.util.Date;

public class Demo01 {
    public static void main(String[] args) throws Exception {
        directoryOpe();

    }

    //文件夹操作
    public static  void directoryOpe() throws Exception {
       
        //遍历文件夹
        File dir2 = new File("d:\\aaa");
        String[] files = dir2.list();
        System.out.println("------------------------------");
        for (String string : files) {
            System.out.println(string);
        }

        System.out.println("-------------FileFilter的使用---------------");
        File[] files2 = dir2.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                //过滤后缀为.jpg的文件
                if (pathname.getName().endsWith("jpg")) {
                    return true;
                }
                return false;
            }
        });
        for (File file : files2) {
            System.out.println(file.getName());
        }
    }
}
 /*输出结果

*/

递归遍历,递归删除

递归遍历文件夹

package com.mike.test;

/*
            案例1:递归遍历文件夹
*/

import java.io.File;
import java.io.FileFilter;
import java.util.Date;

public class Demo01 {
    public static void main(String[] args) throws Exception {
        listDir(new File("d:\\myfiles"));
    }

    public static void listDir(File dir){
        File[] files = dir.listFiles();
        System.out.println(dir.getAbsolutePath());
        if (files!=null&&files.length>0){
            for (File file : files) {
                if (file.isDirectory()){
                    listDir(file);//递归
                }else {
                    System.out.println(file.getAbsolutePath());
                }
            }
        }
    }
}

递归删除文件夹

package com.mike.test;

/*
            案例2:递归删除文件夹
*/

import java.io.File;
import java.io.FileFilter;
import java.util.Date;

public class Demo01 {
    public static void main(String[] args) throws Exception {
        deleteDir(new File("d:\\myfiles"));
    }
    
    public static void deleteDir(File dir){
        File[] files = dir.listFiles();
        if (files!=null&&files.length>0){
            for (File file : files) {
                if (file.isDirectory()){
                    deleteDir(file);//递归
                }
                else {
                    System.out.println(file.getAbsolutePath()+"删除"+file.delete());
                }
            }
        }
        System.out.println(dir.getAbsolutePath()+"删除"+dir.delete());
    }
}

八、补充: Properties

  • Properties:属性集合
  • 特点
    • 1、存储属性名和属性值
    • 2、属性名和属性值都是字符串类型
    • 3、没有泛型
    • 4、和流有关
    • 5、线性安全的集合

Properties的使用

package com.mike.test;

/*
        演示Properties集合的使用
*/

import java.io.*;
import java.util.Date;
import java.util.Properties;
import java.util.Set;

public class Demo01 {
    public static void main(String[] args) throws Exception {
        //1、创建集合
        Properties properties = new Properties();//此集合是一个规范型集合,不用设置泛型
        //2、添加元素
        properties.setProperty("username","zhangsan");
        properties.setProperty("age","20");
        System.out.println(properties.toString());

        //3、遍历
        //3.1、-----keySet----
        //3.2、------entrySet----
        //3.3、-------stringPropertyNames()------
        Set<String> pronames = properties.stringPropertyNames();
        for (String pro : pronames) {
            System.out.println(pro+"====="+properties.getProperty(pro));
        }

        //4、和流有关的方法
        //----------list方法--------(将控制台信息打印到文本)
/*        PrintWriter pw = new PrintWriter("d:\\print.txt");
        properties.list(pw);
        pw.close();*/
        //--------------store方法---------------(保存到文本)
/*        FileOutputStream fos = new FileOutputStream("d:\\store.properties");
        properties.store(fos,"注释");
        fos.close();*/
        //--------------load方法---------------(加载)
        Properties properties2 = new Properties();
        FileInputStream fis = new FileInputStream("d:\\store.properties");
        properties2.load(fis);
        fis.close();
        System.out.println(properties2.toString());
    }
}
 /*load方法输出结果
            {age=20, username=zhangsan}
            age=====20
            username=====zhangsan
            {age=20, username=zhangsan}
*/

list方法运行截图

store方法运行截图

总结

  • 流的概念:

    • 内存与存储设备之间传输数据的通道。
  • 流的分类:

    • 输入流、输出流;字节流、字符流;节点流、过滤流;
  • 序列化、反序列化:

    • 将对象通过流写入到文件,或将对象通过流读取到内存,必须实现Serializable接口。
  • File对象:

    • 代表物理盘符中的一个文件或者文件夹。
posted @ 2022-03-12 21:46  海边蓝贝壳  阅读(24)  评论(0编辑  收藏  举报