java.io的字节流总结

Wesley13
• 阅读 700

字节流(常用)的继承关系:

java.io的字节流总结

1.InputStream和OutputStream (抽象类,所以以下都是对它的子类)

  • Input和Output都是对于程序来说的,input是从其他地方的数据读取到程序中,output是把程序中的数据存储在其他地方.

  • read和write方法都在执行时阻塞

  • read和write方法都可以读取一个或多个字节,但读取一个和读取多个字节不是调用了同一个native方法.(没有看源代码之前我以为读多个字节是用循环读入一个字节实现的)

  • InputStream:

    • int available()返回当前可读入的字节数量.可以避免阻塞的发生:

      int bytesAvailable = in.avaliable();
      if(bytesAvailable > 0){
          byte[] data = new byte[bytesAvailable];
          in.read(data);
      }
      
  • OutputStream:

    • close()和flush()方法都会冲刷输出流.有一些数据可能临时存储在缓冲区中等待以更大的包的形式传递,如果不冲刷输出流会出现数据丢失的现象!不关闭流是对系统资源的浪费!所以读取完数据一定要close.

2.ByteArrayInputStream和ByteArrayOutputStream

  • 这两个类都是以内存中的一块buffer作为读取的对象,并且close方法无效,调用close后此类中的方法可以被调用,不会抛出异常.

  • ByteArrayInputStream(不常用):

    • 构造方法:

      ByteArrayInputStream(byte[] buf); //Creates a ByteArrayInputStream so that it uses buf as its buffer array.
      ByteArrayInputStream(byte[] buf, int offset, int length);
      
    • 其他的方法和InputStream差不多.

  • ByteArrayOutputStream(常用作为buffer使用):

    • 构造方法:

      ByteArrayOutputStream(); //buffer默认大小为32字节,并且buffer大小可以自动增长
      ByteArrayOutputStream(int size);
      
    • reset()可将内部buffer的"指针"指向第一个字节,这样可以再用一次.

    • byte[] toByteArray和String toString()用于获取数据,其中toString还可以指定解码的字符集.

    • writeTo(OutputStream out)将buffer中的字节数组输出在out中,相当于调用 out.write(buf, 0, count).

2.FileInputStream和FileOutputStream

  • 用于文件的读写,读写方式与父类一样,经常用于传入其他IO类的构造方法.

  • FileInputStream:

    • 构造方法(常用):

      FileInputStream(File file);
      FileInputStream(String name);
      
  • FileOutputStream:

    • 构造方法(常用):

      FileOutputStream(File file);
      FileOutputStream(File file, boolean append);
      FileOutputStream(String name);
      FileOutputStream(String name, boolean append);
      

2.FilterInputStream和FilterOutputStream

2.ObjectInputStream和ObjectOutputStream

  • 这两个类都是用来对于对象的存取的,用于操作的对象要实现java.io.Serializable接口,此接口只用来标记没有方法需要实现.对于一个复杂的对象来说可能会有很多对象实例作为它的域,这时如果仅仅保存对象的引用是没用的,java中是用序列号(serial number)来标识对象,并将它保存至流中,如果对象之前被保存过,只需记录一下,因为序列号对于相同的对象是相等的,而不同的对象是不相等的(有相关的算法).这就是这种机制之所以称为对象序列化的原因.

  • ObjectInputStream:

    • 构造方法:

      protected    ObjectInputStream(); //提供给子类用的...
      ObjectInputStream(InputStream in);
      
    • 可以读取的类型包括基本类型和类(实现了Serializable接口).

    • String readUTF(),需要注意的是此处读取的是以修订版的UTF-8编码与标准的UTF-8不同,并且在前两个字节还会保存实际写出的字符长度.所以只在写用于JVM的字符串才用这个方法,对于其他场合应该使用writeChars方法.

  • ObjectOutputStream:

    • 构造方法:

      protected ObjectOutputStream(); //提供给子类用的... ObjectOutputStream(OutputStream out); ```

3.BufferedInputStream和BufferedOutputStream

  • 有一个buffer缓冲(普通的IO类也有buffer缓冲,虽然我不知道默认的大小,但应该这个类的缓冲区会很大吧),可以降低硬盘或其他的东西频繁工作.因为方法过少,通常只是流的一个"包装".

  • BufferedInputStream:

    • 构造方法:

      BufferedInputStream(InputStream in);
      BufferedInputStream(InputStream in, int size); //size指定缓冲区大小
      
  • BufferedOutputStream:

    • 构造方法:

      BufferedOutputStream(OutputStream out); BufferedOutputStream(OutputStream out, int size); //size指定缓冲区大小 ```

3.DataInputStream和DataOutputStream

  • 这两个类一般作为文件读写流的最后一个"包装".

  • DataInputStream:

    • 构造方法:

      DataOutputStream(OutputStream out);
      
    • 可以读取基本类型,一行和String(UTF-8修订版).

  • DataOutputStream:

    • 构造方法:

      DataOutputStream(OutputStream out); ```

      • 可以写出基本类型,chars和String(UTF-8修订版).

3.PrintStream

  • PrintStream输出字符串时可以指定编码,默认编码为系统默认编码.(DataOutputStream则不可以 )

  • 不会抛出IO异常,用 checkError()检查是否发生错误.

  • 构造方法:

    PrintStream(File file);
    PrintStream(File file, String csn) //csn==charsetname
    PrintStream(OutputStream out)
    PrintStream(OutputStream out, boolean autoFlush)
    PrintStream(OutputStream out, boolean autoFlush, String encoding)
    PrintStream(String fileName)
    PrintStream(String fileName, String csn)
    
  • System.out正是PrintStream类型,它的方法无需赘言.

在实际应用时可能会经常用到嵌套的方式创建一个流对象,举个例子:

DataInputStream dis=new DataInputStream(
                        new BufferedInputStream(
                            new FileInputStream("1.dat")));//这样就可以用DataInputStream的很多方法,而且还有缓冲区.

《java核心技术》卷二.

Java Platform Standard Edition 8 Documentation.

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
java获取redis的日志信息和动态监控信息
效果展示!实时监控(http://img.blog.csdn.net/20170404181255324?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjA5NTQ5NTk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA/dissolve/70
Stella981 Stella981
3年前
Android 从 Web 唤起 APP
前言!(http://7q5c2h.com1.z0.glb.clouddn.com/WebToAPP2.png?watermark/2/text/5ZC05bCP6b6Z5ZCM5a24/font/5qW35L2T/fontsize/500/fill/I0VGRUZFRg/dissolve/100/gravity/SouthEast/dx/
Wesley13 Wesley13
3年前
Java底层架构之RPC框架Dubbo核心原理之源码分析
!(http://img.blog.csdn.net/20171116005008687?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTY3NjQxNw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA/dissolve/70/gravity/Center
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Postman自动登录,请求带token
!这里写图片描述(http://img.blog.csdn.net/20180323182705200?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2J1ZGluZzAwNw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA/dissolve/70/gra
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这