java_IO流

Java—IO流目录

1、文件

概念

  • 什么是文件

    • 文件对我们并不陌生文件是保存数据的地方比如大家经常使用的Word文档,txt文件excel文件…都是文件。它既可以保存一张图片也可以保持视频声音…
  • 文件流

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

      image-20220107035511547

    • 流: 数据在数据源(文件)和程序(内存)之间经历的路径

      • 输入流:数据从数据源(文件)到程序(内存)的路径
      • 输岀流:数据从程序(内存)到数据源(文件)的路径

常用操作

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

    • 相关方法

      new File( String pathname)//很据路径构建一个Fle对象
      new File( File parent, String child)//根据父目录文件+子路径构建
      new File( String parent, String child)//根据父目录+子路径构建
      
    • image-20220107040208511

  • 获取文件相关信息

    •     File file = new File("e:\\test.txt");
          file.getName;			//文件名
          file.getAbsolutePath;    //文件绝对路径
          file.getParent;			//文件父级目录
          file.length;			//文件大小(字节)
          file.exists;			//文件是否存在
          file.isFile;			//是否为文件
          file.isDirectory;		//是否为目录
      

      image-20220107041130301

  • 目录操作和文件删除

    • mkdir创建一级目录、mkdirs创建多级目录、delete删除空目录或文件

      image-20220107042247008

2、IO流原理及流的分类

IO流原理:
  1. I/O是 :Input/Output的缩写,I/O技术是非常实用的技术,用于处理数据传输。
    如读/写文件,网络通讯等
  2. Java程序中,对于数据的输入/输出操作以"流( stream)"的方式进行。
  3. Java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过方
    法输入或输出数据
  4. 输入 input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中
  5. 输出 output:将程序(内存)数据输出到磁盘、光盘等存储设备中

image-20220107043334278

IO流分类:
  • **按操作数据单位不同分为:**字节流(8bit),字符流(按字符)
  • **按数据流的流向不同分为:**输入流,输出流
  • **按流的角色的不同分为:**节点流,处理流/包装流
(抽象基类)字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter

uTools_1641502253979

3、节点流和处理流

image-20220107070118094

  1. 节点流可以从一个特定的数据源读写数据,如 FileReaderFileWriter[源码]

    image-20220107065749285

  2. 处理流(也叫包装流)是“连接”在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能

    ​ 如 Buffered ReaderBufferedWriter[源码]

    image-20220107065946447

  3. 节点流和处理流的区别和联系

    1. 节点流是底层流/低级流直接跟数据源相接。
    2. 处理流包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。[源码理解]
      处理流(也叫包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连[模拟修饰器设计模式]
  4. 处理流的功能主要体现在以下两个方面:

    1. 性能的提高:主要以增加缓冲的方式来提高输入输岀的效率
    2. 操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使
      用更加灵活方便

4、输入流

InputStream

InputStream抽象类是所有类字节输入流的超类

image-20220108041032546

image-20220107050840089

FileInputStream(文件输入流)

image-20220107051239121

  • 构造方法

    • /*通过打开与实际文件的连接创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。*/
      FileInputStream(File file)
      /*创建 FileInputStream通过使用文件描述符 fdObj ,其表示在文件系统中的现有连接到一个实际的文件。*/
      FileInputStream(FileDescriptor fdObj)
      /*通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。*/
      FileInputStream(String name)
      
  • 读取read方法

    @Test
        public void readFile01() {
            //文件路径
            String filePath = "C:\\Users\\lying\\Desktop\\hi.txt";
            FileInputStream fileInputStream = null;
            int read =0;
            try {
                fileInputStream = new FileInputStream(filePath);
                //一次读一个字节 读完返回-1
                while ((read = fileInputStream.read()) != -1){
                    System.out.println((char) read);
                }
            }catch (IOException e){
                e.printStackTrace();
            }finally {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
      
        }
        @Test
        public void readFile02() {
            //文件路径
            String filePath = "C:\\Users\\lying\\Desktop\\hi.txt";
            FileInputStream fileInputStream = null;
            int len =0;
            //一次读1024个字节
            byte[] buf = new byte[1024];
            try {
                fileInputStream = new FileInputStream(filePath);
                //读完返回-1
                while ((len=fileInputStream.read(buf)) != -1){
                    System.out.println(new String(buf,0,len));
                }
            }catch (IOException e){
                e.printStackTrace();
            }finally {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
      
        }
    

BufferedInputStream(缓冲字节输入流)

  • 构造

    • BufferedInputStream(InputStream in)
      //创建一个 BufferedInputStream并保存其参数,输入流 in ,供以后使用。
      BufferedInputStream(InputStream in, int size)
      //创建 BufferedInputStream具有指定缓冲区大小,并保存其参数,输入流 in ,供以后使用。
      
  • 方法

    返回值方法名说明
    intavailable()返回从该输入流中可以读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。
    voidclose()关闭此输入流并释放与流相关联的任何系统资源。
    voidmark(int readlimit)见的总承包 mark的方法 InputStream 。
    booleanmarkSupported()测试这个输入流是否支持 mark和 reset方法。
    intread()见 read法 InputStream的一般合同。
    intread(byte[] b, int off, int len)从给定的偏移开始,将字节输入流中的字节读入指定的字节数组。
    voidreset()见 reset法 InputStream的一般合同。
    longskip(long n)见 skip法 InputStream的一般合同。

ObjectInputStream(对象字节输入流)

  • 构造

    ObjectInputStream()
    //为完全重新实现ObjectInputStream的子类提供一种方法,不必分配刚刚被ObjectInputStream实现使用的私有数据。
    ObjectInputStream(InputStream in)
    //创建从指定的InputStream读取的ObjectInputStream。
    
  • 方法

Reader

image-20220108041538019

FileReader

image-20220107065002489

  • 构造方法

    • new FileReader(File/String);
      
  • 方法

    • read:每次读取单个字符,返回该字符,如果到文件末尾返回-1
    • read(char[]):批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾返回-1
      相关API:
      • new String(char):将char转换成 String
      • new String(char[],off,len):将char的指定部分转换成 String

BufferedReader

  • 构造

    BufferedReader(Reader in)
    //创建使用默认大小的输入缓冲区的缓冲字符输入流。
    BufferedReader(Reader in, int sz)
    //创建使用指定大小的输入缓冲区的缓冲字符输入流。
    
  • 方法

    返回值方法名说明
    voidclose()关闭流并释放与之相关联的任何系统资源。
    Streamlines()返回一个 Stream ,其元素是从这个 BufferedReader读取的行。
    voidmark(int readAheadLimit)标记流中的当前位置。
    booleanmarkSupported()告诉这个流是否支持mark()操作。
    intread()读一个字符
    intread(char[] cbuf, int off, int len)将字符读入数组的一部分。
    StringreadLine()读一行文字。
    booleanready()告诉这个流是否准备好被读取。
    voidreset()将流重置为最近的标记。
    longskip(long n)跳过字符

InputStreamReader(转换流)

  • 构造

    InputStreamReader(InputStream in)
    //创建一个使用默认字符集的InputStreamReader。
    InputStreamReader(InputStream in, Charset cs)
    //创建一个使用给定字符集的InputStreamReader。
    InputStreamReader(InputStream in, CharsetDecoder dec)
    //创建一个使用给定字符集解码器的InputStreamReader。
    InputStreamReader(InputStream in, String charsetName)
    //创建一个使用命名字符集的InputStreamReader。
    
  • 方法

    返回值方法名说明
    voidclose()关闭流并释放与之相关联的任何系统资源。
    StringgetEncoding()返回此流使用的字符编码的名称。
    intread()读一个字符
    intread(char[] cbuf, int offset, int length)将字符读入数组的一部分。
    booleanready()告诉这个流是否准备好被读取。

5、输出流

OutputStream

image-20220108042255484

FileOutputStream(文件输出流)

image-20220107060135585

  • 构造方法

    FileOutputStream(File file)
    //创建文件输出流以写入由指定的 File对象表示的文件。
    FileOutputStream(File file, boolean append)
    //创建文件输出流以写入由指定的 File对象表示的文件。
    FileOutputStream(FileDescriptor fdObj)
    //创建文件输出流以写入指定的文件描述符,表示与文件系统中实际文件的现有连接。
    FileOutputStream(String name)
    //创建文件输出流以指定的名称写入文件。
    FileOutputStream(String name, boolean append)
    //创建文件输出流以指定的名称写入文件。
    
  • 写入write方法

    @Test
        public void writeFile(){
            FileOutputStream fos = null;
            String filePath = "C:\\Users\\lying\\Desktop\\hii.txt";
      
            try {
                fos = new FileOutputStream(filePath);
                //如果文件不存在将会先自动创建,再写入,存在则直接写入 一次写入一个字节
                //当写入内容时会覆盖之前内容
                fos.write('w');
                System.out.println("写入完成");
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        @Test
        public void writeFile2(){
            FileOutputStream fos = null;
            String filePath = "C:\\Users\\lying\\Desktop\\hii.txt";
            String temp = "2021年1月1日,民法典正式实施。一年来," +
                    "全国各地人民法院准确适用民法典,依法公正裁判一系列民事案件," +
                    "内容涉及物权、人格权、侵权责任等社会生活的方方面面。" +
                    "这些案件裁判不仅对案件当事人的生活产生具体影响," +
                    "而且为社会公众的各类民事活动明确了规范指引、树立了行为指向,产生了积极的导向作用。";
            try {
                fos = new FileOutputStream(filePath);
                //如果文件不存在将会先自动创建,再写入,存在则直接写入 一次写入一个字节数组
                fos.write(temp.getBytes(StandardCharsets.UTF_8));
                System.out.println("写入完成");
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    

BufferedOutputStream(缓冲字节输出流)

  • 构造

    BufferedOutputStream(OutputStream out)
    //创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
    BufferedOutputStream(OutputStream out, int size)
    //创建一个新的缓冲输出流,以便以指定的缓冲区大小将数据写入指定的底层输出流。
    
  • 方法

    返回值方法名说明
    voidflush()刷新缓冲输出流。
    voidwrite(byte[] b, int off, int len)从指定的字节数组写入 len个字节,从偏移 off开始到缓冲的输出流。
    voidwrite(int b)将指定的字节写入缓冲的输出流。

ObjectOutputStream(对象字节输出流)

  • 构造

    ObjectOutputStream()
    //为完全重新实现ObjectOutputStream的子类提供一种方法,不必分配刚刚被ObjectOutputStream实现使用的私有数据。
    ObjectOutputStream(OutputStream out)
    //创建一个写入指定的OutputStream的ObjectOutputStream。
    

Writer

image-20220108042700442

FileWriter

image-20220107064059901

  • 构造方法
  1. new FilleWriter(File/ String):覆盖模式,相当于流的指针在首端
  2. new Filewriter(Fie/ String,true):追加模式,相当于流的指针在尾端
  • 方法
  1. write(int):写入单个字符

  2. write(char):写入指定数组

  3. write(char,off,len):写入指定数组的指定部分

  4. write( string):写入整个字符串

  5. write( string,off,len):写入字符串的指定部分
    相关APl: String类: toCharArray:将 String转换成char

​ 注意: Filewriter使用后,必须要关闭( close)或刷新(fush),否则写入不到指定的文件!

BufferedWriter

  • 构造

    BufferedWriter(Writer out)
    //创建使用默认大小的输出缓冲区的缓冲字符输出流。
    BufferedWriter(Writer out, int sz)
    //创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区。
    
  • 方法

    void close()
    关闭流,先刷新。
    void flush()
    刷新流。
    void newLine()
    写一行行分隔符。
    void write(char[] cbuf, int off, int len)
    写入字符数组的一部分。
    void write(int c)
    写一个字符
    void write(String s, int off, int len)
    写一个字符串的一部分。

    返回值方法名说明
    voidclose()关闭流,先刷新。
    voidflush()刷新流。
    voidnewLine()写一行行分隔符。
    voidwrite(char[] cbuf, int off, int len)写入字符数组的一部分。
    voidwrite(int c)写一个字符
    voidwrite(String s, int off, int len)写一个字符串的一部分。

OutputStreamWriter(转换流)

  • 构造

    OutputStreamWriter(OutputStream out)
    //创建一个使用默认字符编码的OutputStreamWriter。
    OutputStreamWriter(OutputStream out, Charset cs)
    //创建一个使用给定字符集的OutputStreamWriter。
    OutputStreamWriter(OutputStream out, CharsetEncoder enc)
    //创建一个使用给定字符集编码器的OutputStreamWriter。
    OutputStreamWriter(OutputStream out, String charsetName)
    //创建一个使用命名字符集的OutputStreamWriter。
    
  • 方法

    返回值方法名说明
    voidclose()关闭流,先刷新。
    voidflush()刷新流。
    StringgetEncoding()返回此流使用的字符编码的名称。
    voidwrite(char[] cbuf, int off, int len)写入字符数组的一部分。
    voidwrite(int c)写一个字符
    voidwrite(String str, int off, int len)写一个字符串的一部分。

6、Properties类

  • 构造

    Properties()
    //创建一个没有默认值的空属性列表。
    Properties(Properties defaults)
    //创建具有指定默认值的空属性列表。
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值