• Java的I/O框架


    目录

    一、流的概念

    二、流的分类

    1.按方向

    2.按单位:

    3.按功能:

    三、字节流

    1、文件字节流

    (1) FileInputStream:

    (2)FileOutputStream:

    (3)完成复制文件

     2、字节缓冲流

    (1)BufferedInputStream:

    (2)BufferedOutputStream:

    3、对象流

    (1)序列化:

    (2)反序列化:

    四、字符编码

    五、字符流

     1. 文件字符流

    (1)FileReader

    (2)FileWriter

     (3)完成复制文件

    2.字符缓冲流

    (1)BufferedReader

    (2)BufferedWriter

    3.打印流 ——PrintWriter

    六、转换流

    1. InputStreamReader

    2.OutputStreamWriter

    七、File类

    1.分隔符

    2.文件操作

    3.文件夹操作

    4. FileFilter 接口

     

    5.递归遍历和递归删除

    附加:Properties(属性集合)

    1.特点:

    2.使用


    一、流的概念

    概念:内存与存储设备之间传输数据的通道。

    数据借助流传输。

    二、流的分类

    1.按方向

    输入流(Input):将<存储设备>中的内容读入到<内存>中。

    输出流(Output):将<内存>中的内容写入到<存储设备>中。

    2.按单位:

    字节流:以字节为单位,可以读写所有的数据。

    字符流:以字符为单位,可以读写文本数据。

    3.按功能:

    节点流:具有实际传输数据的读写功能。

    过滤流:在节点流的基础之上增强功能。

    三、字节流

    字节流的父类(抽象类)

    InputStream:字节输入流

    OutputStream:字节输出流

    1、文件字节流

    (1) FileInputStream:

    public int read(byte[] b)

    从流中读取多个字节,将读到内容存入b数组,返回实际读到的字节数,如果达到文件的尾部,则返回-1。

    (2)FileOutputStream:

    public void write(byte[] b)

    一次写多个字节,将b数组中所有字节,写入输出流。

    (3)完成复制文件

    使用文件字节流实现文件的复制,先读取(FileInoutStream)再写入(FileOutputStream)。

     2、字节缓冲流

    缓冲流:BufferedInputStream / BufferedOutputStream

    (1)提高IO效率,减少访问磁盘的次数;

    (2)数据存储在缓冲区中,flush是将缓冲区的内容写入文件中。

    (1)BufferedInputStream:

    1. import java.io.BufferedInputStream;
    2. import java.io.FileInputStream;
    3. /**
    4. * 使用字节缓冲流读取
    5. * BufferedInputStream
    6. */
    7. public class Demo04 {
    8. public static void main(String[] args)throws Exception {
    9. //1.创建BufferedInputStream
    10. FileInputStream file = new FileInputStream("d:\\aaa.txt");
    11. BufferedInputStream bufferedInputStream = new BufferedInputStream(file);
    12. //2.读取
    13. //方法一:
    14. // int data = 0;
    15. // while((data=bufferedInputStream.read())!=-1){
    16. // System.out.println((char) data);
    17. // }
    18. //方法二:
    19. byte[] buf = new byte[1024];
    20. int count = 0;
    21. while((count=bufferedInputStream.read(buf))!=-1){
    22. System.out.println(new String(buf,0,count));
    23. }
    24. //3.关闭
    25. bufferedInputStream.close();
    26. }
    27. }

    (2)BufferedOutputStream

    3、对象流

    对象流:ObjectOutputStream / ObjectInputStream

    (1)增强了缓冲区功能

    (2)增强了读写8种基本数据类型和字符串功能

    (3)增强了读写对象的功能:

    readObject()    从流中读取一个对象

    writeObiect(Object obj)    向流中写入一个对象

    使用流传输对象的过程称为序列化、反序列化

    (1)序列化:

    (2)反序列化:

    注意事项:

    1. 序列化类必须实现Serializable接口;

    2. 序列化类中的对象属性也要实现Serializable接口;

    3. 写序列化版本号ID,可以保证序列化和反序列化的类是同一个类;

     4. 使用 transient(瞬间的) 修饰属性,这个属性不能序列化;

    5. 静态属性也不能序列化;

    6. 序列化多个对象,放在同个集合里,一次序列化 / 反序列化。

     

    四、字符编码

    ISO-8859-1    收录除ASCII外,还包括西欧、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。

    UTF-8        针对Unicode码表的可变长度字符编码。

    GB2312     简体中文

    GBK           简体中文、扩充

    BIG5          台湾,繁体中文

    当编码方式和解码方式不一致时,就会出现乱码。

    五、字符流

    字符流的父类(抽象类)

    Reader:字符输入流

    Writer:字符输出流

     1. 文件字符流

    (1)FileReader

    从流中读取多个字符,将读到内容存入c数组,返回实际读到的字符数,如果达到文件的尾部,则返回-1。

    pubic  int read (char[] c)

    (2)FileWriter

    一次写多个字符,将b数组中所有字符,写入输出流。

    public void write(String str)

     (3)完成复制文件

    2.字符缓冲流

     缓冲流:BufferedReader / BufferedWriter

    高效书写

    支持输入换行符

    可一次写一行、读一行。

    (1)BufferedReader

    1. import java.io.BufferedReader;
    2. import java.io.FileReader;
    3. /**
    4. * 使用字符缓冲流读取文件
    5. */
    6. public class Demo4 {
    7. public static void main(String[] args) throws Exception{
    8. //1.创建缓冲流
    9. FileReader fileReader = new FileReader("d:\\bbb.txt");
    10. BufferedReader bufferedReader = new BufferedReader(fileReader);
    11. //2.读取
    12. //2.1方法一:整个读取
    13. // char[] buf = new char[1024];
    14. // int count = 0;
    15. // while((count=bufferedReader.read(buf))!=-1){
    16. // System.out.println(new String(buf,0,count));
    17. // }
    18. //2.2方法二:一行一行的读取
    19. String line= null;
    20. while((line=bufferedReader.readLine())!=null){
    21. System.out.println(line);
    22. }
    23. //3.关闭
    24. bufferedReader.close();
    25. }
    26. }

    (2)BufferedWriter

    1. import java.io.BufferedWriter;
    2. import java.io.FileWriter;
    3. /**
    4. * BufferedWriter的使用
    5. */
    6. public class Demo5 {
    7. public static void main(String[] args)throws Exception {
    8. //1.创建BufferedWriter对象
    9. FileWriter fileWriter = new FileWriter("d:\\bbb.txt");
    10. BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
    11. //2.写入
    12. for (int i = 0; i < 10; i++) {
    13. bufferedWriter.write("好好学习java\n");
    14. bufferedWriter.newLine(); //写入一个换行符,相当于\n
    15. bufferedWriter.flush();
    16. }
    17. //3.关闭
    18. bufferedWriter.close();
    19. System.out.println("执行完毕");
    20. }
    21. }

    3.打印流 ——PrintWriter

    封装了print() / println()方法,支持写入后换行。

    支持数据原样打印。

    1. import java.io.PrintWriter;
    2. /**
    3. * PrintWriter的使用
    4. */
    5. public class Demo6 {
    6. public static void main(String[] args) throws Exception{
    7. //1.创建打印流
    8. PrintWriter printWriter = new PrintWriter("d:\\print.txt");
    9. //2.打印
    10. printWriter.println(97);
    11. printWriter.println(true);
    12. printWriter.println('2');
    13. printWriter.println('a');
    14. printWriter.println(3.13);
    15. //3.关闭
    16. printWriter.close();
    17. System.out.println("执行完");
    18. }
    19. }

    六、转换流

    桥转换流:InputStreamReader / OutputStreamWriter

    可将字节流转换为字符流。

    可设置字符的编码方式。

    1. InputStreamReader

    2.OutputStreamWriter

    七、File类

    概念:代表物理盘符中的一个文件或文件夹。

    1.分隔符

    2.文件操作

    1. public class Demo10 {
    2. public static void main(String[] args) throws IOException, InterruptedException {
    3. fileOpe();
    4. }
    5. public static void fileOpe() throws IOException, InterruptedException {
    6. //1.创建文件
    7. File file = new File("d:\\file.txt");
    8. if (!file.exists()){
    9. boolean b = file.createNewFile();
    10. System.out.println("创建结果:"+b);
    11. }
    12. //2.删除文件
    13. //2.1直接删除
    14. System.out.println("删除结果:"+file.delete());
    15. //2.2使用jvm退出时删除
    16. file.deleteOnExit();
    17. Thread.sleep(5000); //休眠结束,就删除
    18. //3.获取文件信息
    19. System.out.println("获取文件的绝对路径:"+ file.getAbsolutePath());
    20. System.out.println("获取路径:"+file.getPath());
    21. System.out.println("获取文件名称:"+file.getName());
    22. System.out.println("获取父目录:"+file.getParent());
    23. System.out.println("获取文件的长度:"+file.length());
    24. System.out.println("获取文件的创建时间:"+new Date(file.lastModified()).toLocaleString());
    25. //4.判断
    26. System.out.println("是否可写:"+file.canWrite());
    27. System.out.println("是否是文件:"+file.isFile());
    28. System.out.println("是否隐藏:"+file.isHidden());
    29. }
    30. }

    3.文件夹操作

    1. public class Demo10 {
    2. public static void main(String[] args) throws IOException, InterruptedException {
    3. directoryOpe();
    4. }
    5. public static void directoryOpe() throws IOException, InterruptedException {
    6. //1.创建文件夹
    7. File dir = new File("d:\\aa\\bb\\cc");
    8. if (!dir.exists()){
    9. dir.mkdir(); //只能创建单级目录
    10. dir.mkdirs(); //创建多级目录
    11. }
    12. //2.删除文件夹
    13. //2.1直接删除 只能删除空目录
    14. System.out.println("删除结果:"+dir.delete()); //只删除最后一个,并且是空目录
    15. //2.2使用jvm退出时删除
    16. dir.deleteOnExit();
    17. Thread.sleep(5000); //休眠结束,就删除
    18. //3.获取文件夹信息
    19. System.out.println("获取文件的绝对路径:"+ dir.getAbsolutePath());
    20. System.out.println("获取路径:"+dir.getPath());
    21. System.out.println("获取文件夹名称:"+dir.getName()); //最底层的文件名称
    22. System.out.println("获取父目录:"+dir.getParent());
    23. System.out.println("获取文件的创建时间:"+new Date(dir.lastModified()).toLocaleString());
    24. //4.判断
    25. System.out.println("是否是文夹件:"+dir.isFile());
    26. System.out.println("是否隐藏:"+dir.isHidden());
    27. //5.遍历文件夹
    28. File file = new File("d:\\aa");
    29. String[] list = file.list();
    30. for (String string : list){
    31. System.out.println(string);
    32. }
    33. }
    34. }

    4. FileFilter 接口

    1. public interface FileFilter
    2. boolean accept (File pathname)

    当调用File类中的ListFiles()方法时,支持传入FileFilter接口实现类,对获取文件进行过滤,只有满足条件的文件才能出现在listFiles()的返回值中。

    5.递归遍历和递归删除

    1. public class Demo11 {
    2. public static void main(String[] args) {
    3. listDir(new File("c:\\MyJavaStudy"));
    4. deleteDir(new File("c:\\MyJavaStudy"));
    5. }
    6. //递归遍历文件夹
    7. public static void listDir(File dir){
    8. File[] files = dir.listFiles();
    9. System.out.println(dir.getAbsolutePath());
    10. if (files!=null&&files.length>0){
    11. for (File file:files){
    12. if (file.isDirectory()){
    13. listDir(file); //递归
    14. }else {
    15. System.out.println(file.getAbsolutePath());
    16. }
    17. }
    18. }
    19. }
    20. //递归删除文件夹
    21. public static void deleteDir(File dir){
    22. File[] files = dir.listFiles();
    23. System.out.println(dir.getAbsolutePath());
    24. if (files!=null&&files.length>0){
    25. for (File file:files){
    26. if (file.isDirectory()){
    27. deleteDir(file); //递归
    28. }else {
    29. //删除文件
    30. System.out.println(file.getAbsolutePath()+"删除:"+file.delete());
    31. }
    32. }
    33. }
    34. //删除空文件夹
    35. System.out.println(dir.getAbsolutePath()+"删除:"+dir.delete());
    36. }
    37. }

    附加:Properties(属性集合)

    1.特点:

    1. 存储属性名和属性值

    2.属性名和属性值都是字符串类型

    3.没有泛型

    4.和流有关

    2.使用

    1. public class Demo08 {
    2. public static void main(String[] args) throws IOException {
    3. //1.创建集合
    4. Properties properties = new Properties();
    5. //2.添加元素
    6. properties.setProperty("username","zhangsan");
    7. properties.setProperty("age","20");
    8. System.out.println(properties.toString());
    9. //3.遍历
    10. //3.1 keySet
    11. //3.2 entrySet
    12. //3.3 StringPropertyNames()方法
    13. Set strings = properties.stringPropertyNames();
    14. for (String pro : strings){
    15. System.out.println(pro+"----"+properties.getProperty(pro));
    16. }
    17. //4.和流有关的方法
    18. // 4.1 list方法 打印列表
    19. PrintWriter pw = new PrintWriter("d:\\print.txt");
    20. properties.list(pw);
    21. pw.close();
    22. //4.2 store方法 保存
    23. FileOutputStream fileOutputStream = new FileOutputStream("d:\\store.properties");
    24. properties.store(fileOutputStream,"注释");
    25. fileOutputStream.close();
    26. //4.3 load方法 加载
    27. Properties properties1 = new Properties();
    28. FileInputStream fileInputStream = new FileInputStream("d:\\store.properties");
    29. properties1.load(fileInputStream);
    30. fileInputStream.close();
    31. System.out.println(properties1.toString());
    32. }
    33. }



    重在理解!

    感谢ლ(°◕‵ƹ′◕ლ)!!!

  • 相关阅读:
    【图像边缘检测】基于matlab自适应阈值的八方向和四方向sobel图像边缘检测【含Matlab源码 2058期】
    wps和office可以同时装吗?
    USB MSC类存储设备
    Java——》线程的打断(停止正在运行的线程)
    总结vue 需要掌握的知识点
    马斯洛的动机与人格、需求层次理论
    【问题总结】解方程的自由变量怎么选?【记忆向】
    嵌入式必学,硬件资源接口详解——基于ARM AM335X开发板 (上)
    MacBook 往服务器上传、下载文件的几种操作
    互联网最全cka真题解析-2022.9.9
  • 原文地址:https://blog.csdn.net/yao_yaoya/article/details/128108522