java IO流
Java IO流的概念
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流。
IO是指对数据流的输入和输出,也称为IO流,IO流主要分为两大类,字节流和字符流。字节流可以处理任何类型的数据,如图片,视频等,字符流只能处理字符类型的数据。
IO是In和Out,即输入和输出,指的是程序与外部设备间的数据传递。Java是用流(Stream)的方式来进行数据操作,这里就称为IO流,操作流的对象都在IO包上。
常用的字节流
FileInputStream、FileOutputStream、ObjectInputStream、ObjectOutputStream。
IO流的分类
1.按数据流的方向:输入 ,输出
输出:把程序(内存)中的内容输出到磁盘、光盘等存储设备中
输入:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中
2.按处理数据单位:字节流、字符流。
字节流:可以用于读写二进制文件及任何类型文件。
字符流:可以用于读写文本文件。
3.按功能:节点流、处理流。
节点流:可以从或向一个特定的地方(节点)读写数据。如FileInputStream,FileReader。
处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。处理流的构 造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。
输入流
InputStream:字节输入流基类,是所有的字节输入流的父类,它是一个抽象类。
FileInputSream:文件输入流。它通常用于对文件进行读取操作。
FilterInputStream :过滤流。作用是为基础流提供一些额外的功能。装饰者模式中处于装饰者,具体的装饰者都要继承它,所以在该类的子类下都是用来装饰别的流的,也就是处理类。
BufferedInputStream:缓冲流。对处理流进行装饰,增强,内部会有一个缓存区,用来存放字节,每次都是将缓存区存满然后发送,而不是一个字节或两个字节这样发送。效率更高。
DataInputStream:数据输入流。它是用来装饰其它输入流,它“允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型”。
PushbakInputStream:回退输入流。java中读取数据的方式是顺序读取,如果某个数据不需要读取,需要程序处理。PushBackInputStream就可以将某些不需要的数据回退到缓冲中。
ObjectInputStream:对象输入流。用来提供对“基本数据或对象”的持久存储。通俗点讲,也就是能直接传输对象(反序列化中使用)。
PipedInputStream:管道字节输入流。它和PipedOutputStream一起使用,能实现多线程间的管道通信。
SequenceInputStream:合并输入流。依次将多个源合并成一个源。
StringBufferInputStream:字符相关流。已经过时不多说。
ByteArrayInputStream:字节数组输入流,该类的功能就是从字节数组(byte[])中进行以字节为单位的读取,也就是将资源文件都以字节的形式存入到该类中的字节数组中去,我们拿也是从这个字节数组中拿。
inputStream字节输入流
字节输入流基类,是所有的字节输入流的父类,它是一个抽象类。
InputStream 是所有的输入字节流的父类,它是一个抽象类。
ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。PipedInputStream 是从与其它线程共用的管道中读取数据,与Piped 相关的知识后续单独介绍。
ObjectInputStream 和所有FilterInputStream的子类都是装饰流(装饰器模式的主角)。意思是FileInputStream类可以通过一个String路径名创建一个对象,FileInputStream(String name)。而DataInputStream必须装饰一个类才能返回一个对象,DataInputStream(InputStream in)
inputStream字节输入流常用方法:
// int available() 返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。
// void close() 关闭此输入流并释放与该流关联的所有系统资源。
// void mark(int readlimit) 在此输入流中标记当前的位置。
// boolean markSupported() 测试此输入流是否支持 mark 和 reset 方法。
// abstract int read() 从输入流中读取数据的下一个字节。
// int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
// int read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入 byte 数组。
// void reset() 将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。
// long skip(long n) 跳过和丢弃此输入流中数据的 n 个字节。
inputStream字节输入流代码实例:
public static void main(String[] args) throws IOException {
File f1=new File("d:/来自一个爱你的表白.txt");//file对象
InputStream in = new FileInputStream(f1);//新建输入流从f1开始流
int n ;
Long f1length= f1.length();//获取文件长度