Java基础-IO流

文章目录

    • 1.文件
        • 1.基本介绍
        • 2.常用的文件操作
          • 1.创建文件的相关构造器和方法
            • 代码实例
            • 结果
          • 2.获取文件相关信息
            • 代码实例
            • 结果
          • 3.目录的删除和文件删除
            • 代码实例
    • 2.IO流原理及分类
        • IO流原理
        • IO流分类
    • 3.FileInputStream
        • 1.类图
        • 2.代码实例
        • 3.结果
    • 4.FileOutputStream
        • 1.类图
        • 2.案例
          • 代码实例
        • 3.综合案例—文件拷贝
          • 代码实例
    • 5.FileReader
        • 1.类图
        • 2.基本介绍
        • 3.案例
          • 代码实例
    • 6.FileWriter
        • 1.类图
        • 2.基本介绍
        • 3.案例
          • 代码实例
    • 7.节点流与处理流
        • 1.基本介绍
        • 2.节点流和处理流的区别和联系
    • 8.BufferedReader
        • 代码实例
    • 9.BufferedWriter
        • 案例
          • 代码实例
    • 10.Buffered拷贝
        • 代码实例
    • 11.Buffered字节处理流
        • 1.基本介绍
        • 2.字节处理流拷贝(图片/音乐)
          • 代码实例
        • 3.字节处理流和字符处理流比较
    • 12.对象处理流(读写对象)
        • 1.序列化和反序列化
          • 介绍
        • 2.ObjectOutputStream
          • 类图
          • 案例
        • 3.ObjectInputStream
          • 类图
          • 案例
          • 对象处理流使用细节
    • 13.标准输入输出流
        • System.in
        • System.out
        • new Scanner(System.in)
    • 14.转换流(字节流转换成字符流并指定编码)
        • 1.字符流出现乱码引出转换流
        • 2.InputStreamReader
          • 解决乱码问题
          • 代码实例
        • 3.OutputStreamWriter
          • 案例
          • 代码示例
    • 15.打印流
        • PrintStream(字节打印流)
          • 代码实例
        • PrintWrite(字符打印流)
          • 代码实例
    • 16.IO流总结
        • 1.示意图
          • 字节流
          • 字符流
        • 2.细节说明
          • 1.字节流和字符流处理的数据
          • 2.处理流的说明
          • 3.转换流的说明
          • 4.打印流
          • 5.常用的流
    • 17.Properties处理配置文件
        • 1.实际需求引出properties配置文件
        • 2.使用Properties读取配置文件信息
        • 3.使用Properties创建配置文件并且修改配置文件信息
    • 18.本章作业
        • 作业一
          • 题目
          • 代码
        • 作业二
          • 题目
          • 代码
        • 作业三
          • 题目
          • 代码

1.文件

1.基本介绍

image-20240109100451116

2.常用的文件操作
1.创建文件的相关构造器和方法

image-20240109102609262

代码实例
package IO_;

import java.io.File;
import java.io.IOException;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class FileCreate {
    public static void main(String[] args) {
        //使用三种方式在e盘下创建三个文件

        // new File(String pathname)
        String path1 = "e:\\file1.txt";
        File file = new File(path1); //在内存中创建文件对象
        //调用方法在磁盘中创建文件
        try {
            file.createNewFile();
            System.out.println("创建文件1成功!");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        // new File(File parent, String child)
        File file1 = new File("e:\\"); //父文件对象
        String child = "file2.txt"; //子文件路径
        File file2 = new File(file1, child);
        try {
            file2.createNewFile();
            System.out.println("创建文件2成功");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        // new File(String parent, String child)
        String parent = "e:\\"; //父路径
        String child_ = "file3.txt";
        File file3 = new File(parent, child_);
        try {
            file3.createNewFile();
            System.out.println("文件3创建成功");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

结果

image-20240109102713854

image-20240109102738460

2.获取文件相关信息

image-20240109103334723

代码实例
package IO_;

import java.io.File;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class FileInfo {
    public static void main(String[] args) {
        File file = new File("e:\\file1.txt"); //创建文件对象

        System.out.println("文件绝对路径 " + file.getAbsolutePath());
        System.out.println("文件名字 " + file.getName());
        System.out.println("文件父级目录 " + file.getParent());
        System.out.println("文件大小(字节) " + file.length());
        System.out.println("文件是否存在 " + file.exists());
        System.out.println("是不是一个文件 " + file.isFile());
        System.out.println("是不是一个目录 " + file.isDirectory());
    }
}

结果

image-20240109104144473

3.目录的删除和文件删除

image-20240109104257404

代码实例
package IO_;

import java.io.File;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class FileMkdir {
    public static void main(String[] args) {
        // 判断e:\\file1.txt是否存在,如果存在则删除
        File file = new File("e:\\file1.txt");
        if (file.exists()) {
            file.delete();
            System.out.println("删除成功");
        }
        else {
            System.out.println("删除失败");
        }

        // 判断e:\\demo02是否存在,存在就删除,否则提示不存在
        String path = file.getParent() + "demo02"; //路径拼接
        File file1 = new File(path);
        if (file1.exists()) {
            file1.delete();
            System.out.println("删除成功");
        }
        else {
            System.out.println("删除失败");
        }
 
        // 判断e:\\demo\\a\\b\\c是否存在,如果不存在则创建
        File file2 = new File("e:\\demo\\a\\b\\c");
        if (file2.exists()) {
            System.out.println("已经存在");
        }
        else {
            file2.mkdirs();
            System.out.println("文件不存在,已经自动创建");
        }

    }
}

image-20240109110040204

2.IO流原理及分类

IO流原理

image-20240109111502976

IO流就相当于是外卖小哥,用来传输数据

IO流分类

image-20240109111550571

3.FileInputStream

1.类图

image-20240109140211217

2.代码实例
package IO_;

import org.junit.jupiter.api.Test;

import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class FileInputStream {

    //逐个字节读取
    @Test
    public void one() {
        String path = "e:\\hello.txt"; //1.文件路径
        int readData = 0;
        java.io.FileInputStream fileInputStream = null;
        try {
            fileInputStream = new java.io.FileInputStream(path); //2.根据文件路径,创建输入流的对象

            //3.逐个字节读取
            while ((readData = fileInputStream.read()) != -1) { //返回读取的字节,如果返回-1则到文件末尾
                System.out.print((char) readData); //将字节转换成char类型并输出
            }

        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            //4.关闭字节流
            try {
                fileInputStream.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

    //按照字节数组读取
    public static void main(String[] args) {

        String path = "e:\\hello.txt"; //1.文件路径
        byte[] bytes = new byte[8]; //3.8个容量的字节数组
        int readData = 0;
        java.io.FileInputStream fileInputStream = null;

        try {
            fileInputStream = new java.io.FileInputStream(path); //2.字节流对象
            //4.按照字节数组读取
            while ((readData = fileInputStream.read(bytes)) != -1) { //会将字节读进字节数组中,返回读进的字节数
                System.out.print(new String(bytes, 0, readData)); //将字节数组转换成String类型并且输出
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            //5.关闭字节流
            try {
                fileInputStream.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}


3.结果

image-20240109140654781

4.FileOutputStream

1.类图

image-20240109140811361

2.案例

image-20240109141528777

代码实例
package IO_;

import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class FileOutputStream01 {
    public static void main(String[] args) {
        //输出流如果没有那个文件,会自动创建
        String path = "e:\\a.txt"; //1.文件路径
        FileOutputStream fileOutputStream = null; //2.获取文件输出流引用

        try {
//            fileOutputStream = new FileOutputStream(path); //3.获取文件输出流
            fileOutputStream = new FileOutputStream(path, true); //8.设置该文件输出流的写入位置为文件末尾(不覆盖原来的文件)
            //5.输出单个字符
            fileOutputStream.write('h');
            //6.输出字符串
            String a = "hello,world";
            fileOutputStream.write(a.getBytes()); //使用字符串的getBytes来将字符串转化成字节数组
            //7.输出部分字符串
            String b = "hsp,java";
            fileOutputStream.write(b.getBytes(), 0, 3);

        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            //4.关闭文件输出流
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

3.综合案例—文件拷贝

image-20240109145913432

代码实例
package IO_;

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

/**
 * @author 孙显圣
 * @version 1.0
 */
public class FileCopy {
    public static void main(String[] args) {
        //文件源路径
        String src = "C:\\Users\\86156\\Desktop\\images\\1.png";
        //文件目标路径
        String dest = "e:\\1.png";
        //文件输入流
        FileInputStream fileInputStream = null;
        //文件输出流
        FileOutputStream fileOutputStream = null;
        byte[] bytes = new byte[1024]; //用来存储文件输入的字节数组
        int readLength = 0; //记录读取的字节数

        try {
            //获取文件输入流
            fileInputStream = new FileInputStream(src);
            //获取文件输出流
            fileOutputStream = new FileOutputStream(dest);

            //将文件读取到字节数组中
            while ((readLength = fileInputStream.read(bytes)) != -1) {
                fileOutputStream.write(bytes, 0, readLength); //将读取到的部分写入目标文件
            }
            System.out.println("拷贝成功!");

        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            //关闭两个流
            try {
                fileInputStream.close();
                fileOutputStream.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

5.FileReader

1.类图

image-20240109150140412

2.基本介绍

image-20240109150845843

3.案例

image-20240109153041200

代码实例
package IO_;

import org.junit.jupiter.api.Test;

import java.io.FileReader;
import java.io.IOException;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class FileReader_ {
    //按照单个字符读取
    public static void main(String[] args) {
        //读取路径
        String src = "e:\\a.txt";
        //获取字符输入流引用
        FileReader fileReader = null;
        int readData = 0; //接收输入的字符

        try {
            //获取字符输入流
            fileReader = new FileReader(src);
            //按照字符,循环读取
            while ((readData = fileReader.read()) != -1) { //这里返回的是单个字符但是,是以int形式返回的
                System.out.print(((char)readData));
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            //关闭字符输入流
            try {
                fileReader.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }


    //按照字符数组读取
    @Test
    public void readMore() {
        //读取路径
        String src = "e:\\a.txt";
        //获取字符输入流引用
        FileReader fileReader = null;
        char[] chars = new char[100]; //用来接收读取的数据
        int redLen = 0; //记录读取长度

        try {
            //获取字符输入流
            fileReader = new FileReader(src);
            //按照字符,循环读取
            while ((redLen = fileReader.read(chars)) != -1) { //这里是将内容读取到char数组,返回的是读取的长度
                System.out.print(new String(chars, 0, redLen)); //将读取到的部分转化成String,并输出
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            //关闭字符输入流
            try {
                fileReader.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

6.FileWriter

1.类图

image-20240109150519869

2.基本介绍

image-20240109150922491

3.案例
代码实例
package IO_;

import java.io.FileWriter;
import java.io.IOException;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class FileWriter_ {
    public static void main(String[] args) {
        //写入文件地址
        String path = "e:\\a.txt";
        //获取输出字符流引用
        FileWriter fileWriter = null;

        try {
            fileWriter = new FileWriter(path); //获取输出字符流对象
            //写入单个字符
            fileWriter.write('a');
            //写入字符数组
            char[] a = new char[]{'1','2','3'};
            fileWriter.write(a);
            //写入指定字符数组的指定部分
            fileWriter.write("你好,世界".toCharArray(),3,2); //注意这里面的指定位置指的是off(开始位置)len(长度),这里我就是,从3开始2个位置所以是世界
            //写入字符串
            fileWriter.write("字符串");
            //写入部分字符串
            fileWriter.write("韩顺平,java",0, 3);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            //关闭字符流
            try {
                fileWriter.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

image-20240109155725520

7.节点流与处理流

1.基本介绍

image-20240109161436152

简单来说,就是节点流的处理局限性太强,java设计者就设计了处理流,处理流中有一个属性,这个属性是一个类的引用,而这个类是各种节点流的父类,通过将其他节点流的对象赋值给这个属性,就可以向上转型,从而使用这个属性来调用各种节点流的方法

image-20240109161417762

2.节点流和处理流的区别和联系
  1. 节点流式底层流,直接跟数据源相接
  2. 处理流(包装类 )包装节点流,既可以消除不同节点流的实现差异,也可以对提供更方便的方法来完成输入输出
  3. 处理流对节点流进行包装,使用了修饰器设计模式,不会与数据源直接相连
  4. 重点就是:处理流有一个属性,这个属性是很多子类型的父类,也就是说可以接收很多子类型的对象,接受的谁的对象,掉用的就是谁的方法

image-20240109161049346

8.BufferedReader

代码实例
package IO_;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class BufferReader_ {
    public static void main(String[] args) {
        //读取的路径
        String path = "e:\\a.txt";
        //BufferedReader的引用
        BufferedReader bufferedReader = null;
        //接受读取的内容
        String readData = null;
        try {
            bufferedReader = new BufferedReader(new FileReader(path)); //由于要对文件进行操作,所以传入FileReader
            while ((readData = bufferedReader.readLine()) != null) { //按行读取
                System.out.println(readData);
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                bufferedReader.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

9.BufferedWriter

案例

image-20240109184303414

代码实例
package IO_;

import java.io.FileWriter;
import java.io.IOException;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class BufferedWriter {
    public static void main(String[] args) throws IOException {
        String path = "e:\\a.txt";
        java.io.BufferedWriter bufferedWriter = new java.io.BufferedWriter(new FileWriter(path, true));//以追加的方式写入
        bufferedWriter.write("韩顺平教育,,,java");
        bufferedWriter.close(); //关闭外层流
    }
}

10.Buffered拷贝

image-20240109184638373

代码实例
package IO_;

import java.io.*;
import java.io.BufferedWriter;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class BufferedCopy {
    public static void main(String[] args) throws IOException {
        //源地址
        String src = "e:\\a.txt";
        //目标地址
        String dest = "e:\\b.txt";
        String readData = null; //存储读取信息

        //获取输入流
        BufferedReader bufferedReader = new BufferedReader(new FileReader(src));
        //获取输出流
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(dest));

        //按行读取信息
        while ((readData = bufferedReader.readLine()) != null) {
            //写入
            bufferedWriter.write(readData);
            bufferedWriter.newLine(); //写入一行
        }
        //关闭
        bufferedWriter.close();
        bufferedReader.close(); 
    }
}

11.Buffered字节处理流

1.基本介绍

image-20240109191214549

image-20240109191438743

2.字节处理流拷贝(图片/音乐)
代码实例
package IO_;

import java.io.*;
import java.io.FileInputStream;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class BufferedCopy02 {
    public static void main(String[] args) throws IOException {
        //源地址
        String src = "e:\\1.png";
        //目标地址
        String dest = "e:\\3.png";
        //存储读取到的字节数组
        byte[] bytes = new byte[1024];
        //存储读取长度
        int readLen = 0;

        //获取输入字节流
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(src));
        //获取输出字节流
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(dest));

        //循环读取
        while ((readLen = bufferedInputStream.read(bytes)) != -1) {
            bufferedOutputStream.write(bytes, 0, readLen);
        }
        //关闭字节流
        bufferedInputStream.close();
        bufferedOutputStream.close();
    }
}

3.字节处理流和字符处理流比较
  1. 字节处理流主要用于处理二进制文件(视频、图片等),也能处理二进制文件
  2. 字符处理流主要用于处理文本文件(效率高),不能处理二进制文件
  3. 字节处理流可以写一个字节、字节数组、部分字节数组
  4. 字符处理流可以写一个字符、一个字符数组、一个字符串、部分字符数组、部分字符串
  5. 简单来说,字节处理的是单个字节,字节数组,字符处理的是单个字符,字符数组,字符串

12.对象处理流(读写对象)

1.序列化和反序列化
介绍
  1. 序列化就是在保存数据的时候,保存数据的值和数据类型
  2. 反序列化就是在回复数据时,恢复数据的值和数据类型
  3. 需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一
    1. Serializable(推荐) 这是一个标记接口,里面没有任何方法
    2. Externalizable

image-20240109195054481

2.ObjectOutputStream
类图

image-20240109195807417

案例
package IO_;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class ObjectOutputStream_ {
    public static void main(String[] args) throws IOException {
        //输出文件路径
        String path = "e:\\data.dat"; //注意序列化的文件是dat格式的
        //获取对象输出流
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(path));
        //保存
        objectOutputStream.writeInt(100); // Integer
        objectOutputStream.writeBoolean(true);
        objectOutputStream.writeChar('a');
        objectOutputStream.writeDouble(10.2);
        objectOutputStream.writeUTF("adf");
        objectOutputStream.writeObject(new Dog("jack",12));
        //关闭
        objectOutputStream.close();

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

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

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

3.ObjectInputStream
类图

image-20240109195829940

案例
package IO_;

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

/**
 * @author 孙显圣
 * @version 1.0
 */
public class ObjectInputStream_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //输入的地址
        String path = "e:\\data.dat";
        //获取对象处理流
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(path));
        // 按照之前序列化的次序来获取对象
        System.out.println(objectInputStream.readInt());
        System.out.println(objectInputStream.readBoolean());
        System.out.println(objectInputStream.readChar());
        System.out.println(objectInputStream.readDouble());
        System.out.println(objectInputStream.readUTF());

        Object o = objectInputStream.readObject();
        System.out.println(o.getClass());
        System.out.println(o);

        //关闭对象处理流
        objectInputStream.close();

    }
}

对象处理流使用细节
  1. 在修改了对象处理流的文件之后,需要重新运行一遍程序,保持版本一致性
  2. 如果是自定义的对象,要保证该输入流文件可以引入
  3. 读写顺序需要一致
  4. 序列化或者反序列化对象必须实现Serializable接口
  5. 序列化中的类建议添加SerialVersionUID,为了提高版本的兼容性image-20240110101629818
  6. 序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员
  7. 序列化对象时,要求里面的属性也需要实现序列化接口
  8. 序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也默认实现了序列化

13.标准输入输出流

System.in
  1. 编译类型:InputStream
  2. 运行类型:BufferedInputStream(可以处理所有输入,只需要传入相应的InputStream子类即可)
  3. 表示的是标准输入 键盘
System.out
  1. 编译类型:PrintStream
  2. 运行类型:PrintStream
  3. 表示的是标准输出 显示器
new Scanner(System.in)
  1. 这个就相当于给扫描器传入了接受键盘输入的数据

14.转换流(字节流转换成字符流并指定编码)

image-20240110111826413

1.字符流出现乱码引出转换流
  1. 将文件类型改成非utf-8,然后使用字符流读取image-20240110105218167
  2. 如果想解决这个问题,就只能将字符流转换成字节流并且指定编码,然后再转回来
2.InputStreamReader

image-20240110105623912

解决乱码问题
代码实例
package IO_;

import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.*;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class CodeQuestion {
    public static void main(String[] args) throws IOException {
        //使用字符流读取文件内容
        String url = "e:\\a.txt";
        //获取字符处理流
        BufferedReader bufferedReader = new BufferedReader(new FileReader(url));
        //读取一行内容
        String s = bufferedReader.readLine();
        System.out.println(s);
    }
    //字节流转换成字符流
    @Test
    public void test() throws IOException {
        String url = "e:\\a.txt";
        //这里是使用文件字节流读取信息,并传入编码,会返回一个字符流的实例
        InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(url), "gbk");

//        //使用节点流的方式去读
//        char[] chars = new char[100];
//        int readLen;
//        while ((readLen = inputStreamReader.read(chars)) != -1) { //读到字符数组中并返回读取的长度
//            System.out.println(new String(chars, 0, readLen)); //根据读取的长度取出数组内的长度
//        }

        //使用BufferedReader的方式去读
        String re = null;
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        while ((re = bufferedReader.readLine()) != null) {
            System.out.println(re);
        }
    }
}

image-20240110111714136

3.OutputStreamWriter

image-20240110105857664

案例

image-20240110111940615

代码示例
package IO_;

import java.io.*;
import java.io.BufferedWriter;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class FileOutputStream02 {
    public static void main(String[] args) throws IOException {
        //使用OutputStreamWriter 将字节流转换成字符流指定utf-8并且执行
        //要写入的url
        String url = "e:\\a.txt";
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(url), "utf-8"));
        //这里使用OutputStreamWriter将字节流转化为字符流并且指定编码,并且使用BufferedWriter来操作这个字符流
        bufferedWriter.write("世界,你好!");
        bufferedWriter.close();
    }
}

15.打印流

PrintStream(字节打印流)

image-20240110132611848

代码实例
package IO_;

import java.io.FileNotFoundException;
import java.io.PrintStream;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class PrintStream_ {
    public static void main(String[] args) throws FileNotFoundException {
        //使用字节打印流在屏幕打印
        PrintStream out = System.out;
        out.println("你好,世界");

        //修改打印位置为文件中的位置
        System.setOut(new PrintStream("e:\\a.txt"));
        System.out.println("dsfasdfs");

    }
}

PrintWrite(字符打印流)

image-20240110132737733

代码实例
package IO_;

import java.io.*;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class PrintWriter_ {
    public static void main(String[] args) throws IOException {

        PrintWriter printWriter = new PrintWriter(System.out); //传入了一个标准输出到屏幕的对象
        PrintWriter printWriter1 = new PrintWriter(new FileWriter("e:\\a.txt")); //传入了一个输入到文件的对象
        
        printWriter1.print("辅导费");
        printWriter1.close();
        printWriter.println("dagasdg");
        printWriter.close();
    }
}

16.IO流总结

1.示意图
字节流
  • InputStream
    • FileInputStream(节点流)
    • BufferedInputStream(处理流)(System.in 标准输入 键盘)
    • ObjectInputStream(对象处理流,反序列化)
  • OutputStream
    • FileOutputStream(节点流)
    • BufferedOutputStream(处理流)
    • ObjectOutputStream(对象处理流,序列化)
    • PrintStream(字节打印流)(System.out 标准输出 显示器)
字符流
  • Reader
    • FileReader(节点流)
    • BufferedReader(处理流)
    • InputStreamReader(转换流)
  • Writer
    • FileWriter(节点流)
    • BufferedWriter(处理流)
    • OutputStreamWriter(转换流)
    • PrintWriter(字符打印流)
2.细节说明
1.字节流和字符流处理的数据
  1. 字节流:处理单个字节(字符)、字节数组,一般处理二进制文件时使用
  2. 字符流:处理单个字符、字符数组、字符串(可写),一般处理文本文件时使用
2.处理流的说明
  1. 字符处理流可以读写String类型,并且 可以读一行,字节处理流还是只能读字节或者字节数组
  2. 由于节点流的处理局限性太强,所以产生了处理流
  3. 处理流使用了修饰器模式,就是使用一个其他节点流的父类型的属性,通过构造方法来接收其他节点流的实例,接受了谁的实例,这个属性调用的方法就是谁的方法,也就是处理哪个节点
  4. 处理流可以处理基类的所有节点子类
3.转换流的说明
  1. 为了指定文本文件的编码,又想使用字符流,就产生了转换流
  2. 转换流可以接收字节流的实例,用于读写和设置编码,然后返回一个转换流,由于这个转换流也是两大基类节点子类,所以一般使用处理流来处理
4.打印流
  1. System.out:默认指向标准输出 显示器的打印流,使用System.setOut可以接收输出到文件的PrintStream类
  2. PrintWriter:它的构造方法可以接收一个System.out(指向一个标准输出到显示器的实例),也可以接收一个输出到文件的FileWriter
5.常用的流
  1. 一般使用处理流Buffered。。。来进行处理
  2. 字节处理流,读写字节数组,需要字节数组缓冲区和计数器,循环条件是不等于-1
  3. 字符处理流,读写字符串,可以读一行,需要字符串缓冲区,循环条件是不等于null

17.Properties处理配置文件

1.实际需求引出properties配置文件

image-20240110151408363

在开发中操作数据库需要用户名和密码,如果在程序中写死,则一但更换了数据库则需要修改源代码,所以一般将其写在配置文件中,在代码中使用Properties类来读取

2.使用Properties读取配置文件信息
package IO_;

import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class Properties_ {
    public static void main(String[] args) throws IOException {
        //1.创建实例
        Properties properties = new Properties();
        //2.使用流的方式加载配置文件
        properties.load(new FileReader("src\\mysql.properties"));
        //3.以打印流的方式展示所有文件
        properties.list(System.out); //这里传入一个标准打印流 屏幕
        //4.根据key,获取value信息
        String username = properties.getProperty("username");
        String password = properties.getProperty("password");
        System.out.println("username:" + username);
        System.out.println("password:" + password);
    }
}

3.使用Properties创建配置文件并且修改配置文件信息
package IO_;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class Properties_1 {
    public static void main(String[] args) throws IOException {
        //使用properties来创建一个文件赋值并且修改
        //1.创建实例
        Properties properties = new Properties();
        //2.为其设置几个值
        properties.setProperty("username","12344");
        properties.setProperty("password","9999");
        //3.将其存储到配置文件中
        properties.store(new FileWriter("src\\mysql1.properties"), "这个是文档开头注释");

        //4.修改配置文件
        properties.setProperty("username","111111");
        properties.store(new FileWriter("src\\mysql1.properties"),null);

    }
}

18.本章作业

作业一
题目

image-20240110160323482

代码
package IO_;

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

/**
 * @author 孙显圣
 * @version 1.0
 */
public class HomeWork01 {
    public static void main(String[] args) throws IOException {
        //创建文件对象
        File file = new File("e:\\mytemp");
        //判断是否是文件夹,如果不是则创建
        if (!file.isDirectory()) {
            file.mkdirs();
        }

        //在e盘刚才创建的目录下创建文件hello.txt,如果存在则输出内容
        File file1 = new File(file, "hello.txt");
        if (file1.exists()) {
            System.out.println("文件已经存在");
            //写入内容
            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file1));
            bufferedWriter.write("你好世界");
            //关闭
            bufferedWriter.close();
        }
        file1.createNewFile();


    }
}

作业二
题目

image-20240110161635395

代码
package IO_;

import org.junit.jupiter.api.Test;

import java.io.*;
import java.io.FileInputStream;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class HomeWork02 {
    public static void main(String[] args) throws IOException {
        File file = new File("e:\\mytemp\\hello.txt");
        //创建对象
        BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
        //存储数据
        String re = null;
        int num = 0; //记录行号
        while ((re = bufferedReader.readLine()) != null) { //按行读取
            num ++;
            //加上行号之后重新输出
            System.out.println(num + re);
            //读取出来
        }
        //关闭
        bufferedReader.close();

    }
    //将文件改成gbk码则需要使用转换流
    @Test
    public void test() throws IOException {
        File file = new File("e:\\mytemp\\hello.txt");
        //使用转换流
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "gbk"));
        String re = null;
        while ((re = bufferedReader.readLine()) != null) {
            System.out.println(re);
        }
        //关闭转换流
        bufferedReader.close();
    }
}

作业三
题目

image-20240110164911073

代码
package IO_;

import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class HomeWork03 {
    public static void main(String[] args) throws IOException {
        //创建实例
        Properties properties = new Properties();
        //设置值
        properties.setProperty("name", "tom");
        properties.setProperty("age", "5");
        properties.setProperty("color", "red");
        //存储到文件
        properties.store(new FileOutputStream("src\\dog.properties"), null);
    }
}
class Dog_ {
    //读取配置文件并且初始化并输出
    @Test
    public void test() throws IOException {
        Properties properties = new Properties();
        //加载文件
        properties.load(new FileInputStream("src\\dog.properties"));
        //完成初始化
        properties.setProperty("name","jack");
        //输出文件
        properties.list(System.out);
    }
}

image-20240110190729539

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/469689.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(C语言)memcpy函数详解与模拟实现

目录 1. memcpy函数详解 情况一&#xff1a; 情况二&#xff1a; 情况三&#xff1a; 情况四&#xff1a; 情况五&#xff1a; 2. memcpy模拟实现 2.1 重叠情况的讨论&#xff1a; 2.2 memcpy函数超出我们的预期 1. memcpy函数详解 头文件<string.h> 这个函数和…

腾讯云服务器多少钱一个月?5元1个月,这价格没谁了

2024腾讯云服务器多少钱一个月&#xff1f;5元1个月起&#xff0c;腾讯云轻量服务器4核16G12M带宽32元1个月、96元3个月&#xff0c;8核32G22M配置115元一个月、345元3个月&#xff0c;腾讯云轻量应用服务器61元一年折合5元一个月、4核8G12M配置646元15个月、2核4G5M服务器165元…

C++ Qt开发:QUdpSocket网络通信组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QUdpSocket组件实现基于UDP的网络通信…

网站引用图片但它域名被墙了或者它有防盗链,我们想引用但又不能显示,本文附详细的解决方案非常简单!

最好的办法就是直接读取图片文件&#xff0c;用到php中一个常用的函数file_get_contents(图片地址)&#xff0c;意思是读取远程的一张图片&#xff0c;在输出就完事。非常简单&#xff5e;话不多说&#xff0c;直接上代码 <?php header("Content-type: image/jpeg&quo…

“小白也能玩转!ES集群搭建零报错全攻略,轻松上手指南!”

&#x1f310; 全新的“Open开袁”官方网站现已上线&#xff01;https://open-yuan.com&#xff0c;汇聚编程资源、深度技术文章及开源项目地址&#xff0c;助您探索技术新境界。 &#x1f4f1; 关注微信公众号“全栈小袁”&#xff0c;随时掌握最新项目动态和技术分享&#xf…

2024地方门户源码运营版带圈子动态+加即时通讯(PC电脑端+WAP移动端+H5微信端+微信小程序+APP客户端)

2024地方门户源码运营版带圈子动态加即时通讯&#xff08;PC电脑端WAP移动端H5微信端微信小程序APP客户端&#xff09; 源码介绍&#xff1a; 包含5个端 PC电脑端WAP移动端H5微信端微信小程序APP客户端 功能介绍&#xff1a; 包含功能&#xff1a;信息资讯、二手信息、房产…

docker入门(四)—— docker常用命令详解

docker 常用命令 基本命令 # 查看 docker 版本 docker version # 查看一些 docker 的详细信息 docker info 帮助命令&#xff08;–help&#xff09;&#xff0c;linux必须要会看帮助文档 docker --help[rootiZbp15293q8kgzhur7n6kvZ /]# docker --helpUsage: docker [OPTI…

Grok ai——很牛叉的ai工具Grok-1大模型

Grok Grok 是一款仿照《银河系漫游指南》&#xff08;Hitchhikers Guide to the Galaxy&#xff09;设计的人工智能。它可以回答几乎任何问题&#xff0c;更难的是&#xff0c;它甚至可以建议你问什么问题&#xff01; Grok 是一个仿照《银河系漫游指南》设计的人工智能&#x…

数据结构:详解【顺序表】的实现

1. 顺序表的定义 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。动态顺序表与数组的本质区别是——根据需要动态的开辟空间大小。 2. 顺序表的功能 动态顺序表的功能一般有如下几个&#xff1a; 初始化顺序表打印顺序…

计算机组成原理-3-系统总线

3. 系统总线 文章目录 3. 系统总线3.1 总线的基本概念3.2 总线的分类3.3 总线特性及性能指标3.4 总线结构3.5 总线控制3.5.1 总线判优控制3.5.2 总线通信控制 本笔记参考哈工大刘宏伟老师的MOOC《计算机组成原理&#xff08;上&#xff09;_哈尔滨工业大学》、《计算机组成原理…

spring suite搭建springboot操作

一、前言 有时候久了没开新项目了&#xff0c;重新开发一个新项目&#xff0c;搭建springboot的过程都有点淡忘了&#xff0c;所有温故知新。 二、搭建步骤 从0开始搭建springboot 1&#xff0e;创建work空间。步骤FileNewJava Working Set。 2.选择Java Working Set。 3.自…

微信小程序接口请求出错:request:fail url not in domain list:xxxxx

一、微信小程序后台和开发者工具配的不一样导致了这个错误 先说结论&#xff1a; 开发者工具配置了https://www.xxx.cn/prod-api/ 微信后台配置了 https://www.xxx.cn 一、最开始 开发者工具配置了https://www.xxx.cn:7500 微信后台配置了 https://www.xxx.cn 报错:reques…

OPTEE v3.20.0 FVP环境搭建

目录 一、前提条件 二、下载fvp代码 三、下载工具链 四、下载Foundation_Platform FVP平台 五、编译及运行 一、前提条件 1、安装如下的依赖工具 sudo apt-get install android-tools-adb android-tools-fastboot autoconf \ automake bc bison build-essential ccache c…

2024精灵传信系统支持电脑PC端+小程序双端源码

2024精灵传信系统支持电脑PC端小程序双端源码 精灵传信支持在线提交发送短信&#xff0c;查看回复短信&#xff0c;在线购买额度&#xff0c;自定义对接易支付&#xff0c;设置违禁词&#xff0c;支持网站小程序双端。 搭建环境&#xff1a; PHP > 73 MySQL>5.6 Nginx…

当两会热词碰上“人工智能+”,你知道哪些企业算是行业弄潮儿吗?

最近正值全国“两会”的召开&#xff0c;一大批新词热词涌现&#xff0c;聚焦了各行各业的发展&#xff0c;也一定程度上代表了未来的主要发展方向。“未来产业”、“人工智能”、“全国一体化算力体系”等热词的出圈充分表明了信息技术行业是一大发展重点&#xff0c;尤其是人…

护航容器安全:私有Registry在镜像审核中的关键角色与实战策略

在容器化技术日益普及的今天&#xff0c;Docker镜像的质量与安全性成为了构建稳定、可靠应用的关键要素。私有Registry作为镜像的集中存储和分发中心&#xff0c;不仅可以提供镜像的统一管理&#xff0c;还能通过集成镜像审核机制&#xff0c;确保进入生产环境的镜像符合安全与…

如何解决MySQL死锁(看懂MySQL锁日志)

有时候系统在生产运行着&#xff0c;会突然爆出 [40001][1213] Deadlock found when trying to get lock; try restarting transaction 这个时候每个人都会很紧张&#xff0c;因为死锁会影响DB性能&#xff0c;严重时甚至拖垮整个系统。在实际的环境中&#xff0c;很多服务会共…

【电路笔记】-达林顿晶体管

达林顿晶体管 文章目录 达林顿晶体管1、概述2、基本达林顿晶体管配置3、示例4、达林顿晶体管应用5、Sziklai 晶体管对6、ULN2003A 达林顿晶体管阵列7、总结两个双极晶体管的达林顿晶体管配置可针对给定基极电流提供更大的电流切换。 1、概述 达林顿晶体管以其发明者 Sidney Da…

文件包含漏洞之包含NGINX日志文件(常用)

条件&#xff1a;知道目标服务器的日志文件存贮路径&#xff0c;并且存在文件包含漏洞 首先对目标服务器发送一次含有木马的请求&#xff0c;目的是让目标服务器日志中生成含有木马的日志记录。因为发送过程中&#xff0c;使用了url编码&#xff0c;我们抓包进行更改成能够执行…

【Python爬虫】详解BeautifulSoup()及其方法

文章目录 &#x1f354;准备工作&#x1f339;BeautifulSoup()⭐代码实现✨打印标签里面的内容✨快速拿到一个标签里的属性✨打印整个文档&#x1f386;获取特定标签的特定内容 &#x1f339;查找标签&#x1f388;在文档查找标签 find_all&#x1f388;正则表达式搜索 &#x…