博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字节流和字符流
阅读量:6093 次
发布时间:2019-06-20

本文共 2541 字,大约阅读时间需要 8 分钟。

hot3.png

一、流的基本概念

    此处略......

二、字节输出流OutputStream【JDK1.0】

    API中:

    public abstract class OutputStream extends Object mplements Closeable, Flushable;

    首先,我们可以发现实现了两个接口:Closeable,Flushable

                                                                                                                                                                 

    Closeable【JDK1.5】简介:

    只有一个方法Close();

    父接口:AutoCloseable【JDK1.7】

                                                                                                                                                                                                                 

    Flushable【JDK1.5】简介:

    只有一个方法Flush();

                                                                                                                                                                 

    继承关系图:4f6d69b517e92ea5d879f61ca6f4b64ccd2.jpg

    OutputStream类定义的是一个公共的输出操作标准,而在这个操作标准里面一共定义了3个方法

No. 方法名称 类型 作用
01 public abstract void write​(int b)  throws IOException 普通 输出单个字节数据
02 public void write​(byte[] b)   throws IOException 普通 输出一组字节数据
03 public void write​(byte[] b, int off,    int len)        throws IOException 普通 输出部分字节数据

                                                                                                                                                           

    子类:  FileOutputStream简介

    构造方法:

  • 【覆盖】构造方法:public FileOutputStream​(File file)  throws FileNotFoundException
  • 【追加】构造方法:public FileOutputStream​(File file, boolean append)  throws FileNotFoundException

三、字节输入流InputStream【JDK1.0】

    API中:

    public abstract class InputStream extends Object implements Closeable;

    InputStream类定义了如下核心方法

No. 方法名称 类型 作用
01 public abstract int read​() throws IOException 普通 读取单个字节数据,如果读取到底了,返回-1
02 public int read​(byte[] b)throws IOException 普通 读取一组字节数据
03 public int read​(byte[] b,int off,int len)throws IOException 普通 读取一组字节数据,但是只占数组的一部分

 

    子类:public class FilterInputStream extends InputStream

    在JDK1.9之后出现了一个新方法:public byte[] readAllBytes​() throws IOException;但是这个方法并不好用,如果文件太大,则不适用。

四、字符输出流Writer【JDK1.1】

    API中:

    public abstract class Writer extends Object implements Appendable, Closeable, Flushable   

    结构图:

f483f2c064a4c53bfdaf85f369ce3c871af.jpg

    writer中提供了很多的方法,我们重点看下面两个:

  •  输出字符数组:public void write​(char[] cbuf) throws IOException
  •  输出字符串:public void write​(String str)throws IOException

五、字符输入流:Reader【JDK1.1】

    API中:

    public abstract class Reader extends Object implements Readable, Closeable

    394bb5f26978db55bcf8479b683e02ec382.jpg

    字符流读取的时候只能按照字符数组的形式来进行操作,没有字符串的整体输入。

六、字节流和字符流的区别

    观察OutputStream与Writer的区别

    都使用了Close()来进行关闭处理。如果OutputStream不使用Close()来关闭,发现依然输出正常,如果Writer没有使用CLose(),发现无法正常输出,原因是因为Writer用到了缓存。当使用了Close()的时候,实际上会出现强制刷新缓冲区的情况,如果没有关闭,那么无法进行输出操作。如果想要在不关闭的情况下正常输出,可以使用flush()强制刷新。

    字节流不会用到缓冲区,字符流会用到。

七、转换流

    指的是可以将字节流和字符流的功能相互装换。提供了两个类:OutputStreamWriter、InputStreamReader

9b4f5fec319dd5ff146c1814629642d8f4b.jpg

    所谓的转换流就是将收到的对象向上转型转换得到的。

    Writer继承结构:

77327b957187248db5cee36189fa15e444f.jpg

    FileWriter继承结构:

ac987e915d0cfcdd5ba3ded71219b58c98c.jpg

FileReader继承结构:

6c88a76f11a7aded50684195f1d72c9cb8e.jpg

八、实例:文件拷贝

    方案一:使用InputStream将全部要拷贝的内容直接读取到程序里面,但是又一个致命的缺点就是:文件太大的话,程序基本上就死了。

    方案二:采用部分拷贝,读取一部分输出一部分,如果采取这种方法,核心的操作方法:

    InputStream: public  int read(byte[] b) throws IOException;

    OutputStream: public void write(byte[] b,int off,int len) throws IOException;

     在JDK1.9版本后,出现了两个新方法:

    InputStream:   public long transferTo​(OutputStream out)throws IOException;【JDK1.9】

    Reader:   public  long transferTo(Writer out) throws IOException;【JDK1.10】

    比传统方法效率更高。

    

 

    注:初学者,写的不好请见谅,如有相关问题记得私信我

    

 

转载于:https://my.oschina.net/chenzhou/blog/2250495

你可能感兴趣的文章
Eclipse遇到Initializing Java Tooling解决办法
查看>>
while((ch = getchar()) != '\n')
查看>>
好程序员web前端分享JS检查浏览器类型和版本
查看>>
Oracle DG 逻辑Standby数据同步性能优化
查看>>
exchange 2010 队列删除
查看>>
「翻译」逐步替换Sass
查看>>
H5实现全屏与F11全屏
查看>>
处理excel表的列
查看>>
C#数据采集类
查看>>
quicksort
查看>>
【BZOJ2019】nim
查看>>
LINUX内核调试过程
查看>>
【HDOJ】3553 Just a String
查看>>
Java 集合深入理解(7):ArrayList
查看>>
2019年春季学期第四周作业
查看>>
linux环境配置
查看>>
tomcat指定配置文件路径方法
查看>>
linux下查看各硬件型号
查看>>
epoll的lt和et模式的实验
查看>>
Flux OOM实例
查看>>