学习韩顺平老师java io 笔记整理

一、文件

文件流

文件在程序中以留的形式来操作的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nXoI6Vnc-1642335857608)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20211225185941350.png)]

1.1 常用的文件操作

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

new File只是在内存,create才会

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-voc1MClj-1642335857609)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220115170359733.png)]

实例

三种创建方法


// new File(String pathname)
@Test
void create01() {
    String filePath = "G:\\news.txt";
    File file = new File(filePath);
    try {
        file.createNewFile();
        System.out.println("文件创建成功");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

// new File(File parent,String child)
@Test
void create02() {
    try {
        new File("G:\\","news2.txt").createNewFile();
        System.out.println("创建成功");
    } catch (IOException e) {
        e.printStackTrace();
    }
}
// new File(String parent, String child)
void create03() {
    try {
        new File("G:\\","news2.txt").createNewFile();
        System.out.println("创建成功");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

1.1.2 获取文件信息

// 创建文件对象
File file = new File("g:\\news.txt");

//获取文件名
System.out.println(file.getName());

// 获取绝对路径
System.out.println(file.getAbsolutePath());

// 获取文件父级目录
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());

1.1.3 常用的文件操作

@Test
void m1() {
    String filePath = "g:\\news.txt";
    File file = new File(filePath);
    if (file.exists()) {
        if (file.delete()) {
            System.out.println(filePath + "删除成功");
        }else {
            System.out.println(filePath + "删除失败");
        }
    }else {
        System.out.println("文件不存在....");
    }
}
// 判断demo02是否存在如果存在就删除,不存在则提示不存在
@Test
void m2() {
    String filePath = "g:\\demo02";
    File file = new File(filePath);
    if (file.exists()) {
        if (file.delete()) {
            System.out.println(filePath + "删除成功");
        }else {
            System.out.println("");
        }
    }else {
        System.out.println("文件不存在....");
    }
}
// 判断demo02\\a\\b\\c是否存在如果存在就提示,否则就创建
@Test
void m3() {
    String filePath = "g:\\demo02\\a\\b\\c";
    File file = new File(filePath);
    if (file.exists()) {
        System.out.println("存在");
    }else {
        file.mkdirs();
        System.out.println("文件不存在....已经创建");
    }
}

二、 IO流原理及流的分类

2.1 Java IO流原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xxAxHKHr-1642335857610)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220115173911516.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-94ThiL69-1642335857610)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220115174010807.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pv42BNAr-1642335857610)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220115174213958.png)]

小结:以下四个均为抽象类,都需要调用他们的实现子类

  1. InputStream
  2. OutputStream
  3. Reader
  4. Writer

流就像一个外卖小哥,做运送东西

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FRZyik0I-1642335857611)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220115174717724.png)]

2.2 字节输入流

是所有类字节输入流的超类

InputStream常用的子类

  1. FileInputStream: 文件输入流
  2. BufferdInputStream: 缓冲字节输入流
  3. ObjectInputStream: 对象字节输入流

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2UoHUgwm-1642335857611)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220115175054464.png)]

2.2.1 FileInputStream

方法概要

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JNyQz3fi-1642335857611)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220115181529572.png)]

read()如果直接调用则是一个一个去读取,中文一个占三个字节,故会出现乱码

并且效率极低

String filePath = "G:\\news2.txt";
int readData = 0;
InputStream inputStream = null;
try {
    inputStream = new FileInputStream(filePath);
    while ((readData = inputStream.read()) != -1) {
        System.out.print((char) readData);    //转换成char显示
    }
} catch (Exception e) {
    e.printStackTrace();
} finally {
    try {
        inputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

采用read(byte[] byte)去优化一次性读取一个应该的长度的

String filePath = "G:\\news2.txt";
int readLen = 0;
byte[] bytes = new byte[8];
InputStream inputStream = null;
try {
    inputStream = new FileInputStream(filePath);
    while ((readLen = inputStream.read(bytes)) != -1) {
        System.out.print(new String(bytes,0,readLen));    //并且不会出现乱码
    }
} catch (Exception e) {
    e.printStackTrace();
} finally {
    try {
        inputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

2.2.2 FileOutputStream

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KO5aEv1u-1642335857612)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220115184043704.png)]

write()方法

写单个字符但是以这种方式创建都会刷新文件,如果不想刷新文件,从后面直接写入,则

fileOutputStream = new FileOutputStream(filePath,true);

代码

String filePath = "g:\\a.txt";
FileOutputStream fileOutputStream = null;

try {
    fileOutputStream = new FileOutputStream(filePath,true);
    // 可以以单个字符写入
    // 如果这样创建每次写入内容,会覆盖原来的内容
    //      fileOutputStream.write('H');
    //      fileOutputStream.write("HelloWorld".getBytes());
    //      fileOutputStream.write("HelloWorld".getBytes(),0,3);

    fileOutputStream.write("HelloWorld".getBytes());
    System.out.println("写入成功");
} catch (Exception e) {
    e.printStackTrace();
} finally {
}

2.2.3 实现文件拷贝

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3pHXhFIW-1642335857612)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220115185614935.png)]

String inputFilePath = "F:\\ps教学文件\\猫猫\\1.jpg";
String outFilePath = "F:\\ps教学文件\\猫猫\\wc.jpg";
FileOutputStream fileOutputStream = null;
FileInputStream fileInputStream = null;
byte[] buf = new byte[1024];
int readLength = 0;
try {
    fileInputStream = new FileInputStream(inputFilePath);
    fileOutputStream = new FileOutputStream(outFilePath,true);

    while ((readLength = fileInputStream.read(buf)) != -1) {			//避免一下写入,
        fileOutputStream.write(buf,0,readLength);						//一定要这样写,避免图片精度丢失
    }
    System.out.println("文件拷贝成功");
} catch (Exception e) {
    e.printStackTrace();
} finally {
    try {
        if (fileInputStream != null) {
            fileInputStream.close();
        }
        if (fileOutputStream!=null) {
            fileOutputStream.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

2.3 字符流

2.3.1 IO流体系图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nOMlUJOM-1642335857612)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220115191852029.png)]

2.3.2 FileReader

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wqk6WA4J-1642335857612)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220115192330521.png)]

String filePath = "g:\\story.txt";
FileReader fileReader = null;
int data = 0;
try {
    fileReader = new FileReader(filePath);
    while ((data = fileReader.read()) != -1) {
        System.out.print((char)data);
    }
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (fileReader!=null){
        try {
            fileReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

输出

package com.mohan.io;

import org.junit.jupiter.api.Test;

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

public class FileCopy {
    @Test
    public void test() {
        String inputFilePath = "F:\\ps教学文件\\猫猫\\1.jpg";
        String outFilePath = "F:\\ps教学文件\\猫猫\\wc.jpg";
        FileOutputStream fileOutputStream = null;
        FileInputStream fileInputStream = null;
        byte[] buf = new byte[1024];
        int readLength = 0;
        try {
            fileInputStream = new FileInputStream(inputFilePath);
            fileOutputStream = new FileOutputStream(outFilePath,true);

            while ((readLength = fileInputStream.read(buf)) != -1) {
                fileOutputStream.write(buf,0,readLength);
            }
            System.out.println("文件拷贝成功");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (fileInputStream != null) {
                    fileInputStream.close();
                }
                if (fileOutputStream!=null) {
                    fileOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

采用字节组

@Test
void readFile02() {
    String filePath = "g:\\story.txt";
    FileReader fileReader = null;
    char[] buf = new char[8];
    int readLen = 0;

    try {
        fileReader = new FileReader(filePath);
        while ((readLen = fileReader.read(buf)) != -1) {
            System.out.print(new String(buf,0,readLen));
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            fileReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.3.3 FileWriter

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t0dXvSp1-1642335857613)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220115192545351.png)]

必须close!!!

String filePath = "g:\\note.txt";
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);      //默认是覆盖
    // write(char[],off,len):写入指定部分
    fileWriter.write("莫韩寒".toCharArray(),0,3);
    // write(String) :写入整个字符串
    fileWriter.write("你好啊北京");
    // write(string,off,len):写入字符串指定部分
    fileWriter.write("上海添加",0,2);
    // 在数据量比较大的时候采用循环才做

} catch (Exception e) {
    e.printStackTrace();
} finally {
    try {
        fileWriter.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

2.4 应该如何选择

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kjGDjyo8-1642335857613)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220115230827494.png)]

如果是有字符串输入输出则用FileReader/FileWriter

如果是二进制文件则采用FileputStream/FileOutputStream

2.5 处理流

包装流,

其实是对Reader的一个包装,提供给开发者更强大的功能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JjKKw7lQ-1642335857613)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220115231117047.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nDYdwLWj-1642335857614)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220115231401496.png)]

只要是Reader的子类就可以进行操作

2.6 字节流和处理流

2.6.1 区别与联系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wIL7qvcj-1642335857614)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116095259352.png)]

2.6.2 处理流的主要功能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A4MXwgUN-1642335857614)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116095323508.png)]

2.7 处理流的设计模式-装饰器模式

2.8 包装流

2.8.1 BufferedReader

方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nEQs7G9w-1642335857615)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116155515086.png)]

  1. 使用BufferedReader读取文本文件,并显示在控制台

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7FCkYQg0-1642335857615)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116154936417.png)]

!!! 尽量读取文本文件,如果是二进制文件,则可能会出现文件损失

readLine 按行读取

String filePath = "g:\\a.java";
BufferedReader bufferedReader = null;
try {
    // 创建BufferedReader
    bufferedReader = new BufferedReader(new FileReader(filePath));
    // 读取
    String line;        //按行读取,效率高
    // 说明
    // 1. bufferedReader.readLine();      按行读取文件
    while ((line = bufferedReader.readLine()) != null) {
        System.out.println(line);
    }
} catch (Exception e) {
    e.printStackTrace();
} finally {
    try {
        bufferedReader.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

为什么只需要关闭外层的close()就可以关闭了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wRBAxVrs-1642335857615)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116160221054.png)]

实际上是去调用了一次FileReader的close()

2.8.2 BufferdWrite

直接写入就行了

String filePath = "g:\\ok.txt";
// 创建BufferdWriter
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath,true));
for (int i = 0; i < 10; i++) {
    bufferedWriter.write("你好啊,陈采慧!");
    bufferedWriter.newLine();
    bufferedWriter.write("你好啊,小胖子!");
    bufferedWriter.write("你好啊,唐树泽!");
}
// 直接关闭最外层就行了
bufferedWriter.close();

2.8.3 Bufferd字节拷贝

String srcFilePath = "G:\\a.java";
String outputFilePath = "G:\\a2.java";

BufferedWriter bufferedWriter = null;
BufferedReader bufferedReader = null;

try {
    bufferedReader = new BufferedReader(new FileReader(srcFilePath));
    bufferedWriter = new BufferedWriter(new FileWriter(outputFilePath));
    String readLine;
    while ((readLine = bufferedReader.readLine())!=null) {
        bufferedWriter.write(readLine);
        bufferedWriter.newLine();
    }
    System.out.println("完成拷贝...");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (bufferedWriter!=null) {
            bufferedWriter.close();
        }
        if (bufferedReader!=null) {
            bufferedReader.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

切记不要拷贝二进制文件!!! 比如声音,视频,doc, pdf等

2.8.4 拷贝二进制文件

2.9 对象流

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UW7vtpML-1642335857615)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116170218624.png)]

2.9.1 序列化和反序列化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VbDrwfNE-1642335857616)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116172948282.png)]

public interface Serializable {
}								//标记接口
Externalizable				//有方法需要实现,因此我们一般需要实现上面的Serializable接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yDE2n5Kv-1642335857616)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116173253866.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1jzamIv0-1642335857616)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116173419463.png)]

如果不加则抛出异常

java.io.NotSerializableException

2.9.2 ObjectOutputStream

序列化输出到文件

public class ObjectOutStream_ {
    public static void main(String[] args) throws IOException {
        // 序列化之后,保存的文件格式,不是存文本,二手按照他的格式来保存
        String filePath = "g:\\data.dat";

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));

        // 序列化数据到g:\data.dat
        oos.write(100);   //int -> Integer (实现了 Serializable)
        oos.writeBoolean(true);   //boolean -> Boolean (实现了 Serializable)
        oos.writeChar('a');       //char -> Character (实现了 Serializable)
        oos.writeDouble(9.5) ;    // double -> Double (实现了 Serializable)
        oos.writeUTF("莫寒寒来咯!"); //String

        oos.writeObject(new Dog("旺财",10));
        oos.close();
        System.out.println("序列化输出成功...");
    }
}

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

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

2.9.3 ObjectInputStream

反序列化读取文件

// 指定序列化文件
String filePath = "g:\\data.dat";

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
// 读取
// 1. 读取反序列化的顺序需要和保存数据序列化的顺序一致
// 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());

Object dog = ois.readObject();
Dog dog1 = (Dog) dog;
System.out.println(dog1);
ois.close();

2.9.4 对象处理流使用细节

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7rX7VuI1-1642335857616)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116181127640.png)]

  1. 必须读取一致,否则抛出异常

  2. 必须去实现,否则抛出异常

  3. 是序列化

    // 序列化的版本号,可以提高兼容性
    private static final long serialVersionUID = 1L;
    
  4. 序列化的时候不会保存静态和短暂的字段

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QN2z75Vl-1642335857617)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116181852387.png)]

  5. 序列化里边的必须也要实现序列化接口

  6. 序列化有继承性

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S7a2RDXW-1642335857617)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116182205991.png)]

2.10 标准输入输出流

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qAo2Fmgg-1642335857617)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116182314842.png)]

2.10.1 System.in 标准输入

编译类型 InputStream

public final static InputStream in = null;

运行类型 BufferedInputStream

System.out.println(System.in.getClass());

输出

class java.io.BufferedInputStream

2.10.2 System.out标准输出

编译类型 PrintStream

public final static PrintStream out = null;

运行类型 PrintStream

class java.io.PrintStream

表示标准输出: 显示器

2.11 转换流

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qq2VHAc9-1642335857617)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116183207126.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ItzUKfmp-1642335857618)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116184420722.png)]

2.11.1 InputStreamReader转换流

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A7EruoDN-1642335857618)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116184357463.png)]

String filePath = "G:\\ok2.txt";
// 先把FileInputStream转成InputStreamReader,指定编码为gbk
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(filePath),"gbk");
// 把InputStreamReader 传入BufferedReader
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
System.out.println(bufferedReader.readLine());

简化

BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "gbk"));

2.11.2 OutputStreamWriter转换流

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oDHrrnES-1642335857618)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116184622428.png)]

2.12 打印流PrintStream 和PrintWriter

打印流只有输出,没有输入流

2.12.1 PrintStream

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sU9igajz-1642335857618)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116190528709.png)]

    • Modifier and Type Method and Description
      PrintStream append(char c) 将指定的字符附加到此输出流。
      PrintStream append(CharSequence csq) 将指定的字符序列附加到此输出流。
      PrintStream append(CharSequence csq, int start, int end) 将指定字符序列的子序列附加到此输出流。
      boolean checkError() 刷新流并检查其错误状态。
      protected void clearError() 清除此流的内部错误状态。
      void close() 关闭流。
      void flush() 刷新流。
      PrintStream format(Locale l, String format, Object... args) 使用指定的格式字符串和参数将格式化的字符串写入此输出流。
      PrintStream format(String format, Object... args) 使用指定的格式字符串和参数将格式化的字符串写入此输出流。
      void print(boolean b) 打印布尔值。
      void print(char c) 打印一个字符
      void print(char[] s) 打印字符数组。
      void print(double d) 打印双精度浮点数。
      void print(float f) 打印浮点数。
      void print(int i) 打印一个整数。
      void print(long l) 打印一个长整数。
      void print(Object obj) 打印一个对象。
      void print(String s) 打印字符串。
      PrintStream printf(Locale l, String format, Object... args) 使用指定的格式字符串和参数将格式化的字符串写入此输出流的便利方法。
      PrintStream printf(String format, Object... args) 使用指定的格式字符串和参数将格式化的字符串写入此输出流的便利方法。
      void println() 通过写入行分隔符字符串来终止当前行。
      void println(boolean x) 打印一个布尔值,然后终止该行。
      void println(char x) 打印一个字符,然后终止该行。
      void println(char[] x) 打印一个字符数组,然后终止该行。
      void println(double x) 打印一次,然后终止行。
      void println(float x) 打印一个浮点数,然后终止该行。
      void println(int x) 打印一个整数,然后终止行。
      void println(long x) 打印很长时间,然后终止行。
      void println(Object x) 打印一个对象,然后终止该行。
      void println(String x) 打印一个字符串,然后终止行。
      protected void setError() 将流的错误状态设置为 true
      void write(byte[] buf, int off, int len) 从指定的字节数组写入 len个字节,从偏移 off开始到此流。
      void write(int b) 将指定的字节写入此流。

print源码

public void print(String s) {
    if (s == null) {
        s = "null";
    }
    write(s);
}

2.12.2 PrintWriter

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lUgE8yxk-1642335857619)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116191725421.png)]

    • PrintWriter append(char c) 将指定的字符附加到此作者。
      PrintWriter append(CharSequence csq) 将指定的字符序列附加到此作者。
      PrintWriter append(CharSequence csq, int start, int end) 将指定字符序列的子序列附加到此作者。
      boolean checkError() 如果流未关闭,请刷新流并检查其错误状态。
      protected void clearError() 清除此流的错误状态。
      void close() 关闭流并释放与之相关联的任何系统资源。
      void flush() 刷新流。
      PrintWriter format(Locale l, String format, Object... args) 使用指定的格式字符串和参数将格式化的字符串写入此写入程序。
      PrintWriter format(String format, Object... args) 使用指定的格式字符串和参数将格式化的字符串写入此写入程序。
      void print(boolean b) 打印布尔值。
      void print(char c) 打印一个字符
      void print(char[] s) 打印字符数组。
      void print(double d) 打印双精度浮点数。
      void print(float f) 打印浮点数。
      void print(int i) 打印一个整数。
      void print(long l) 打印一个长整数。
      void print(Object obj) 打印一个对象。
      void print(String s) 打印字符串。
      PrintWriter printf(Locale l, String format, Object... args) 使用指定的格式字符串和参数将格式化的字符串写入该writer的方便方法。
      PrintWriter printf(String format, Object... args) 使用指定的格式字符串和参数将格式化的字符串写入该writer的方便方法。
      void println() 通过写入行分隔符字符串来终止当前行。
      void println(boolean x) 打印一个布尔值,然后终止该行。
      void println(char x) 打印一个字符,然后终止该行。
      void println(char[] x) 打印字符数组,然后终止行。
      void println(double x) 打印双精度浮点数,然后终止行。
      void println(float x) 打印一个浮点数,然后终止该行。
      void println(int x) 打印一个整数,然后终止该行。
      void println(long x) 打印一个长整型,然后终止行。
      void println(Object x) 打印一个对象,然后终止该行。
      void println(String x) 打印一个字符串,然后终止行。
      protected void setError() 表示发生错误。
      void write(char[] buf) 写入一个字符数组。
      void write(char[] buf, int off, int len) 写一个字符数组的一部分。
      void write(int c) 写一个字符
      void write(String s) 写一个字符串
      void write(String s, int off, int len) 写一个字符串的一部分。

标准用法

PrintWriter printWriter = new PrintWriter(System.out);
System.out.println("你好啊北京");
printWriter.close();

2.13 配置文件引出properties

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-55rjxS0L-1642335857619)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116193057296.png)]

传统的方式去

BufferedReader br = new BufferedReader(new FileReader("src\\mysql.properties"));
String line = "";
while ((line = br.readLine()) != null) {
    String[] split = line.split("=");
    System.out.println(split[1]);
}
br.close();

2.13.1 Properties

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ItclVowm-1642335857620)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116194040715.png)]

    • Modifier and Type Method and Description
      String getProperty(String key) 使用此属性列表中指定的键搜索属性。
      String getProperty(String key, String defaultValue) 使用此属性列表中指定的键搜索属性。
      void list(PrintStream out) 将此属性列表打印到指定的输出流。
      void list(PrintWriter out) 将此属性列表打印到指定的输出流。
      void load(InputStream inStream) 从输入字节流读取属性列表(键和元素对)。
      void load(Reader reader) 以简单的线性格式从输入字符流读取属性列表(关键字和元素对)。
      void loadFromXML(InputStream in) 将指定输入流中的XML文档表示的所有属性加载到此属性表中。
      Enumeration propertyNames() 返回此属性列表中所有键的枚举,包括默认属性列表中的不同键,如果尚未从主属性列表中找到相同名称的键。
      void save(OutputStream out, String comments) 已弃用 如果在保存属性列表时发生I / O错误,此方法不会抛出IOException。 保存属性列表的store(OutputStream out, String comments)方法是通过store(OutputStream out, String comments)方法或storeToXML(OutputStream os, String comment)方法。
      Object setProperty(String key, String value) 致电 Hashtable方法 put
      void store(OutputStream out, String comments) 将此属性列表(键和元素对)写入此 Properties表中,以适合于使用 load(InputStream)方法加载到 Properties表中的格式输出流。
      void store(Writer writer, String comments) 将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式输出到输出字符流。
      void storeToXML(OutputStream os, String comment) 发出表示此表中包含的所有属性的XML文档。
      void storeToXML(OutputStream os, String comment, String encoding) 使用指定的编码发出表示此表中包含的所有属性的XML文档。
      Set stringPropertyNames() 返回此属性列表中的一组键,其中键及其对应的值为字符串,包括默认属性列表中的不同键,如果尚未从主属性列表中找到相同名称的键。

set的方法的底层其实是个hashTable,不允许重复,如果存在,则替换

// 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 password = properties.getProperty("password");
System.out.println(user);
System.out.println(password);

// 使用Properties类来创建配置文件, 修改配置文件的内容
Properties properties = new Properties();
properties.setProperty("charset","utf8");
properties.setProperty("user","陈采慧");
properties.setProperty("passwrd","123456");
properties.setProperty("user","莫寒寒");

properties.store(new FileOutputStream("src\\mysql2.properties"),"hello world");
System.out.println("保存文件成功");

2.14 作业

2.14.1 作业1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EDKFXlZP-1642335857620)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116195908445.png)]

String filePath = "e:\\mytemp";
File file = new File(filePath);
if (!file.exists()) {
    file.mkdirs();
    String fileUrl = filePath + "\\hello.txt";
    BufferedWriter bufferedWriter = null;
    try {
        bufferedWriter = new BufferedWriter(new FileWriter(fileUrl));
        bufferedWriter.write("hello,world~");
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (bufferedWriter != null) {
            try {
                bufferedWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}else {
    System.out.println("文件夹已经存在");
}

2.14.2 作业2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7EIGxoB2-1642335857620)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116195813474.png)]

String urlPath = "g:\\ok.txt";
BufferedReader br = null;
br = new BufferedReader(new FileReader(urlPath));
String readValue;
int line = 0;
while ((readValue = br.readLine()) != null) {
    line++;
    System.out.println("第" + line +"行:" + readValue);
}
br.close();

2.14.3 作业3

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hajeQ1t2-1642335857621)(F:\人生苦短,我用IO流\笔记区域\Java-io.assets\image-20220116195847825.png)]

Properties properties = new Properties();
properties.load(new FileReader("src\\dog.properties"));
String name = properties.getProperty("name");
int age = Integer.parseInt(properties.getProperty("age"));
String color = properties.getProperty("color");
Dog dog = new Dog(name, age, color);
System.out.println(dog);
import java.io.Serializable;

public class Dog implements Serializable {
    private static final long serialVersionUID = 1L;
    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;
    }

    @Override
    public String toString() {
        return "Dog{" +
            "name='" + name + '\'' +
            ", age=" + age +
            ", 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;
    }
}

rseInt(properties.getProperty(“age”));
String color = properties.getProperty(“color”);
Dog dog = new Dog(name, age, color);
System.out.println(dog);


```java
import java.io.Serializable;

public class Dog implements Serializable {
    private static final long serialVersionUID = 1L;
    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;
    }

    @Override
    public String toString() {
        return "Dog{" +
            "name='" + name + '\'' +
            ", age=" + age +
            ", 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;
    }
}

你可能感兴趣的:(java,开发语言,后端)