IO流process3

1、IO流(JDK API 1.6.0中文版)

I : intput输入 O : output输出

  • 流:内存与存储设备之间传输数据的通道

  • 流的分类:

    1. 按方向:输入流——将<内存设备>中的内容读入到<内存>中

    ​ 输出流——将<内存>中的内容读入到<内存内存设备>中

    1. 按单位:字节流——以字节为单位,可以读写所有数据

      ​ 字符流——以字符为单位,只能读写文本数据

    2. 按功能:节点流——具有实际传输数据的读写能力

      ​ 过滤流——在节点流基础上的增强功能

2、字节流(抽象类)

  • 字节流的父类(抽象类):

    抽象类不能直接实例化

    1. InputStream:字节输入流
    2. OutputStream:字节输出流

2.1FileInputStream(文件字节流)的使用

  • FileInputStream:

    public int read(byte[] b) 从流中读取多个字节,将读到的内容存入b数组,返回实际读到的字节数;如果达到文件底部,则返回-1

    1. 创建FileInputStream,并指定文件路径(提前抛出异常-查找不到文件)

    2. 读取文件read();

      2.1 一次读取一个字节,采用while循环(注意读取的是字节,具体内容需要强制转换

      2.2一次读取多个字节(通过数组)-使用循环实现更简介

    3. 关闭close();IO流结束一定要关闭,节省空间

package byteStream;
public class Demo1

2.2FileOutputStream的使用

  • FileOutputStream:

​ public void write(byte[] b) 一次写多个字节,将b数组中的所有字节,写入输出流

  1. 创建FileInputStream,并指定文件路径(提前抛出异常-查找不到文件)

  2. 写入文件write();

    2.1 一次读取一个字节

    2.2一次读取多个字节 getBytes();如果不覆盖式添加,前面要加true

  3. 关闭

package byteStream;
public class Demo2 

2.3字节流复制文件

  1. 创建流

    1.1文件字节输入流

    1.2文件字节输出流

  2. 一边读,一边写

  3. 关闭

package byteStream;
public class Demo3

2.4BufferedFile(In)OutputStream(字节缓冲流)的使用

  • 缓冲流 BufferedFileInputStream/BufferedFileOutputStream
  • 特点
    1. 提高IO效率,减少访问磁盘的次数
    2. 数据存储在缓冲区内,flush是将缓冲区的内容写入文件中,也可以直接close

使用BufferedFileInputStream输出文件

  1. 创建 BufferedFileInputStream

  2. 读取(有所不同)

    也可以自己创建一个缓冲区

  3. 关闭

package byteStream;
public class Demo4

注意——参数类型不同
System.out.print((char)data);
System.out.println(new String(buf,0,count));

使用字节缓冲流BufferedFileOutputStream写入文件

  1. 创建 BufferedFileOutputStream
  2. 写入文件(先写入缓冲区)用flush();//写一次刷新一次就写入了
  3. 关闭
package byteStream;
public class Demo5 

2.5Object(In)OutpuItStream(对象流)的使用

ObjectInputStream/ObjectOutpuItStream

  • 增强了缓冲区功能

  • 增强了读写8种基本类型和字符串功能

  • 增强了读写对象的功能——使用流传输对象的过程称为序列化和反序列化

    read()object();从流中读取一个对象--反序列化

    writeObject(Object obj);向流中写入一个对象--序列化

  • 注意事项:

    1. 实现(反)序列化类,必须实现Serializable接口

    2. 实现(反)序列化类,对象属性(class)也要实现Serializable接口

    3. 序列化版本ID,可以保证序列化和反序列化的类是同一个类(不要去改,默认为同一个类(报错就改成一样的))

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

    5. 静态属性(static)也不能序列化

    6. 序列化多个对象

      在序列化中加Student,在反序列化中加s2

      也可以使用ArrayList集合,序列化集合就可以了

实现序列化(写入流):ObjectOutpuItStream

  1. 创建对象流

  2. 实现序列化

    类必须实现一个接口Serializable(在Student中)

  3. 关闭

package byteStream;
public class Demo6

实现反序列化(输出流):ObjectInputStream

  1. 创建对象流

  2. 实现反序列化

    类必须实现一个接口Serializable(在Student中)

    原文件里没有就别读,会抛出异常

  3. 关闭

package byteStream;
public class Demo7

//原文件里没有就别读,会抛出异常 Student s2=(Student)ois.readObject();

3、字符流

常见的字符编码(当编码方式和读码方式不一致时,会出现乱码):

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

  • UTF-8 针对Unicode码表的可变长字符编码(国际编码)

  • GB2312 简体中文

  • GBK 简体中文、扩充

  • BIG5 台湾-繁体中文

    通过记事本(文件另存为)看文件是什么编码(不能用字节流来读取中文)

    1. 创建FileInputStream对象
    2. 读取
    3. 关闭
    package characterStream;
    public class Demo1 
    

3.1字符流(抽象类)

字符流的父类(抽象类):

  • Reader:字符输入流
  • Writer: 字符输出流

3.2FileReader(Writer)的使用

  • FileReader:public int read(char[] c)

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

  • FileWriter: public void write(String str)

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

    字符流可以读中文

FileReader的使用

  1. 创建FileReader 文件字符输入流

  2. 读取

    2.1单个字符读取

    2.2多个字符读取

  3. 关闭

package characterStream;
public class Demo2 

FileWriter的使用

  1. 创建FileWriter对象

  2. 写入

    记着写入要刷新一下flush

  3. 关闭

package characterStream;
public class Demo3 

3.3字符流复制文件

FileReader(Writer)只能复制文本文件,不能复制图片、声音和视频等二进制文件

  1. 创建FileReader(Writer)
  2. 读写
  3. 关闭
package characterStream;
public class Demo4

3.3BufferedReader(Writter)(字符缓冲流)的使用

  • 高效读写

  • 支持输入换行符

  • 可一次写一行、读一行

    BufferedReader的使用

  1. 创建缓冲流

  2. 读取

    2.1字符串读取
    2.2一行一行的读取 readLine

  3. 关闭

package characterStream;
public class Demo5

BufferedWritter的使用

  1. 创建缓冲流

  2. 写入

    bw.newLine();//写入一个换行

  3. 关闭

package characterStream;
public class Demo6

4、PrintWriter(打印流)

  • 支持写入后换行
  • 支持数据原样打印
    1. 创建一个打印流
    2. 打印println方法
    3. 关闭
package printStream;
public class Demo1

5、(桥)转换流

(桥)转换流 :InputStreamReader/OutputStreamWriter(字节流和字符流的抽象类和在了一起)

  • 可将字节流准换为字符流

  • 可设置字符的编码方式

  • 的字符编码(当编码方式和读码方式不一致时,会出现乱码):

    • ISO-8859-1 收录除ASCII外,还包括西欧、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号
    • UTF-8 针对Unicode码表的可变长字符编码(国际编码)
    • GB2312 简体中文
    • GBK 简体中文、扩充
    • BIG5 台湾-繁体中文
    1. 创建InputStreamReader,并指定编码方式
      使用的编码要和文件编码方式一致(或者将文件另存为更改编码格式)
    2. 读取文件
    3. 关闭
package reverseStream;
public class Demo1 
  1. OutputStreamWriter写入文件,并指定编码
  2. 写入
  3. 关闭
package printStream;
public class Demo2

6、File类

对文件进行操作

file类

6.1 file类的使用

  • 分隔符

    System.out.println("路径分隔符"+ File.pathSeparator);//;
    System.out.println("名称分隔符"+File.separator);//\
    
  • 文件操作

    1. 创建文件creatNewFile

      判断是否创建成功

      File file=new File("D:\\Java-Code\\Process\\Process3\\e.txt");
      boolean b=file.createNewFile();//判断是否创建成功
      System.out.println("创建结果:"+b);
      
    2. 删除文件

      2.1直接删除

      2.2使用jvm退出时删除deleteOnExit

      file.deleteOnExit();
      Thread.sleep(5000);//休眠5秒钟
      
    3. 获取文件信息

      System.out.println("获取文件的绝对路径"+file.getAbsolutePath());
      System.out.println("获取路径"+file.getPath());//写的什么路径就是什么路径
      System.out.println("获取名称"+file.getName());
      System.out.println("获取父目录"+file.getParent());
      System.out.println("获取文件长度"+file.length());
      System.out.println("文件创建时间"+new Date(file.lastModified()).toLocaleString());
      
    4. 判断

      System.out.println("是否可写"+file.canExecute());
      System.out.println("是否为文件"+file.isFile());
      System.out.println("是否隐藏"+file.isHidden());
      
  • 文件夹操作(与文件操作类似)

    1. 创建文件夹

    2. 删除文件夹

      2.1直接删除-删除最底层目录(且最底层目录必须为空)

      System.out.println("删除结果:"+dir.delete());//删除最底层目录(且最底层目录必须为空)
      

      2.2使用jvm退出时删除deleteOnExit-System.out.println("删除结果:"+dir.delete());//删除最底层目录(且最底层目录必须为空)

    3. 获取文件夹信息

      文件夹没有长度

    4. 判断

      文件夹没有是否可写

    5. 遍历文件夹

      File dir2 = new File("D:\\Java-Code\\Process\\Process3");
      String[] files = dir2.list();
      System.out.println("==================");
      for(String string : files){
          System.out.println(string);
      }
      
package fileManage;
public class Demo1

6.2FileFileter接口

public interface FileFilter

  • boolean accept(File pathname)

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

    File[] files1 = dir2.listFiles(new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            if (pathname.getName().endsWith(".jpg")) {
                return true;
            }
            return false;
        }
    });
    for(File file : files1) {
        System.out.println(file.getName());
    }
    
package fileManage;
public class Demo1

6.3递归遍历和递归删除(要用再学)

posted @ 2024-08-10 16:03  37201  阅读(26)  评论(0)    收藏  举报