三彬

导航

 

IO框架

流的概念

内存与存储设备之间传输数据的通道

流的分类

输入流:存储设备==========>内存

输出流:存储设备<==========内存

字节流:以字节为单位,可以读写所有数据

字符流:以字符为单位,只能读写文本数据

节点流:具有实际传输数据的读写功能

过滤流:在节点流的基础上增强功能

字节流

字节流的父类(抽象类):

FileInputStream:字节输入流

public class Demo01 {
    public static void main(String[] args) throws IOException {
        //创建文件字节输入流,指定文件路径
        FileInputStream fileInputStream = new FileInputStream("E:\\Java学习\\inputexample.txt");
        //单个字节读取文件
        //int data = 0;
        //while ((data = fileInputStream.read()) != -1){
           //System.out.print((char) data);
        //}
        //System.out.println("");
        //System.out.println("执行结束");
        //一次性读取多个字节
        byte[] buf = new byte[2];
        int count = 0;
        while ((count = fileInputStream.read(buf)) != -1){
            System.out.print(new String(buf,0,count));
        }
    }
}

FileOutputStream:字节输出流

public class Demo02 {
    public static void main(String[] args) throws Exception{
        //创建文件字节流输出对象
        FileOutputStream fileOutputStream = new FileOutputStream("E:\\Java学习\\IO框架\\example.txt",true);
        fileOutputStream.write(3);
        fileOutputStream.write('9');
        fileOutputStream.write(38);
        String b = "What are you talking about?";
        fileOutputStream.write(b.getBytes());
        fileOutputStream.close();
        System.out.println("The end.");
    }
}

利用字节输入流和字节输出流复制文件(文件类型不受限)

public class Demo03 {
    public static void main(String[] args) throws Exception{
        //文件字节输入流
        FileInputStream fileInputStream = new FileInputStream("E:\\Java学习\\IO框架\\微信截图_20200706105652.png");
        //文件字节输出流
        FileOutputStream fos = new FileOutputStream("E:\\Java学习\\IO框架\\复制微信截图_20200706105652.png");
        byte[] buf = new byte[1024];
        int count = 0;
        while ((count = fileInputStream.read(buf)) != -1){
            fos.write(buf,0,count);//写入一个字节的内容
        }
        System.out.println("复制结束");
        fileInputStream.close();
        fos.close();
    }
}

BufferInputStream/BufferOutputStream:字节缓冲流

提高I/O效率,减少访问磁盘的次数;数据存储在缓冲区中,flush是将缓存区的内容写入文件,也可以直接close

public class Demo04 {
    public static void main(String[] args) throws Exception{
        FileInputStream fis = new FileInputStream("E:\\Java学习\\inputexample.txt");
        BufferedInputStream bis = new BufferedInputStream(fis);
        //int data = 0;
        //while ((data = bis.read()) != -1){
            //System.out.print((char)data);
        //}
        //bis.close();
        byte[] buf =new byte[1024];
        int count = 0;
        while ((count = bis.read(buf)) != -1){
            System.out.print(new String(buf,0,count));
        }
        bis.close();
    }
}
public class Demo05 {
    public static void main(String[] args) throws Exception{
        FileOutputStream fos = new FileOutputStream("E:\\Java学习\\IO框架\\BufferOutputStream.txt");
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        for (int i = 0; i < 10; i++) {
            bos.write("100100001101010\r\n".getBytes());//写入了8K的缓冲区
            bos.flush();//刷新到硬盘里
        }
        bos.close();
    }
}

对象流

ObjectInputStream/ObjectOutpuStream

​ 增强了缓存区功能

​ 增强了八种基本数据类型和字符串功能

​ 增强了读写对象的功能:

readObject() 从流中读取一个对象 反序列化

writeObject() 向流中写入一个对象 序列化

代码实例

public class Star implements Serializable {

    //serialVersionUID 序列化版本ID 保证序列化的类和反序列化的类是同一个类
    //使用transient来修饰属性,则该属性不能序列化
    private int month;
    private String name;

    public Star() {
    }

    public Star(int month, String name) {
        this.month = month;
        this.name = name;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Star{" +
                "month=" + month +
                ", name='" + name + '\'' +
                '}';
    }
}
public class Demo06 {
    public static void main(String[] args) throws Exception{
        FileOutputStream fos = new FileOutputStream("E:\\Java学习\\IO框架\\Star-oos.bin");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        //序列化
        Star star1 = new Star(12,"Capricorn");
        Star star2 = new Star(1,"Aquarius");
        ArrayList<Star> stars = new ArrayList<>();
        stars.add(star1);
        stars.add(star2);
        oos.writeObject(stars);
        oos.close();
        System.out.println("序列化结束");
    }
}
public class Demo07 {
    public static void main(String[] args) throws Exception{
        FileInputStream fis = new FileInputStream("E:\\Java学习\\IO框架\\Star-oos.bin");
        ObjectInputStream ois = new ObjectInputStream(fis);

        ArrayList<Star> list = (ArrayList<Star>)ois.readObject();
        System.out.println(list.toString());
        ois.close();
    }
}

字符流

字符编码

ISO-8859-1

UTF-8

GB2312(95年之前)

GBK

BIG5

字符流的父类(抽象类)

reader:字符输入流

writer:字符输出流

文件字符流FileReader/FileWriter

public class Demo09 {
    public static void main(String[] args) throws Exception{
        FileReader fileReader = new FileReader("E:\\Java学习\\IO框架\\example.txt");
        //System.out.println("=====单个字符读取");
        //int data = 0;
        //while ((data = fileReader.read()) != -1){
            //System.out.print((char)data);
        //}
        //fileReader.close();
        char[] buf =new char[1024];
        int count = 0;
        while ((count = fileReader.read(buf)) != -1){
            System.out.print(new String(buf,0,count));
        }
        fileReader.close();
    }
}
public class Demo10 {
    public static void main(String[] args) throws Exception{
        FileWriter fileWriter = new FileWriter("E:\\Java学习\\IO框架\\输入字符流.txt");
        for (int i = 0; i < 100; i++) {
            fileWriter.write("在这复杂的世界里\r\n");
        }
        fileWriter.close();
    }
}

复制文件的案例:使用字符流只能复制文本文件,不能复制其他类型的文件(二进制文件、图片音频等)

public class Demo11 {
    public static void main(String[] args) throws Exception{
        FileWriter fileWriter = new FileWriter("E:\\Java学习\\IO框架\\字符流复制案例.txt");
        FileReader fileReader = new FileReader("E:\\Java学习\\IO框架\\example.txt");
        int data = 0;
        while ((data = fileReader.read()) != -1){
            fileWriter.write(data);
        }
        fileReader.close();
        fileWriter.close();
    }
}

字符缓冲流

高效读写;支持换行符;可以写一行、读一行

public class Demo12 {
    public static void main(String[] args) throws Exception{
        FileReader fileReader = new FileReader("E:\\Java学习\\IO框架\\example.txt");
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        //自创缓冲区 一个字符一个字符读取
        //char[] buf =new char[1024];
        //int count = 0;
        //while ((count = bufferedReader.read(buf)) != -1){
            //System.out.print(new String(buf,0,count));
        //}
        //bufferedReader.close();
        String line = null;
        while ((line = bufferedReader.readLine()) != null){
            System.out.println(line);
        }
        bufferedReader.close();
    }
}
public class Demo13 {
    public static void main(String[] args) throws Exception{
        FileWriter fileWriter = new FileWriter("E:\\Java学习\\IO框架\\字符缓冲输入流.txt");
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
        for (int i = 0; i < 10; i++) {
            bufferedWriter.write("少吃一点!\r\n");
            bufferedWriter.newLine();//写入一个换行符
            bufferedWriter.flush();
        }
        bufferedWriter.close();
        System.out.println("the mission is over");
    }
}

打印流PrintWriter

public class Demo14 {
    public static void main(String[] args) throws Exception{
        PrintWriter printWriter = new PrintWriter("E:\\Java学习\\IO框架\\打印流.txt");
        printWriter.println(100);
        printWriter.println("love");
        printWriter.println(100.987);
        printWriter.println('b');
        printWriter.close();
    }
}

转换流InputStreamReader/OutputStreamWriter

可以将字节流转换为字符流inputstreamreader/OutputStreamWriter

public class Demo15 {
    public static void main(String[] args) throws Exception{
        FileInputStream fis = new FileInputStream("E:\\Java学习\\IO框架\\example.txt");
        InputStreamReader isr = new InputStreamReader(fis,"utf-8");
        int data = 0;
        while ((data = isr.read()) != -1){
            System.out.print((char)data);
        }
        isr.close();
    }
}
public class Demo16 {
    public static void main(String[] args) throws Exception{
        FileOutputStream fileOutputStream = new FileOutputStream("E:\\Java学习\\IO框架\\转换流.txt");
        OutputStreamWriter gbk = new OutputStreamWriter(fileOutputStream, "gbk");
        for (int i = 0; i < 10; i++) {
            gbk.write("我好累啊\r\n");
            gbk.flush();
        }
        gbk.close();
        System.out.println("执行结束");
    }
}

File类

代表物理盘符中的一个文件或者一个文件夹

public class Demo01 {
    public static void main(String[] args) throws Exception{
        //separator();
        //fileOpe();
        directorOpe();
    }
    public static void separator(){
        System.out.println("路径分隔符"+ File.pathSeparator);
        System.out.println("名称分隔符"+ File.separator);
    }
    public static void fileOpe() throws Exception{
        //创建文件 createnewFile
        File file = new File("E:\\Java学习\\IO框架\\file.txt");//不写路径只写文件名,则会直接在项目里创建文件
        System.out.println(file.toString());
        if (!file.exists()){
            boolean b = file.createNewFile();
            System.out.println("创建结果"+b);
        }
        //删除文件
        //1. 直接删除delete
        //System.out.println("删除结果"+file.delete());
        //2. 使用jvm退出时删除
        //file.deleteOnExit();
        //Thread.sleep(5000);

        //获取文件信息
        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());

        //判断
        System.out.println("是否可写"+file.canWrite());
        System.out.println("是否是文件"+file.isFile());
        System.out.println("是否隐藏"+file.isHidden());
    }
    public static void directorOpe() throws  Exception{
        //创建文件夹
        File dir = new File("E:\\Java学习\\IO框架\\file1\\file2\\file3");
        System.out.println(dir.toString());
        if (!dir.exists()){
            //dir.mkdir();//只能创建单级目录 mkdirs可以创建多级目录
            System.out.println("创建结果"+dir.mkdirs());
        }

        //获取文件夹信息
        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());
        //判断
        System.out.println("是否是文件夹"+dir.isFile());
        System.out.println("是否隐藏"+dir.isHidden());
        //遍历文件夹
        File file2 = new File("C:\\Users\\Think\\Desktop\\我爱北极熊");
        String[] files = file2.list();
        System.out.println("---------------");
        for (String s : files) {
            System.out.println(s);
        }


        System.out.println("=================FileFilter接口的使用================");
        File[] files2 = file2.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                if (pathname.getName().endsWith(".jpg")){
                    return true;
                }
                return false;
            }
        });
        for (File file : files2) {
            System.out.println(file.getName());
        }
        //删除文件夹
        //直接删除
        //System.out.println("删除结果"+dir.delete());//只删除最底层的目录,且必须为空目录
        //JVM删除
        //dir.deleteOnExit();
        //Thread.sleep(5000);
    }
}

递归遍历/删除文件夹练习

public class ListDemo {
    public static void main(String[] args) {
        //listdir(new File("E:\\Java学习\\IO框架\\myfiles"));
        deleteDir(new File("E:\\Java学习\\IO框架\\myfiles2"));
    }
    //递归遍历文件夹
    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());
                }
            }
        }

    }
    //递归删除文件夹
    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());
    }
}

FileFilter接口

properties

属性集合

特点:

  1. 存储属性名和属性值
  2. 属性名和属性值都是字符串类型
  3. 没有泛型
  4. 和流有关
public class Demo02 {
    public static void main(String[] args) throws IOException {
        Properties properties = new Properties();
        properties.setProperty("username","Faye");
        properties.setProperty("userage","20");
        System.out.println(properties.toString());
        //遍历
        //keyset entryset都可以
        //stringpropertynames()
        Set<String> propertyNames = properties.stringPropertyNames();
        for (String propertyName : propertyNames) {
            System.out.println(propertyName+"===="+properties.getProperty(propertyName));
        }
        //和流有关的方法
        //list方法
        PrintWriter printWriter = new PrintWriter("E:\\Java学习\\IO框架\\打印流properties.txt");
        properties.list(printWriter);
        printWriter.close();
        //store保存
        FileOutputStream fos = new FileOutputStream("E:\\Java学习\\IO框架\\store.properties");
        properties.store(fos,"注释");
        fos.close();
        //load加载
        Properties properties2 = new Properties();
        FileInputStream fis = new FileInputStream("E:\\Java学习\\IO框架\\store.properties");
        properties2.load(fis);
        System.out.println(properties2.toString());
    }
}

posted on 2020-07-28 09:36  三彬  阅读(187)  评论(0)    收藏  举报