Java_I/O操作
作者:@云都小生(Author)
I/O 概述
I/O实际上指的就是输入(input)、输出(output)操作。Java需要从一些文件上读取信息,或者是写信息,就需要了解这些概念,掌握Java I/O相关类的操作。
Java中的数据传输是基于“流”的方式进行的,这个“流”也可以理解成数据流。
流的分类
从不同的角度,我们可以对流进行分类。
从流的方向上来说,如果我们从程序向文件输出数据,那就是输出流,如果我们的程序从文件中读取数据,那就是输入流。
如果从处理数据的大小来说,流又可以分为8位一字节的字节流和16位两字节的字符流。
最后,按照实现功能的不同,我们又可以分为节点流和处理流。节点流是直接与数据源相连,而处理流是间接形式,使用处理流可以提高一些效率,这个后面再谈。
Java I/O类的结构
Java提供的I/O类,主要继承自四个基类:Reader、Writer、InputStream和OutputStream。前两者是字符输入与输出,后两者是字节输入与输出。
每一个基类下面,又分出许多不同功能的I/O子类。
关于I/O类之间的关系,我挖了几张图过来。
图1是I/O类中的四个基类,它们都是抽象类,按照操作数据的长度可以分为字节流和字符流。再根据流的方向,可以分为字符输出流、字符输入流和字节输出流、字节输入流。
图2是InputStream,可以看到,这里又分出了节点流和处理流,FileInputStream是文件向程序的输入操作类。如果需要从文件中读取数据,就要···
FileInputStream fis = new FileInputStream(new File("d:\\Test.txt"));
fis.read();
ByteArraysInputStream这个类,用的是创建一个Byte[]缓冲区供InputStream使用。处理流中的BufferedInputStream和DataInputStream是用来一次性读取更多的数据。
FileInputStream用来创建一个文件作为InputStream,以实现文件操作。
如果我们直接用InputStream,每次都是读取一个字节,这样要频繁的对硬盘进行操作。我们使用BufferedInputStream就可以获取内存上一小块空间,一次性的读取,然后再去做其他处理。
简单而通俗的说,InputStream是一滴水一滴水的输入,DataInputStream是一瓢水一瓢水,而BufferedInputStream是一桶水一桶水。
图3是字节输入流OuputStream与子类的结构,也是分字节流和处理流。如果你仔细看,处理流里面有一个printStream,这个是用来格式化输出流的,一般是输出到控制台。
图4 图5就不多解释了,其实跟字节流的区别,就是在于操作数据的长度变了。
图片源地址戳我! 感谢博主分享,这也是一篇I/O相关的文章。
接下来我们就来学习一些常用的I/O类。
常用I/O方法大阅兵
基于InputStream有以下的方法:
markSupported():返回的是boolean类型,因为不是所有的stream都可以调用mark方法的,这个方法就是用来判断stream是否可以调用mark方法和reset方法。
read():从流中读取一个byte字节;
read(byte[]):将流中读取的内容存放到一个byte[]字节缓冲数组;
read(byte[],int x):从流中的offset开始读取长度为x的内容存放到byte[]缓冲数组;
mark(int index)设置标记点index;
reset()回到当初设置的mark标记点;
close()关闭该流;
available()返回流中的可读字节数。
基于 OutputStream又以下方法:
write(int):写入一个字节到OutputStream中;
write(byte[]):写入一个Byte[]数组到OutputStream中;
write(byte[],int x):把byte[]数组从文件指针开始的位置,写入长度为x的数据;
close()关闭一个OutputStream流;
flush()刷新流中的数据,将缓冲区的数据进行强制输出。
剩下的Reader和Write两个抽象类,就不说了,方法其实差不多,只是换成了字符流。也就是说,操作不再只是一个字节了,而是一个字符一个字符。
使用规则
当需要对文件进行操作的时候,就用FileInputStream和FileOutputStream,如果操作的是字符,就用FileReader和FileWrite。
如果操作的是byte[]就用ByteArrayInputStream和ByteArrayOutputStream;
如果是char[]就用CharArrayInputStream和CharArrayOutputStream;
如果是String····,就用StringBufferInputStream和StringBufferOutputStream;
如果需要格式化输出就用printStream和printWriter。前者用来格式化输出字节流,后者是字符流。
缓冲区相关的类有BufferedInputStream和BufferedOutputStream。
2017/10/6 23:41:22 @Author:云都小生(Cloudking)