java web IO详解

​ 输入流 输出流

字节流 : inputStream (字节输入流) OutputStream(字节输出流)
字符流 : Reader(字符输入流) Write(字符输出流)

写数据的原理(内存~硬盘):

​ java程序—>JVM(java虚拟机)—>os(操作系统)—>os调用写数据的方法—>把数据写入到文件中

字节流

一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。

​ FileOutputStream:文件字节输出流: 把内存中的数据写入到硬盘文件中

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N34kD43g-1611228981496)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210107182003455.png)]

字节输出流的使用步骤(重点):

  1. 创建一个FileOutputStream对象,构造方法中传递写入数据的目的

    FileOutputStream fos = new FileOutputStream("09_IO\\a.txt")

  2. 调用FileOutputStream 对象中的方法write,把数据写入到文件中

    fos.write(97)

  3. 释放资源(流使用会占用一定的没存,使用完毕后要把内存清空,提高程序效率)

    fos.close

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gkoMEA4G-1611228981499)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210107184413467.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pgk5Pcc0-1611228981502)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210107184640402.png)]

一次写对个字节

  • public void write(byte[] b):将b.length字节从指定的字节数组写入此输出流。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bf1oYDid-1611228981505)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210107185223944.png)]

  • public void write(byte[] b,int off, int len):从指定的字节数组写入Len字节,从偏移量off开始输出到此输出流。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wmU4adWa-1611228981507)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210107185346751.png)]

  • Byte[] getBytes() 把字符串转化为字节数组

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hDdm3tS9-1611228981508)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210107185625659.png)]

追加写/续写:使用两个参数的构造方法

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PXW7n4lj-1611228981508)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210107190101487.png)]

换行符号 windows :\r\n Liuux:\n mac:\r

字节输入流:InputStream

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MNztVzVP-1611228981509)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210107190706711.png)]

FileInputStream:(继承InputStream )文件字节输入流 作用:把硬盘文件中的数据,读取到内存中使用

构造方法:

  • FileInputStream(string name ) :读取文件的路径
  • FileInputStream(File file ):直接读取文件

构造方法的作用:

  1. 会创建FileInputStream对象
  2. 会把FileInputStream对象指定构造方法中要读取的文件

读取数据的原理(硬盘~内存)

​ JAVA程序—>JVM -->OS —>OS读取方法—>读取文件

字节输入流的使用步骤(重点)

​ **一次读取一个字节的方法 **

  1. 创建FileInputStream对象,构造方法中绑定要读取的数据源

    FileInputStream fis = new FileInputStream("...\a.txt")

  2. 使用FileInputStream对象中的方法read,读取文件 (读取到末尾文件返回-1)

    int len = fis.read();

    可以使用while循环遍历文件中的数据

    ​ Boolean中的表达式

    ​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V5JjUv8S-1611228981510)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210107194217602.png)]

  3. 释放资源

    fis.close;

    ​ **一次读取多个字节的方法 **

    ​ 明确两件事:

    • 方法的参数Byte[] 作用?

      起到缓冲作用,存储每次读取的多个字节

      ​ 数组的长度一般定义为1024(1kb)或者1024的整数倍

    • 方法的返回值int是什么?

      ​ 每次读取的有效字节个数

      1. 创建FileInputStream对象,构造方法中绑定要读取的数据源

        FileInputStream fis = new FileInputStream("...\a.txt")

        2.使用FileInputStream对象中的方法read读取文件 “使用 int read(byte[] b)从输入流中读取一定量的字节,并存储在缓冲区数组b中”

      byre[] bytes = new byte[2];
      int len =fis.read(bytes);
      System.out.printf(len);
      System.out.printf(Arrays.toString(bytes));
      

      3.释放资源

      fis.close();

使用字节流读取中文可能会出线乱码的情况(应为它读取的每次就是1/3的的字符因此会出现乱码的情况)

字符流

Reader:输入流

​ FileReader:

  • 创建FilerReader对象

    FileReader fr= new FileReader("文件路径")

  • 使用FilerReader对象的read读取文件

    char[] cs = new char[1024];
    int len =0;
    while((len=fr.read(cs)!=-1){
    	String(char[] value , int offset, int count)
    }
    
  • 释放资源

    fr.close();

write:输出流

  • 创建FilerWrite对象

    FilerWrite fw= new FilerWrite(“文件路径”)`

  • 使用FilerWrite对象的write输出文件

    char[] cs = new char[1024];
    int len =0;
    while((len=fw.read(cs)!=-1){
    	String(char[] value , int offset, int count)
    }
    
  • 释放资源

    fw.close();

    关闭和刷新的区别

    flush()和close()方法的区别

    ​ -flush 刷新缓冲区,流对象可以继续使用

    ​ -close 先刷新缓冲区,然后通知系统释放资源,流对象就不可以使用了.

    字符写数据的其他方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jPrmTaus-1611228981510)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210108160256917.png)]

    ​ 续写和换行:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yZJIcKLl-1611228981511)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210108160640864.png)]

例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sit87FLc-1611228981512)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210108160809393.png)]

缓冲流:(就是一个数组)提高程序的执行效率

缓冲流,也叫高效流,是对4个基本的Filexxx流的增强,所以也是4个流,按照数据类型分类:

  • 字节缓冲流:BufferedInputStreamBufferedoutputStream
  • 字符缓冲流︰BufferedReaderBufferedwriter

​ 缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。

BufferedoutputStream字节输出流

​ 构造方法:

  • BufferedOutputStream(OutputStream out)创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

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

    使用步骤:

    1.创建FileoutputStream对象,构造方法中绑定要输出的目的地
    ⒉创建BufferedOutputStream对象,构造方法中传递FiLeOutputStream对象对象,提高FileOutputStream对象效率

    3.使用Bufferedoutputstream对象中的方法write,把数据写入到内部缓冲区中
    4.使用BufferedOutputStream对象中的方法fLush,把内部缓冲区中的数据,刷新到文件中5.释放资源(会先调用flush方法刷新数据,第4部可以省略)

BufferedInputStream字节输出流(同理)

缓冲流的读写 速度要比一般的读写 速度要快

字符缓冲流:

Bufferedwriter字符缓存输出流:构造方法:

Bufferedwriter (writer out)创建一个使用黑认大小输出缓冲区的缓冲字符输出流。
Bufferedwriter(writer out, int sz)创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
Writer out:字符输出流我们可以传递FiLewriter,缓冲流会给Filewriter增加一个缓冲区,提高FiLewriter的写入效率
int sz:指定缓冲区的大小,不写默认太小

BufferedReader字符缓存输入流

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P08Pj3rV-1611228981512)(C:\Users\kaixin\AppData\Roaming\Typora\typora-user-images\image-20210111145350515.png)]

使用步骤

1.出建字符缓冲输入流的对象
BufferedReader br = new BufferedReader(new FileReader("D:\\a.txt"));
2.使用字符缓冲输入流对象种的方法read/ readLine读取文本
String line = br.readLine();
System.out.println(Line);
3.释放资源
line.close();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值