• Java筑基32-IO流02-节点流&处理流


    目录

    节点流和处理流

    1.处理流设计模式

    2. IO流设计模式-装饰器模式模拟

    3. BufferedReader & BufferedWriter

    4. Buffered拷贝(字符文件)

    5. Buffered字节处理流

    6.Buffered拷贝(字节文件)

    7.对象处理流

    8.标准输入输出流

    转换流

    1)乱码问题引出转换流

    2)InputStreamReader&OutputStreamWriter

    打印流PrintStream&PrintWriter

    1)PrintStream

    2)PrintWriter

    Properties类

    1)配置文件引出Properties

    2)Properties类

    案例

    1)目录文件操作

    2)读取文件操作


    节点流和处理流

    1.处理流设计模式

    2. IO流设计模式-装饰器模式模拟

    1. /**
    2. * @author:飞扬
    3. * @公众hao:程序员飞扬
    4. * @description: IO流设计模式-装饰器模式模拟
    5. */
    6. public abstract class Reader_ {
    7. //抽象类,提供两个空方法
    8. public void readFile(){}
    9. public void readString(){}
    10. }

    1. /**
    2. * @author:飞扬
    3. * @公众hao:程序员飞扬
    4. * @description: IO流设计模式-装饰器模式模拟
    5. */
    6. public class FileReader_ extends Reader_{
    7. //模拟节点流,读取文件
    8. @Override
    9. public void readFile(){
    10. System.out.println("读取文件。。。");
    11. }
    12. }
    1. /**
    2. * @author:飞扬
    3. * @公众hao:程序员飞扬
    4. * @description: IO流设计模式-装饰器模式模拟
    5. */
    6. public class StringReader_ extends Reader_{
    7. //模拟节点流,处理字符串
    8. @Override
    9. public void readString(){
    10. System.out.println("读取字符串。。。");
    11. }
    12. }
    1. /**
    2. * @author:飞扬
    3. * @公众hao:程序员飞扬
    4. * @description: IO流设计模式-装饰器模式模拟
    5. *
    6. * 模拟处理流/包装流
    7. */
    8. public class BufferedReader_ extends Reader_{
    9. private Reader_ reader_;
    10. public BufferedReader_(Reader_ reader_) {
    11. this.reader_ = reader_;
    12. }
    13. //原始方法
    14. public void readFile(){
    15. reader_.readFile();
    16. }
    17. public void readString(){
    18. reader_.readFile();
    19. }
    20. //扩展方法,多次读取文件(也可以加缓冲byte[]等)
    21. public void readFile(int num){
    22. for (int i = 0; i < num; i++) {
    23. reader_.readFile();
    24. }
    25. }
    26. //扩展方法,多次读取字符串(也可以批量读取字符串)
    27. public void readString(int num){
    28. for (int i = 0; i < num; i++) {
    29. reader_.readString();
    30. }
    31. }
    32. }
    1. /**
    2. * @author:飞扬
    3. * @公众hao:程序员飞扬
    4. * @description: 装饰器模式模拟测试
    5. */
    6. public class Test_ {
    7. public static void main(String[] args) {
    8. BufferedReader_ bufferedReader_ = new BufferedReader_(new FileReader_());
    9. bufferedReader_.readFile(); //调原始方法
    10. System.out.println("----");
    11. bufferedReader_.readFile(3); //调扩展方法
    12. BufferedReader_ bufferedReader_1 = new BufferedReader_(new StringReader_());
    13. bufferedReader_1.readString(); //调原始方法
    14. System.out.println("----");
    15. bufferedReader_1.readString(5); //调扩展方法
    16. }
    17. }

    重点理解体会修饰器模式设计思想的巧妙。

    3. BufferedReader & BufferedWriter

    案例:使用BufferedReader读取文本文件

    1. import java.io.BufferedReader;
    2. import java.io.FileReader;
    3. import java.io.IOException;
    4. /**
    5. * @author:飞扬
    6. * @公众hao:程序员飞扬
    7. * @description:
    8. */
    9. public class BufferedReaderTest {
    10. public static void main(String[] args) throws IOException {
    11. String filePath = "d:\\hello.txt";
    12. //创建BufferedReader
    13. BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
    14. //按行读取,效率高
    15. String line;
    16. //bufferedReader.readLine()是按行读取文件
    17. //当返回null时表示读取完毕
    18. while((line = bufferedReader.readLine()) !=null){
    19. System.out.println(line);
    20. }
    21. //关闭流,这里注意,只需要关闭最外层流,因为底层会自动关闭节点流(追源码)
    22. bufferedReader.close();
    23. }
    24. }

    BufferedWriter写文件

    1. import java.io.BufferedWriter;
    2. import java.io.FileWriter;
    3. import java.io.IOException;
    4. /**
    5. * @author:飞扬
    6. * @公众hao:程序员飞扬
    7. * @description:
    8. */
    9. public class BufferedWriterTest {
    10. public static void main(String[] args) throws IOException {
    11. String filePath = "d:\\栓克油.txt";
    12. //BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath)); //会覆盖
    13. BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath,true)); //追加模式
    14. bufferedWriter.write("hello,");
    15. bufferedWriter.newLine();
    16. bufferedWriter.write("飞扬");
    17. bufferedWriter.close();
    18. }
    19. }

    4. Buffered拷贝(字符文件)

    1. import java.io.BufferedReader;
    2. import java.io.BufferedWriter;
    3. import java.io.FileReader;
    4. import java.io.FileWriter;
    5. import java.io.IOException;
    6. /**
    7. * @author:飞扬
    8. * @公众hao:程序员飞扬
    9. * @description:
    10. */
    11. public class BufferedCopy {
    12. public static void main(String[] args) {
    13. String srcFilePath = "d:\\hello.txt";
    14. String destFilePath = "d:\\bufferedCopy.txt";
    15. BufferedReader bufferedReader = null;
    16. BufferedWriter bufferedWriter = null;
    17. try{
    18. bufferedReader = new BufferedReader(new FileReader(srcFilePath));
    19. bufferedWriter = new BufferedWriter(new FileWriter(destFilePath));
    20. String line;
    21. while((line = bufferedReader.readLine()) != null){
    22. bufferedWriter.write(line);
    23. bufferedWriter.newLine();
    24. }
    25. }catch (IOException e){
    26. e.printStackTrace();
    27. }finally {
    28. try {
    29. if(bufferedWriter != null){
    30. bufferedWriter.close();
    31. }
    32. if(bufferedWriter != null){
    33. bufferedWriter.close();
    34. }
    35. } catch (IOException e) {
    36. e.printStackTrace();
    37. }
    38. }
    39. }
    40. }

    5. Buffered字节处理流

    6.Buffered拷贝(字节文件)

    1. import java.io.BufferedInputStream;
    2. import java.io.BufferedOutputStream;
    3. import java.io.FileInputStream;
    4. import java.io.FileOutputStream;
    5. import java.io.IOException;
    6. /**
    7. * @author:飞扬
    8. * @公众hao:程序员飞扬
    9. * @description: 字节流拷贝(拷贝二进制文件,如图片,音视频等)
    10. *
    11. * 思考:字节流可以操作二进制文件,可以操作文本文件吗,当然可以。。。
    12. */
    13. public class BufferedCopy2 {
    14. public static void main(String[] args) {
    15. BufferedInputStream bufferedInputStream = null;
    16. BufferedOutputStream bufferedOutputStream = null;
    17. try{
    18. FileInputStream fis = new FileInputStream("d:\\aaa.jpg");
    19. FileOutputStream fos = new FileOutputStream("d:\\aaa2.jpg");
    20. bufferedInputStream = new BufferedInputStream(fis);
    21. bufferedOutputStream = new BufferedOutputStream(fos);
    22. byte[] b = new byte[1024];
    23. int len;
    24. while((len=bufferedInputStream.read(b)) != -1){
    25. bufferedOutputStream.write(b,0,len);
    26. }
    27. System.out.println("拷贝完成~~");
    28. }catch (IOException e){
    29. e.printStackTrace();
    30. }finally {
    31. try {
    32. if(bufferedOutputStream !=null) {
    33. bufferedOutputStream.close();
    34. }
    35. if(bufferedInputStream != null){
    36. bufferedInputStream.close();
    37. }
    38. } catch (IOException e) {
    39. e.printStackTrace();
    40. }
    41. }
    42. }
    43. }

    7.对象处理流

    先回忆下什么是序列化和反序列化

    1. import java.io.FileOutputStream;
    2. import java.io.IOException;
    3. import java.io.ObjectOutputStream;
    4. import java.io.Serializable;
    5. /**
    6. * @author:飞扬
    7. * @公众hao:程序员飞扬
    8. * @description: 序列化演示
    9. */
    10. public class ObjectOutputStream_ {
    11. public static void main(String[] args) {
    12. String path = "d:\\data.dat";
    13. try {
    14. ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
    15. oos.writeInt(100); //将整型值100写入流中
    16. oos.writeBoolean(true);
    17. oos.writeChar('a');
    18. oos.writeDouble(9.5);
    19. oos.writeObject(new Dog("旺财",3));
    20. oos.close();
    21. System.out.println("序列化输写文件完毕");
    22. } catch (IOException e) {
    23. e.printStackTrace();
    24. }
    25. }
    26. }
    27. class Dog implements Serializable {
    28. private String name;
    29. private Integer age;
    30. public Dog(String name, int age) {
    31. this.name = name;
    32. this.age = age;
    33. }
    34. @Override
    35. public String toString() {
    36. return "Dog{" +
    37. "name='" + name + '\'' +
    38. ", age=" + age +
    39. '}';
    40. }
    41. }

    1. import java.io.FileInputStream;
    2. import java.io.IOException;
    3. import java.io.ObjectInputStream;
    4. /**
    5. * @author:飞扬
    6. * @公众hao:程序员飞扬
    7. * @description:
    8. */
    9. public class ObjectInputStream_ {
    10. public static void main(String[] args) {
    11. String path = "d:\\data.dat";
    12. try {
    13. //创建流对象
    14. ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
    15. //读取,注意事项
    16. System.out.println(ois.readInt());
    17. System.out.println(ois.readBoolean());
    18. System.out.println(ois.readChar());
    19. System.out.println(ois.readDouble());
    20. System.out.println(ois.readObject());
    21. //关闭
    22. ois.close();
    23. } catch (IOException | ClassNotFoundException e) {
    24. e.printStackTrace();
    25. }
    26. }
    27. }

    对象处理流注意事项:

    8.标准输入输出流

    1. /**
    2. * @author:飞扬
    3. * @公众hao:程序员飞扬
    4. * @description:标准输入输出流
    5. */
    6. public class InputAndOutput {
    7. public static void main(String[] args) {
    8. //System类的 public final static InputStream in = null;
    9. //System.in 编译类型 InputStream
    10. //System.in 运行类型 BufferedInputStream
    11. //表示的是标准输入 键盘
    12. System.out.println(System.in.getClass());
    13. //System类的 public final static PrintStream out = null;
    14. //System.out 编译类型 PrintStream
    15. //System.out 运行类型 PrintStream
    16. //表示的是标准输出 显示器
    17. System.out.println(System.out.getClass());
    18. Scanner scanner = new Scanner(System.in);
    19. System.out.println("输入内容:");
    20. String next = scanner.next();
    21. System.out.println("next=" + next);
    22. }
    23. }

    class java.io.BufferedInputStream

    class java.io.PrintStream

    输入内容:

    你好,上海

    next=你好,上海

    转换流

    1)乱码问题引出转换流

    文件内容和编码如下:

    1. import java.io.BufferedReader;
    2. import java.io.FileReader;
    3. import java.io.IOException;
    4. /**
    5. * @author:飞扬
    6. * @公众hao:程序员飞扬
    7. * @description: 乱码问题引出转换流
    8. */
    9. public class CodeQuestion {
    10. public static void main(String[] args) throws IOException {
    11. String filePath = "d:\\hello.txt";
    12. BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
    13. String s = bufferedReader.readLine();
    14. System.out.println("读取到的内容:" + s);
    15. bufferedReader.close();
    16. }
    17. }

    运行输出:

    读取到的内容:aaa����

    发现出现了乱码。

    2)InputStreamReader&OutputStreamWriter

    1. /**
    2. * @author:飞扬
    3. * @公众hao:程序员飞扬
    4. * @description: 字节输入流(转换流)
    5. */
    6. public class InputStreamReader_ {
    7. public static void main(String[] args) throws IOException {
    8. String filePath = "d:\\hello.txt";
    9. InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath),"gbk");
    10. BufferedReader bufferedReader = new BufferedReader(isr);
    11. String s = bufferedReader.readLine();
    12. System.out.println("读取内容=" + s);
    13. }
    14. }

    输出:读取内容=aaa飞扬

    不再出现乱码

    1. import java.io.FileOutputStream;
    2. import java.io.IOException;
    3. import java.io.OutputStreamWriter;
    4. /**
    5. * @author:飞扬
    6. * @公众hao:程序员飞扬
    7. * @description: 直接输出流(转换流)
    8. */
    9. public class OutputStreamReader_ {
    10. public static void main(String[] args) throws IOException {
    11. String filePath = "d:\\feiyang.txt";
    12. OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filePath),"gbk");
    13. osw.write("hello,飞扬");
    14. osw.close();
    15. }
    16. }

    执行结果,生成指定编码的文件,不会乱码

    打印流PrintStream&PrintWriter

    1)PrintStream

    1. import java.io.IOException;
    2. import java.io.PrintStream;
    3. /**
    4. * @author:飞扬
    5. * @公众hao:程序员飞扬
    6. * @description: 打印流
    7. */
    8. public class PrintStream_ {
    9. public static void main(String[] args) throws IOException {
    10. PrintStream out = System.out;
    11. out.print("hello,tom");
    12. //也可以直接调用write()打印/输出
    13. out.write("hello,tom".getBytes());
    14. out.close();
    15. //可以去修改打印输出的位置/设备
    16. System.setOut(new PrintStream("d:\\f1.txt"));
    17. System.out.println("hello,峰峰,你可长点心吧");
    18. }
    19. }

    输出结果:

    2)PrintWriter

    1. /**
    2. * @author:飞扬
    3. * @公众hao:程序员飞扬
    4. * @description: 打印流PrintWriter
    5. */
    6. public class PrintWriter_ {
    7. public static void main(String[] args) throws IOException {
    8. PrintWriter printWriter = new PrintWriter(new FileWriter("d:\\abc.txt"));
    9. printWriter.print("你好,上海");
    10. printWriter.close(); //注意,必须关闭流才会写入
    11. }
    12. }

    输出结果:

    Properties类

    1)配置文件引出Properties

    新增文件:

    1. /**
    2. * @author:飞扬
    3. * @公众hao:程序员飞扬
    4. * @description:
    5. */
    6. public class Properties01 {
    7. public static void main(String[] args) throws IOException {
    8. BufferedReader br = new BufferedReader(new FileReader("src\\mysql.properties"));
    9. String line = "";
    10. while((line = br.readLine()) != null){
    11. String[] s = line.split("=");
    12. System.out.println(s[0]+"的值为"+s[1]);
    13. }
    14. }
    15. }

    打印输出:

    user的值为root

    password的值为123456

    url的值为jdbc:mysql://localhost:3306/testdb

    driver的值为com.mysql.jdbc.Driver

    结论:读写麻烦,不方便

    2)Properties类

    1. import java.io.FileReader;
    2. import java.io.IOException;
    3. import java.util.Properties;
    4. /**
    5. * @author:飞扬
    6. * @公众hao:程序员飞扬
    7. * @description:使用Properties类来读取文件
    8. */
    9. public class Properties02 {
    10. public static void main(String[] args) throws IOException {
    11. //创建Properties对象
    12. Properties properties = new Properties();
    13. //加载指定配置文件
    14. properties.load(new FileReader("src\\mysql.properties"));
    15. //把k-v显示控制台
    16. properties.list(System.out); //获取列表集合
    17. //根据key获取对应的值
    18. String url = properties.getProperty("url"); //获取指定属性
    19. System.out.println(url);
    20. }
    21. }

    打印输出:
    -- listing properties --

    user=root

    password=123456

    url=jdbc:mysql://localhost:3306/testdb

    driver=com.mysql.jdbc.Driver

    jdbc:mysql://localhost:3306/testdb

    1. import java.io.FileOutputStream;
    2. import java.io.IOException;
    3. import java.util.Properties;
    4. /**
    5. * @author:飞扬
    6. * @公众hao:程序员飞扬
    7. * @description:使用Properties类保存配置文件,修改配置文件
    8. */
    9. public class Properties03_ {
    10. public static void main(String[] args) throws IOException {
    11. Properties properties = new Properties();
    12. properties.setProperty("charset","utf-8");
    13. properties.setProperty("user","汤姆");//此处保存的是unicode编码
    14. properties.setProperty("pwd","666");
    15. properties.setProperty("pwd","888"); //修改属性值(没有该属性就新增,有就修改)
    16. properties.store(new FileOutputStream("src\\mysql03.properties"),null);//保存
    17. properties.store(new FileOutputStream("src\\mysql03.properties"),"这是一个注释");//保存(指定注释)
    18. System.out.println( "保存配置文件成功~");
    19. }
    20. }

    执行结果:

    案例

    1)目录文件操作

    1. import java.io.BufferedWriter;
    2. import java.io.File;
    3. import java.io.FileWriter;
    4. import java.io.IOException;
    5. /**
    6. * @author:飞扬
    7. * @公众hao:程序员飞扬
    8. * @description:
    9. */
    10. public class Homework01 {
    11. public static void main(String[] args) throws IOException {
    12. String direPath = "d:\\mytemp";
    13. File file = new File(direPath);
    14. if(file.exists()){
    15. System.out.println("目录已经存在");
    16. }else{
    17. boolean mkdir = file.mkdir();
    18. if(!mkdir){
    19. System.out.println("创建" + direPath +"目录失败");
    20. }else{
    21. System.out.println("创建" + direPath +"目录成功");
    22. }
    23. }
    24. String filePath = direPath + "\\homework01.txt";
    25. File file1 = new File(filePath);
    26. if(file1.exists()){
    27. System.out.println("文件" + filePath + "已存在");
    28. }else{
    29. if(file1.createNewFile()){
    30. System.out.println("创建" + filePath + "成功");
    31. BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath));
    32. bufferedWriter.write("我要学java");
    33. bufferedWriter.close();
    34. System.out.println("文件写入成功");
    35. }else{
    36. System.out.println(filePath + "创建失败");
    37. }
    38. }
    39. }
    40. }

    运行结果:

    2)读取文件操作

    1. import java.io.BufferedReader;
    2. import java.io.FileReader;
    3. import java.io.IOException;
    4. /**
    5. * @author:飞扬
    6. * @公众hao:程序员飞扬
    7. * @description: 读取文件操作
    8. */
    9. public class Homework02 {
    10. public static void main(String[] args) {
    11. String filePath = "D:\\homework02.txt";
    12. BufferedReader br = null;
    13. try {
    14. br = new BufferedReader(new FileReader(filePath));
    15. String line = "";
    16. int num = 0;
    17. while ((line = br.readLine()) != null) {
    18. System.out.println(++num + line);
    19. }
    20. } catch (IOException e) {
    21. e.printStackTrace();
    22. }finally {
    23. if(br !=null){
    24. try {
    25. br.close();
    26. } catch (IOException e) {
    27. e.printStackTrace();
    28. }
    29. }
    30. }
    31. }
    32. }

    运行结果:

    3)Properties&序列化

    1. package com.feiyang.basic15_file;
    2. import org.junit.jupiter.api.Test;
    3. import java.io.FileInputStream;
    4. import java.io.FileNotFoundException;
    5. import java.io.FileOutputStream;
    6. import java.io.FileReader;
    7. import java.io.IOException;
    8. import java.io.ObjectInputStream;
    9. import java.io.ObjectOutputStream;
    10. import java.io.Serializable;
    11. import java.util.Properties;
    12. /**
    13. * @author:飞扬
    14. * @公众hao:程序员飞扬
    15. * @description: Properties读取文件与序列化
    16. */
    17. public class Homework03 {
    18. public static void main(String[] args) throws IOException {
    19. String filePath = "src\\dog.properties";
    20. Properties properties = new Properties();
    21. properties.load(new FileReader(filePath));
    22. String name = properties.getProperty("name") + "";
    23. int age = Integer.parseInt(properties.getProperty("age") + "");
    24. String color = properties.getProperty("color") + "";
    25. Dog dog = new Dog(name, age, color);
    26. System.out.println(dog);
    27. //序列化对象
    28. String serFilePath = "d:\\dog.dat";
    29. ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(serFilePath));
    30. oos.writeObject(dog);
    31. oos.close();
    32. System.out.println("dog序列化完成");
    33. }
    34. //反序列化
    35. @Test
    36. public void m1() throws IOException, ClassNotFoundException {
    37. String serFilePath = "d:\\dog.dat";
    38. ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(serFilePath));
    39. Dog dog = (Dog)objectInputStream.readObject();
    40. System.out.println(dog);
    41. }
    42. }
    43. class Dog implements Serializable {
    44. private String name;
    45. private int age;
    46. private String color;
    47. public Dog() {
    48. }
    49. public Dog(String name, int age, String color) {
    50. this.name = name;
    51. this.age = age;
    52. this.color = color;
    53. }
    54. @Override
    55. public String toString() {
    56. return "Dog{" +
    57. "name='" + name + '\'' +
    58. ", age=" + age +
    59. ", color='" + color + '\'' +
    60. '}';
    61. }
    62. }

  • 相关阅读:
    WMS系统功能分析-入库
    HTTP协议:最常用的应用层
    python专属的Remote Produce Call框架:rpyc
    我们为何看好投资 DAO?
    关注云栖大会的感受:从工业大脑到全面AI时代的进化
    PLC网关用途、解决问题以及如何实现高效、稳定通信分享
    Nginx反向代理服务器解决负责均衡问题
    Go 语言快速开发入门(基础语法详解,第一节)
    transition过渡
    Ardupilot — AP_OpticalFlow代码梳理
  • 原文地址:https://blog.csdn.net/lu_xin5056/article/details/126834014