JavaStudy8(IO流)—B站韩顺平

JavaStudy8(IO流)—B站韩顺平

1.IO流

1.1 文件

1.1.1 什么是文件

在这里插入图片描述

1.1.2 文件流

在这里插入图片描述

1.2 常用的文件操作

1.2.1 创建文件对象相关构造器和方法

在这里插入图片描述
在这里插入图片描述

代码演示:

/**
 * @ClassName FileCreate
 * @Author :BLWY-1124
 * @Date :2022/4/7 21:27
 * @Description: 演示创建文件
 * @Version: 1.0
 */
public class FileCreate {
    public static void main(String[] args) {
        FileCreate fileCreate = new FileCreate();
        fileCreate.create01();
    }
    //方式 1 new File(String pathname)
    @Test
    public void create01(){
        String filePath = "e:\\news1.txt";
        File file = new File(filePath);
        try {
            file.createNewFile();
            System.out.println("文件创建成功");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    //方式 2 new File(File parent,String child) //根据父目录文件+子路径构建
    // e:\\news2.txt
    @Test
    public void create02(){
        File parentPath = new File("e:\\");
        String fileName = "new2.txt";
        //这里的 file 对象,在 java 程序中,只是一个对象
        //只有执行了 createNewFile 方法,才会真正的,在磁盘创建该文件
        File file = new File(parentPath,fileName);
        try {
            file.createNewFile();
            System.out.println("创建文件成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //方式 3 new File(String parent,String child) //根据父目录+子路径构建
    @Test
    public void create03(){
        String parentPath = "e:\\";
        String fileName = "news3.txt";
        File file = new File(parentPath,fileName);
        try {
            file.createNewFile();
            System.out.println("文件创建成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


}
1.2.2 获取文件的相关信息

在这里插入图片描述

1.2.3 应用案例演示 FileInformation.java
/**
 * @ClassName FileFormation
 * @Author :BLWY-1124
 * @Date :2022/4/7 21:53
 * @Description:  获取文件的相关信息
 * @Version: 1.0
 */
public class FileFormation {
    public static void main(String[] args) {

    }
    //获取文件得信息
    @Test
    public void info(){
        //先创建文件对象
        File file = new File("e:\\news1.txt");
        //调用相应的方法,得到对应信息
        System.out.println("文件名:" + file.getName()); //news1.txt
        //getName、getAbsolutePath、getParent、length、exists、isFile、isDirectory
        //getAbsolutePath
        System.out.println("文件绝对路径=" +file.getAbsolutePath()); //e:\news1.txt
        //getParent
        System.out.println("文件的父级目录=" + file.getParent()); //e:\
        //length
        System.out.println("文件大小(字节)=" + file.length()); //0
        // exists
        System.out.println("文件是否存在=" + file.exists());//T
        //isFile
        System.out.println("是不是一个文件=" + file.isFile());//T
        //isDirectory
        System.out.println("是不是一个目录=" + file.isDirectory());//F
    }
}
1.2.4 目录的操作和文件删除

在这里插入图片描述

1.2.5 应用案例演示

在这里插入图片描述

代码演示:

/**
 * @ClassName Directory
 * @Author :BLWY-1124
 * @Date :2022/4/7 22:06
 * @Description:
 * @Version: 1.0
 */
public class Directory {
    public static void main(String[] args) {

    }
    @Test
    //判断 d:\\news1.txt是否存在,如果存在就删除
    public void m1(){
        String filePath = "e:\\news1.txt";
        File file = new File(filePath);
        if (file.exists()){
            if (file.delete()) {
                System.out.println("删除成功");
            }else {
                System.out.println("删除失败");
            }
        }else {
            System.out.println("文件不存在");
        }
    }
    @Test
    //判断D:\\demo2 中是否存在,存在就删除,否则提示不存在
    //这里我们需要体会到,在java编程中,目录也被当做文件
    public void m2(){
        String filePath = "d:\\demo02";
        File file = new File(filePath);
        if (file.exists()){
            if (file.delete()) {
                System.out.println("删除成功");
            }else {
                System.out.println("删除失败");
            }
        }else {
            System.out.println("目录  不存在");
        }
    }
    //判断D:\\demo\\a\\b\\c目录是否存在,如果存在就提示已经存在,否则就创建
    @Test
    public void m3(){

        String directoryPath = "d:\\demo\\a\\b\\c";
        File file = new File(directoryPath);
        if (file.exists()){
            System.out.println("目录存在");
        }else {
            if (file.mkdirs()) {
                System.out.println(directoryPath +"创建成功");
            }else {
                System.out.println("创建失败");
            }
        }
    }
}

1.3 IO 流原理及流的分类

1.3.1 Java IO 流原理

在这里插入图片描述

1.3.2 流的分类

InputStream OutputStream Reader Writer 这四个都是抽象类

在这里插入图片描述

1.4 IO 流体系图-常用的类

  1. IO 流体系图
    在这里插入图片描述

  2. 文件 VS 流

在这里插入图片描述

1.4.1 FileInputStream 介绍

在这里插入图片描述

1.4.2 FileInputStream 应用实例 FileInputStream_.java

在这里插入图片描述

代码演示:

/**
 * @ClassName FileInputStream_
 * @Author :BLWY-1124
 * @Date :2022/4/8 10:34
 * @Description: 演示 FileInputStream 的使用(字节输入流 文件--> 程序)
 * @Version: 1.0
 */
public class FileInputStream_ {
    public static void main(String[] args) {

    }
    /*** 演示读取文件...
     * 单个字节的读取,效率比较低
     * -> 使用 read(byte[] b)
     */
    @Test
    public void readFile01(){
        String filePath = "e:\\hello.txt";
        int readData = 0;
        FileInputStream fileInputStream = null; //扩大作用域
        try {
            //创建 FileInputStream 对象,用于读取 文件
            fileInputStream = new FileInputStream(filePath);
            //从该输入流读取一个字节的数据。 如果没有输入可用,此方法将阻止。
            // 如果返回-1 , 表示读取完毕
           while ((readData = fileInputStream.read()) != -1){
               System.out.print((char)readData); //转成char显示
           }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭文件流释放资源
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

    /**
     * 使用read(byte[] b) 读取文件,提高效率
     */

    @Test
    public void readFile02(){
        String filePath = "e:\\hello.txt";
        int readLen = 0;
        //字节数组
        byte[] buf = new byte[8]; //一次读取8个字节
        FileInputStream fileInputStream = null;  //扩大作用域
        try {
            //创建 FileInputStream 对象,用于读取 文件
            fileInputStream = new FileInputStream(filePath);
            //从该输入流读取最多 b.length 字节的数据到字节数组。 此方法将阻塞,直到某些输入可用。
            // 如果返回-1 , 表示读取完毕
            //如果读取正常, 返回实际读取的字节数
            while ((readLen = fileInputStream.read(buf)) != -1){
                System.out.print(new String(buf,0,readLen)); //转成char显示
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭文件流释放资源
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
1.4.3 FileOutputStream 介绍

在这里插入图片描述

1.4.4 FileOutputStream 应用实例 1 FileOutputStream01.java

代码演示:

public class FileOutputStream_ {
    public static void main(String[] args) {

    }
    /**
     * 演示使用 FileOutputStream将数据写入文件中
     * 如果该文件不存在,则创建该文件。
     */
    @Test
    public void writeFile(){
        FileOutputStream fileOutputStream = null;
        String filePath = "e:\\new1.txt";
        try {
            //得到一个对象
            //说明
            //1.new FileOutputStream(filePath) 创建方式,当写入内容是,会覆盖原来的内容
            //2.new FileOutputStream(filePath, true) 创建方式,当写入内容是,是追加到文件后面
                fileOutputStream = new FileOutputStream(filePath,true   );
                //写入一个字节
                //fileOutputStream.write('a');
            //写入字符串
            String str = "hello,world!";
            //str.getBytes() 可以把 字符串-> 字节数组
            //1.fileOutputStream.write(str.getBytes(StandardCharsets.UTF_8));
            //2.write(byte[] b, int off, int len) 将 len 字节从位于偏移量 off 的指定字节数组写入此文件输出流
            fileOutputStream.write(str.getBytes(),0,str.length());
            System.out.println("写入成功");
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
1.4.5 FileOutputStream 应用实例 2 FileCopy.java

在这里插入图片描述

代码演示:

public class FileCopy {
    public static void main(String[] args) {
        //完成 文件拷贝,将 e:\\Koala.jpg 拷贝 c:\\
        //思路分析
        //1. 创建文件的输入流 , 将文件读入到程序
        //2. 创建文件的输出流, 将读取到的文件数据,写入到指定的文件.
        String srcFilePath = "d:\\word.png";
        String destFilePath = "e:\\word.png";
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;

        try {
            fileInputStream = new FileInputStream(srcFilePath);
            fileOutputStream = new FileOutputStream(destFilePath);
            //定义一个字节数组,提高读取效果
            byte[] buf = new byte[1024];
            int readLen = 0;
            while((readLen = fileInputStream.read(buf)) != -1){
                //读取到后,就写入到文件 通过 fileOutputStream
                // 即,是一边读,一边写
                fileOutputStream.write(buf,0,readLen); //一定要使用这个方法
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                //关闭输入流和输出流,释放资源
                if (fileInputStream != null){
                    fileInputStream.close();
                }
                if (fileOutputStream != null){
                    fileOutputStream.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

}
1.4.6 FileReader 和 FileWriter 介绍

在这里插入图片描述

1.4.7 FileReader 相关方法:

在这里插入图片描述

1.4.8 FileWriter 常用方法

在这里插入图片描述

1.4.9 FileReader 和 FileWriter 应用案例 FileReader_.java

代码演示:

public class FileReader_ {
    public static void main(String[] args) {

    }
    /**
     ** 单个字符读取文件
     **/
    @Test
    public void readFile01(){
        String filePath = "e:\\story.txt";
        FileReader fileReader = null;
        int data = 0;
        //1. 创建 FileReader 对象
        try {
            fileReader = new FileReader(filePath);
            //循环读取 使用 read, 单个字符读取
            while ((data = fileReader.read()) != -1){
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
           if (fileReader != null){
               try {
                   fileReader.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
        }
    }

    /**
     * 字符数组读取文件
     */
    @Test
    public void readFile02(){
        String filePath = "e:\\story.txt";
        FileReader fileReader = null;
        int readLen = 0;
        char[] buf = new char[8];
        //1. 创建 FileReader 对象
        try {
            fileReader = new FileReader(filePath);
            //循环读取 使用 read(buf), 返回的是实际读取到的字符数
            // 如果返回-1, 说明到文件结束
            while ((readLen = fileReader.read(buf)) != -1){
                System.out.print(new String(buf ,0 ,readLen));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileReader != null){
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
1.4.10使用 FileWriter 将 “风雨之后,定见彩虹” 写入到 note.txt 文件中,

代码演示:

public class FileWriter_ {
    public static void main(String[] args) {

    }
    @Test
    public void fileWriter() {
        String filePath = "e:\\note.txt";
        //创建 FileWriter 对象
        FileWriter fileWriter = null;
        char[] chars = {'a', 'b', 'c'};
        try {
            fileWriter = new FileWriter(filePath);//默认是覆盖写入
            //3) write(int):写入单个字符
            fileWriter.write('H');
            //4) write(char[]):写入指定数组
            fileWriter.write(chars);
            //5) write(char[],off,len):写入指定数组的指定部分
            fileWriter.write("韩曙平教育".toCharArray(), 0, 3);
            //6) write(string):写入整个字符串
            fileWriter.write("北京你好");
            fileWriter.write("风雨之后,定见彩虹");
            // 7) write(string,off,len):写入字符串的指定部分
            fileWriter.write("上海田径", 0, 2000);
                    //在数据量大的情况下,可以使用循环操作.
        } catch (IOException e) {
            e.printStackTrace();

        } finally {
            //对应 FileWriter , 一定要关闭流,或者 flush 才能真正的把数据写入到文件
            // 老韩看源码就知道原因. /* 看看代码
            try {
                fileWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            /* 看看代码 private void writeBytes() throws IOException {
            this.bb.flip();
            int var1 = this.bb.limit();
            int var2 = this.bb.position();
            assert var2 <= var1;
            int var3 = var2 <= var1 ? var1 - var2 : 0;
            if (var3 > 0) {
            if (this.ch != null) {
            assert this.ch.write(this.bb) == var3 : var3;
            } else {
            this.out.write(this.bb.array(), this.bb.arrayOffset() + var2, var3);
            }
             }this.bb.clear();
             */
        }

        }
    }

1.5 节点流和处理流

1.5.1 基本介绍

在这里插入图片描述

1.5.2 节点流和处理流一览图

在这里插入图片描述

1.5.3 节点流和处理流的区别和联系

在这里插入图片描述

1.5.4 处理流的功能主要体现在以下两个方面

在这里插入图片描述

1.5.5 处理流-BufferedReader 和 BufferedWriter

在这里插入图片描述

代码演示:

public class BufferedReader_ {
    public static void main(String[] args) {
        String filePath = "d:\\hello.txt";
        BufferedReader bufferedReader = null;
        String fileLien = "";
        try {
            bufferedReader = new BufferedReader(new FileReader(filePath));
            //String line; //按行读取, 效率高
          while ((fileLien = bufferedReader.readLine()) != null){
              System.out.println(fileLien);
          }
            System.out.println("读取成功");
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                //关闭流, 这里注意,只需要关闭 BufferedReader ,因为底层会自动的去关闭 节点流
                // FileReader
               /* public void close() throws IOException {
                    synchronized (lock) {
                        if (in == null)
                            return;
                        try {
                            in.close();
                        } finally {
                            in = null;
                            cb = null;
                        }
                    }
                }*/
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

在这里插入图片描述

代码演示:

public class BufferedWriter_ {
    public static void main(String[] args) throws IOException {
        String filePath = "e:\\ok.txt";
        //说明: //1. new FileWriter(filePath, true) 表示以追加的方式写入
        // 2. new FileWriter(filePath) , 表示以覆盖的方式写入
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath,true));
        bufferedWriter.write("hello韩顺平");

        bufferedWriter.newLine();//插入一个和系统相关的换行
        bufferedWriter.write("hello2, 韩顺平教育!");
        bufferedWriter.newLine(); //插入一个和系统相关的换行符
        bufferedWriter.write("hello3, 韩顺平教育!");
        bufferedWriter.newLine();

        //说明:关闭外层流即可 , 传入的 new FileWriter(filePath) ,会在底层关闭
        bufferedWriter.close();
    }
}

在这里插入图片描述

代码演示:

public class BufferedCopy_ {
    //说明
    //1.BufferedReader 和 bufferedWriter 是按照字符操作
    //2.不要去操作二进制文件[声音,视频,doc,pdf],可能照成文件损坏
    public static void main(String[] args) {
        String srcFilePath = "e:\\a.java";
        String destFilePath = "e:\\a2.java";
        BufferedReader bufferedReader = null;
        BufferedWriter bufferedWriter = null;
        String line = "";
        try {
            bufferedReader = new BufferedReader(new FileReader(srcFilePath));
            bufferedWriter = new BufferedWriter(new FileWriter(destFilePath));

            while ((line = bufferedReader.readLine()) != null) {
                //每读取一行,就写入
                bufferedWriter.write(line);
                //插入一个换行符
                bufferedWriter.newLine();
            }
            System.out.println("拷贝完毕");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
                if (bufferedWriter != null) {
                    bufferedWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
1.5.6 处理流-BufferedInputStream 和 BufferedOutputStream

在这里插入图片描述

1.5.7 介绍 BufferedOutputStream

在这里插入图片描述

在这里插入图片描述

代码演示:

/**
 * 演示使用 BufferedInputStream 和 BufferedOutputStream 拷贝二进制文件
 * 思考:字节流可以操作二进制文件,那么可以操作文本文件吗?当然可以 二进制时基本的
 */
public class BufferedCopy02 {
    public static void main(String[] args) {
      /*  String srcPath = "e:\\kaola.png";
        String destPath = "e:\\kaola2.png";*/

        String srcPath = "e:\\a.java";
        String destPath = "e:\\copy.java";

        BufferedInputStream bufferedInputStream = null;
        BufferedOutputStream bufferedOutputStream = null;
        int readLen = 0;
        try {
            //因为 FileInputStream 是这个InputStream的子类
            bufferedInputStream = new BufferedInputStream(new FileInputStream(srcPath));
            bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(destPath));
            //循环读取文件,并写入到 destPath
            byte[] buff = new byte[1024];
            //当返回-1时,就表示文件读取完毕
            while ((readLen = bufferedInputStream.read(buff)) != -1) {
                bufferedOutputStream.write(buff, 0, readLen);
            }
            System.out.println("拷贝成功");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            try {
                if (bufferedInputStream != null) {
                    bufferedInputStream.close();
                }
                if (bufferedOutputStream != null) {
                    bufferedOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

1.5.8 对象流-ObjectInputStream 和 ObjectOutputStream

在这里插入图片描述
在这里插入图片描述

1.5.9 对象流介绍

功能:提供了对基本类型或对象类型的序列化和反序列化的方法

  • ObjectOutputStream 提供 序列化功能
  • ObjectInputStream 提供 反序列化功能

在这里插入图片描述

在这里插入图片描述

/**
 * 演示 ObjectOutputStream 的使用, 完成数据的序列化
 */
public class ObjectOutputStream_ {
    public static void main(String[] args) throws Exception {
        //序列化后,保存的文件格式,不是存文本,而是按照他的格式来保存
        String filePath = "e:\\data.dat";
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));

        //序列化数据到 e:\data.dat
        oos.writeInt(100); // 自动装箱 int->Integer  (实现了 Serializable)
        oos.writeBoolean(true); //自动装箱 boolean ->Boolean (实现了 Serializable)
        oos.writeChar('a'); //自动装箱 char ->Character (实现了 Serializable)
        oos.writeDouble(100.00); //自动装箱 double ->Double (实现了 Serializable)
        oos.writeUTF("你好世界");

        //保存一个dog对象
        oos.writeObject(new Dog("小黄", 15));
        oos.close();
        System.out.println("数据保存完毕(序列化)");

    }
}
//如果需要序列化,必须实现Serializable
public class Dog implements Serializable {
    private String name;
    private int age;
    
	//序列化对象时,默认将里面的所有属性序列化,但除了static 或transient 修饰的成员
    private static String nation;
    private transient String color;
    // 序列化对象时,要求里面属性的类型也需要实现序列化接口
    private Master master = new Master();

    // serialVersionUID 序列化的版本号,可以提高兼容性
    private static final long serialVersionUID = 1L;
    public Dog(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 "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

在这里插入图片描述

代码演示:

public class ObjectInputStream_ {
    public static void main(String[] args) throws Exception{
        String filePath = "e:\\data.dat";
        // 1.创建流对象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
        // 2. 注意,读取顺序
        // 读取(反序列化)的顺序要和你保存数据(序列化)的顺序一致。
        System.out.println(ois.readInt());
        System.out.println(ois.readBoolean());
        System.out.println(ois.readChar());
        System.out.println(ois.readDouble());
        System.out.println(ois.readUTF());
        //Dog 的编译类型为Object,dog的运行类型为 Dog
        Object dog = ois.readObject();
        System.out.println("运行类型:" + dog.getClass());
        System.out.println("dog的信息" + dog); //底层(匹配) Object -> Dog
        //注意:
        //1. 如果我们希望调用Dog的方法,需要向下传转型
        //2. 需要我们将Dog类的定义,拷贝到可以引用的位置
        Dog dog1 = (Dog)dog;
        System.out.println(dog1.getName()); //
        // 关闭流,关闭外层流即可,底层会关闭 FileInputStream 流
        ois.close();
        System.out.println("以反序列化的方式读取(恢复)ok~");
    }
}

注意事项和细节说明:
在这里插入图片描述

1.5.10 标准输入输出流

在这里插入图片描述

代码演示:

public class InoutAndOutput {
    public static void main(String[] args) {
        // System 类的 public final static InputStream in = null;
        // System.in 编译类型 InputStream
        // System.in 运行类型 BufferedInputStream
        // 标识标准输入
        System.out.println(System.in.getClass());

        //1.System 类的 public final static PrintStream out = null;
        //2.编译类型 PrintStream
        //3.运行类型 PrintStream
        //4.标识标准输出  显示器
        System.out.println(System.out.getClass());
    }
}
1.5.11 转换流-InputStreamReader 和 OutputStreamWriter

先看一个文件乱码问题,引出学习转换流必要性.

在这里插入图片描述

代码演示:

/**
 * 看一个中文乱码问题
 */
public class CodeQuestion {
    public static void main(String[] args) throws IOException {
        //读取e:\a.txt
        //思路
        //1. 创建字符输入流 BufferedReader [处理流]
        //2. 使用BufferedReader 对象读取a.txt
        //3. 默认情况下,读取文件是按照 utf-8 编码
        String filePath = "e:\\a.txt";
        BufferedReader br = new BufferedReader(new FileReader(filePath));
        String s = br.readLine();
        System.out.println(s);
        br.close();
    }
}

在这里插入图片描述

在这里插入图片描述

代码演示:

/**
 * 演示使用 InputStreamReader 转换流解决中文乱码问题
 * 将字节流 FileInputStream 转成字符流 InputStreamReader, 指定编码 gbk/utf-8
 */
public class InputStreamReader_ {
    public static void main(String[] args) throws Exception {
        String filePath = "e:\\a.txt";

        //1. 把 FileInputStream 转成 InputStreamReader
        //2. 指定编码 gbk
        //InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath),"gbk");
        //3. 把 InputStreamReader 传入 BufferedReader
        //BufferedReader br = new BufferedReader(isr);
        // 将2和3结合在一起
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"gbk"));
        //4. 读取
        String s = br.readLine();
        System.out.println(s);
        //5. 关闭外层流
        br.close();
    }
}

在这里插入图片描述

代码演示:

/**
 * 演示使用 OutputStreamReader 转换流解决中文乱码问题
 * 将字节流 FileOutputStream 转成字符流 OutputStreamWrite,
 * 指定编码 gbk/utf-8
 */
public class OutputStreamWrite_ {
    public static void main(String[] args) throws IOException {
        String filePath = "e:\\hsp.txt";
        String charSet = "utf-8";
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filePath), charSet);
        osw.write("hi,韩顺平教育");
        osw.close();
        System.out.println("按照" + charSet + "保存文件成功");
    }
}

1.6 打印流-PrintStream 和 PrintWriter

打印流只有输出流,没有输入流
在这里插入图片描述

代码演示:

/**
 * @ClassName PrintStream_
 * @Author :BLWY-1124
 * @Date :2022/4/21 22:46
 * @Description: 演示 PrintStream (字节打印流/输出流)
 * @Version: 1.0
 */
public class PrintStream_ {
    public static void main(String[] args) throws IOException {
        PrintStream out = System.out;
        //在默认情况下,PrintStream 输出数据的位置是 标准输出,即显示器
      /*  public void print(String s) {
            if (s == null) {
                s = "null";
            }
            write(s);
        }*/

        out.print("john,hello");
        //因为print底层使用的是write,所以我们可以直接调用write进行打印/输出
        out.write("hello,jack".getBytes());
        out.close();

        // 我们可以去修改打印流输出的位置/设备
        // 1. 将输出位置修改到 e:\f1.txt
        // 2. 你好啊世界 就会输出到e:\f1.txt
        /*public static void setOut(PrintStream out) {
            checkIO();
            setOut0(out); //native方法,修改了 out
        }*/

        System.setOut(new PrintStream("e:\\f1.txt"));
        System.out.println("你好啊世界");
    }
}
**
 * @ClassName PrintWrite
 * @Author :BLWY-1124
 * @Date2022/4/21 23:02
 * @Description: 演示 PrintWriter 使用方式
 * @Version: 1.0
 */
public class PrintWrite {
    public static void main(String[] args) throws FileNotFoundException {
        //PrintWriter printWriter = new PrintWriter(System.out);
        PrintWriter printWriter = new PrintWriter("e:\\f1.txt");
        printWriter.print("hi,北京你好");
        printWriter.close(); //flush + 关闭流 ,才会将数据写入到文件
    }
}

1.7 Properties 类

1.7.1 看一个需求

在这里插入图片描述
在这里插入图片描述

代码演示:

public class Properties01 {
    public static void main(String[] args) throws IOException {
        //读取 mysql.properties 文件,并得到 ip, user 和 pwd
        BufferedReader bufferedReader = new BufferedReader(new FileReader("src\\mysql.properties"));
        String line = "";
        while ((line = bufferedReader.readLine()) != null){ //循环读取
            String[] split = line.split("=");
            //如果我们要求指定ip值
            if ("ip".equals(split[0])){
                System.out.println(split[0] + "值是" + split[1]);
            }
        }
    }
}
1.7.2 基本介绍

在这里插入图片描述

在这里插入图片描述

1.7.3 应用案例

在这里插入图片描述

代码演示:

public class Properties02 {
    public static void main(String[] args) throws IOException {
        //使用 Properties 类来读取 mysql.properties 文件

        // 1. 创建 Properties 对象
        Properties properties = new Properties();
        // 2. 加载指定配置文件
        properties.load(new FileReader("src\\mysql.properties"));
        //3. 把 k-v 显示控制台
        properties.list(System.out);

        //4. 根据 key 获取对应的值
        String user = properties.getProperty("user");
        String pwd = properties.getProperty("pwd");
        System.out.println("用户名:" + user);
        System.out.println("密码:" + pwd);
    }
}

代码演示2

public class Properties03 {
    public static void main(String[] args) throws IOException {
        //使用 Properties 类来创建 配置文件, 修改配置文件内容
        Properties properties = new Properties();
        //创建
        //1.如果该文件没有 key 就是创建
        // 2.如果该文件有 key ,就是修改
        /* Properties 父类是 Hashtable , 底层就是 Hashtable 核心方法 public synchronized V put(K key, V value) {
        // Make sure the value is not null if (value == null) {
        throw new NullPointerException(); }
        // Makes sure the key is not already in the hashtable. Entry<?,?>
        tab[] = table;
        int hash = key.hashCode();
        int index = (hash & 0x7FFFFFFF) % tab.length;
        @SuppressWarnings("unchecked") Entry<K,V> entry = (Entry<K,V>)tab[index];
        for(; entry != null ; entry = entry.next) {
        if ((entry.hash == hash) && entry.key.equals(key)) {
        V old = entry.value; entry.value = value;//如果 key 存在,就替换 return old; }
         */
        properties.setProperty("charset", "utf8");
        properties.setProperty("user", "汤姆");//注意保存时,是中文的 unicode 码值
        properties.setProperty("pwd","88888");

        //将key- 存储到文件里面
        properties.store(new FileOutputStream("src\\mysql2.properties"),"这里是注释"); //
        System.out.println("保存成功");


        }
}

1.8 本章作业

在这里插入图片描述

代码演示:

package com.qinbo.homework;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

/**
 * @ClassName Homework01
 * @Author :BLWY-1124
 * @Date :2022/4/22 10:40
 * @Description: (1)在判断 e 盘下是否有文件夹 mytemp, 如果没有就创建 mytemp
 * (2)在 e:\\mytemp目录下,创建文件 hello.txt
 * (3)如果 hello.txt 已经存在,提示该文件已经存在,就不要再重复创建了
 * (4)并且在 hello.txt 文件中,写入 hello,world~
 * @Version: 1.0
 */
public class Homework01 {
    public static void main(String[] args) throws IOException {
        String directoryPath = "e:\\mytemp";

        File file = new File(directoryPath) ;
        if (file.exists()){
            System.out.println("mytemp 存在");
        }else {
            if (file.mkdirs()){
                System.out.println(directoryPath + "创建成功");
            }
        }
        // (2)在 e:\\mytemp目录下,创建文件 hello.txt
        //(3)如果 hello.txt 已经存在,提示该文件已经存在,就不要再重复创建了
        String filePath = directoryPath+ "\\hello.txt"; //e:\mytemp\hello.txt
        File file1 = new File(filePath);
        try {
            if (!file1.exists()){
                if (file1.createNewFile()) {
                    System.out.println(filePath+"文件创建成功");
                }else {
                    System.out.println("文件创建失败");
                }
            }else {
                //已经存在,提示该文件已经存在,就不要再重复创建了
                System.out.println("文件已经存在");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // (4)并且在 hello.txt 文件中,写入 hello,world~
        BufferedWriter br = new BufferedWriter(new FileWriter(file1));
        br.write("hello,world!");
        System.out.println("写入成功");
        br.close();
    }
}

在这里插入图片描述

/**
 * @ClassName Homework02
 * @Author :BLWY-1124
 * @Date :2022/4/22 11:29
 * @Description: 要求:使用BufferedReader读取一个文本文件,为每行加上行号,
 *                  再连同内容一并输出到屏幕上。
 * 如果老韩把文件的编码改成了gbk,出现中文乱码,大家思考如何解决
 * 1.默认是按照utf-8处理,开始没有乱码
 * 2.提示:使用我们的转换流,将FileInputStream->InputStreamReader【可以指定编码】
 * ->BufferedReader....
 * @Version: 1.0
 */
public class Homework02 {
    public static void main(String[] args) throws IOException {
         /*String filePath = "e:\\story.txt";
        BufferedReader br = new BufferedReader(new FileReader(filePath));
        String readLen = "";
        int i = 0; //行号
        while ((readLen = br.readLine()) != null){ //循环读取
            System.out.println(i++ + ":" + readLen);
        }
        System.out.println("读取完毕");*/

        String filePath = "e:\\story.txt";
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "gbk"));
        String readLen = "";
        int i = 0; //行号
        while ((readLen = br.readLine()) != null){ //循环读取
            System.out.println(i++ + ":" + readLen);
        }
        System.out.println("读取完毕");
    }
}

在这里插入图片描述

代码演示:

package com.qinbo.homework;

import org.junit.jupiter.api.Test;

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

/**
 * @ClassName Hemowork03
 * @Author :BLWY-1124
 * @Date :2022/4/22 11:59
 * @Description: (1)要编写-个dog-properties
 * name=tom
 * age=5
 * color=red
 * (2)编写Dog类(name,age,color)创建一个dog对象,读取dog-properties用相应的内容完
 * 成属性初始化,并输出
 * (3)将创建的Dog对象,序列化到文件dog.dat文件
 * @Version: 1.0
 */
public class Homework03 {
    public static void main(String[] args) throws IOException {
        // 1. 创建 Properties 对象
        Properties properties = new Properties();
        // 2. 加载指定配置文件
        properties.load(new FileReader("src\\dog.properties"));
        //3. 把 k-v 显示控制台
        //System.out.println(System.out);
        //4. 根据 key 获取对应的值
        String name = properties.getProperty("name");
        int age = Integer.parseInt(properties.getProperty("age")); //string -》int
        String color = properties.getProperty("color");
        //System.out.println(name+age+color);

        Dog dog = new Dog(name, age, color);
        System.out.println("======狗对象得信息=====");
        System.out.println(dog);

        // (3)将创建的Dog对象,序列化到文件e:\\dog.dat文件
        String serFilePath = "e:\\dog.dat";
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(serFilePath));
        oos.writeObject(dog);

        //关闭
        oos.close();
        System.out.println("关闭成功");
    }
    //在编写一个方法,反序列化dog
    @Test
    public void s() throws IOException, ClassNotFoundException {
        String serFilePath = "e:\\dog.dat";
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(serFilePath));
        Dog dog = (Dog)ois.readObject();
        System.out.println("=====反序列化后");
        System.out.println(dog);
        ois.close();
        System.out.println("已关闭");

    }
}
class Dog implements Serializable{
    private String name;
    private int age;
    private String color;

    public Dog(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }

    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;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", color='" + color + '\'' +
                '}';
    }
}

我亦无他,惟手熟尔

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别来无恙blwy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值