当前位置: 首页 > news >正文

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 {//逐个字节读取@Testpublic 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);}}}//按照字符数组读取@Testpublic 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)); //由于要对文件进行操作,所以传入FileReaderwhile ((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); // IntegerobjectOutputStream.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;}@Overridepublic 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);}//字节流转换成字符流@Testpublic 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并且执行//要写入的urlString 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码则需要使用转换流@Testpublic 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_ {//读取配置文件并且初始化并输出@Testpublic 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

相关文章:

Java基础-IO流

文章目录 1.文件1.基本介绍2.常用的文件操作1.创建文件的相关构造器和方法代码实例结果 2.获取文件相关信息代码实例结果 3.目录的删除和文件删除代码实例 2.IO流原理及分类IO流原理IO流分类 3.FileInputStream1.类图2.代码实例3.结果 4.FileOutputStream1.类图2.案例代码实例 …...

MySQL的基本概念

一.MySQL概念: 你可以把MySQL想象成一个大杂货店,里面有很多货架,每个货架上摆放着不同种类的商品,MySQLMySQ就像是这个杂货店的后台库存管理系统。 1.表格(货架):每个货架上摆放商品&#xff0…...

如何入职车载测试

以下课件都可以学习,一对一教你如何入职车载 可以学习的内容如下:第一:仪表项目、导航项目、车控项目、OTA升级项目、UDS诊断项目。第二:DBC数据库制作、CDD数据库制作。第三:项目规范文档阅读、调查表理解。第四&…...

【物联网】Modbus 协议简介

Modbus 协议简介 QingHub设计器在设计物联网数据采集时不可避免的需要针对Modbus协议的设备做相关数据采集,这里就我们的实际项目经验分享Modbus协议 你可以通过QingHub作业直接体验试用,也可以根据手册开发相应的代码块。 qinghub项目已经全面开源。 …...

网络编程-套接字相关基础知识

1.1. Socket简介 套接字&#xff08;socket&#xff09;是一种通信机制&#xff0c;凭借这种机制&#xff0c; 客户端<->服务器 模型的通信方式既可以在本地设备上进行&#xff0c;也可以跨网络进行。 Socket英文原意是“孔”或者“插座”的意思&#xff0c;在网络编程…...

基于Python的医疗机构药品及耗材进销存信息管理系统

技术&#xff1a;pythonmysqlvue 一、系统背景 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本医疗机构药品及耗材信息管理系统就是在这样的大环境下诞生&#x…...

Java学习笔记(14)

常用API Java已经写好的各种功能的java类 Math Final修饰&#xff0c;不能被继承 因为是静态static的&#xff0c;所以使用方法不用创建对象&#xff0c;使用里面的方法直接 math.方法名 就行 常用方法 Abs,ceil,floor,round,max,minm,pow,sqrt,cbrt,random Abs要注意参数的…...

联合和枚举

联合体 联合体和结构体类似&#xff0c;也有多个成员构成&#xff0c;但编译器只为最大的成员分配足够的空间。 联合体最大的特点是所有的成员共用同一块内存空间。也叫共用体。 union Un { int i; struct s { char c1; char c2; char c…...

《深入Linux内核架构》第2章 进程管理和调度 (3)

目录 2.5 调度器的实现 2.5.1 概观 2.5.2 数据结构 2.5.3 处理优先级 2.5.3.1 nice和prior 2.5.3.2 vruntime 2.5.3.3 weight权重 2.5.4 核心调度器 2.5 调度器的实现 调度器的任务&#xff1a; 1. 执行调度策略。 2. 执行上下文切换。 无论用户态抢占&#xff0c;还是…...

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Refresh)

可以进行页面下拉操作并显示刷新动效的容器组件。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 从API version 11开始&#xff0c;Refresh子组件会跟随手势下拉而下移…...

数据资产管理解决方案:构建高效、安全的数据生态体系

在数字化时代&#xff0c;数据已成为企业最重要的资产之一。然而&#xff0c;如何有效管理和利用这些数据资产&#xff0c;却是许多企业面临的难题。本文将详细介绍数据资产管理解决方案&#xff0c;帮助企业构建高效、安全的数据生态体系。 一、引言 在信息化浪潮的推动下&a…...

Visual Studio 2013 - 调试模式下查看监视窗口

Visual Studio 2013 - 调试模式下查看监视窗口 1. 监视窗口References 1. 监视窗口 Ctrl Alt W&#xff0c;1-4&#xff1a;监视窗口 (数字键不能使用小键盘) or 调试 -> 窗口 -> 监视 -> 监视 1-4 调试状态下使用&#xff1a; 在窗口中点击空白行&#xff0c;…...

CTF 题型 SSRF攻击例题总结

CTF 题型 SSRF攻击&例题总结 文章目录 CTF 题型 SSRF攻击&例题总结Server-side Request Forgery 服务端请求伪造SSRF的利用面1 任意文件读取 前提是知道要读取的文件名2 探测内网资源3 使用gopher协议扩展攻击面Gopher协议 &#xff08;注意是70端口&#xff09;python…...

【Swing】Java Swing实现省市区选择编辑器

【Swing】Java Swing实现省市区选择编辑器 1.需求描述2.需求实现3.效果展示 系统&#xff1a;Win10 JDK&#xff1a;1.8.0_351 IDEA&#xff1a;2022.3.3 1.需求描述 在公司的一个 Swing 的项目上需要实现一个选择省市区的编辑器&#xff0c;这还是第一次做这种编辑器&#xf…...

spring suite搭建springboot操作

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

mysql重构

力扣题目链接 列转行 SELECT product_id, store1 store, store1 price FROM products WHERE store1 IS NOT NULL UNION SELECT product_id, store2 store, store2 price FROM products WHERE store2 IS NOT NULL UNION SELECT product_id, store3 store, store3 price FROM p…...

Linux用户、用户组

用户管理命令&#xff1a; 首先要先知道两个配置文件&#xff1a;/etc/group 用户组配置文件/etc/passwd 保存了所有用户的用于读取的必要信息**/etc/shadow **是 Linux 系统中用于存储用户密码信息的文件。这个文件也被称为“影子文件”&#xff0c;因为它包含了 /etc/passwd…...

操作系统系列学习——信号量的代码实现

文章目录 前言信号量的代码实现 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划学习操作系统并完成6.0S81&#xff0c;加油&#xff01; 本文总结自B站【哈工大】操作系统 李治军&#xff08;全32讲&#xff09; 老师课程讲的非常好&#xff0c;感谢 【哈…...

【Python操作基础】——变量操作

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…...

滑模控制算法(SMC)讲解-案例(附C代码)

目录 一、滑模控制算法的基本原理 1)滑模面(Sliding Surface)的设计 2)达到条件(Reaching Condition)...

Redis数据结构对象之集合对象和有序集合对象

集合对象 集合对象的编码可以是intset或者hashtable. 概述 intset编码的集合对象使用整数集合作为底层实现&#xff0c;集合对象包含的所有元素都被保存在整数集合里面。 另一方面&#xff0c;hashtable编码的集合对象使用字典作为底层实现&#xff0c;字典的每个键都是一个…...

不要百花齐放

javascript中数组的遍历有如下方法&#xff1a; 1、for (var i 0; i < arr.length; i) 2、for(var item of arr) 3、for(var item in arr) 4、arr.forEach 5、arr.map 6、arr.filter 7、arr.find 8、arr.findIndex 9、arr.indexOf arr.lastIndexOf 10、arr.every…...

使用Java JDBC连接数据库

在Java应用程序中&#xff0c;与数据库交互是一个常见的任务。Java数据库连接&#xff08;JDBC&#xff09;是一种用于在Java应用程序和数据库之间建立连接并执行SQL查询的标准API。通过JDBC&#xff0c;您可以轻松地执行各种数据库操作&#xff0c;如插入、更新、删除和查询数…...

阿里云2核4G4M轻量应用服务器价格165元一年

阿里云优惠活动&#xff0c;2核4G4M轻量应用服务器价格165元一年&#xff0c;4Mbps带宽下载速度峰值可达512KB/秒&#xff0c;系统盘是60GB高效云盘&#xff0c;不限制月流量&#xff0c;2核2G3M带宽轻量服务器一年87元12个月&#xff0c;在阿里云CLUB中心查看 aliyun.club 当前…...

连续纯合片段(runs of homozygosity, ROH)的原理

连续纯合片段&#xff08;Runs of Homozygosity, ROH&#xff09;的原理及其结果查看方式包含以下几个方面&#xff1a; 原理 定义和识别&#xff1a; ROH是指基因组中由相同祖先遗传下来的连续纯合等位基因组成的片段。它们可以通过比较个体基因组上的等位基因序列来识别。当…...

UCORE 清华大学os实验 lab0 环境配置

打卡 lab 0 &#xff1a; 环境配置 &#xff1a; 首先在ubt 上的环境&#xff0c;可以用虚拟机或者直接在windows 上面配置 然后需要很多工具 如 qemu gdb cmake git 就是中间犯了错误&#xff0c;误以为下载的安装包&#xff0c;一直解压不掉&#xff0c;结果用gpt 检查 结…...

linux 安装常用软件

文件传输工具 sudo yum install –y lrzsz vim编辑器 sudo yum install -y vimDNS 查询 sudo yum install bind-utils用法可以参考文章 《掌握 DNS 查询技巧&#xff0c;dig 命令基本用法》 net-tools包 yum install net-tools -y简单用法&#xff1a; # 查看端口占用情况…...

OpenMP使用教程:入门到精通

在并行编程的领域中&#xff0c;OpenMP无疑是一个强大而又便捷的工具&#xff0c;它让程序员能够以最少的努力实现程序的并行化。本文将详细介绍OpenMP的基本概念、环境配置、核心指令以及实际代码示例&#xff0c;旨在帮助读者从入门到精通OpenMP的使用。 什么是OpenMP&#…...

华为组网:核心交换机旁挂防火墙,基于ACL重定向配置实验

如图所示&#xff0c;由于业务需要&#xff0c;用户有访问Internet的需求。 用户通过接入层交换机SwitchB和核心层交换机SwitchA以及接入网关Router与Internet进行通信。为了保证数据和网络的安全性&#xff0c;用户希望保证Internet到服务器全部流量的安全性&#xff0c;配置重…...

HarmonyOS NEXT应用开发—投票动效实现案例

介绍 本示例介绍使用绘制组件中的Polygon组件配合使用显式动画以及borderRadius实现投票pk组件。 效果预览图 使用说明 加载完成后会有一个胶囊块被切割成两个等大的图形来作为投票的两个选项&#xff0c;中间由PK两字分隔开点击左边选项&#xff0c;两个图形会随着选择人数…...