Java之I/O(1-InputStream类及其子类)
来源:互联网 发布:json文件怎么添加注释 编辑:程序博客网 时间:2024/06/10 00:25
Java的I/O总是会被经常用到,每次用的时候总感觉有点不知所措,因为package java.io里有太多的类可以使用了,所以,抽出一些时间弄清楚Java I/O的发展史很有必要。只要弄清楚了这些类的来龙去脉,用的时候才会得心应手。
在JDK API 1.6的版本里,java.io包下一共有12个接口,52个类(异常先不考虑),下面我们逐一分析。
InputStream和OutputStream类:
InputStream和OutputStream是这一类的鼻祖,从Java 1.0就开始存在。那个时候希望所有与输入有关的类都继承于InputStream,所有与输出有关的类都继承于OutputStream。本文主要讲InputStream,根据数据来源的类型不同,可以将InputStream分为以下几类:
InputStream子类 数据源类型ByteArrayInputStream 包含一个内存缓冲区,字节从中取出。FileInputStream 从文件中获得字节。ObjectInputStream 用来恢复被序列化的对象。PipedInputStream 管道输入流,读取管道内容。多和PipedOutputStream一起用于多线程通信。SequenceInputStream 是多种输入流的逻辑串联,从第一个输入流读取,直到最后一个输入流。StringBufferInputStream 读取的字节由字符串提供。
上述6种子类直接继承于InputStream,可将不同类型的数据来源转为InputStream对象使用。那么,InputStream又是什么样的呢?
我们可以认为InputStream提供了一种统一的对待输入的方法,可将多种不同类型的数据源都用统一的读取方式对待。要说明的是,InputStream是用来操控字节输入流的,它所提供的方法也是针对字节的。在Java 1.6版本中,InputStream提供了以下方法:
方法 解释 available() 返回此输入流下一个方法可以读取的字节数。 close() 关闭此输入流并释放相应资源。 mark(int) 在此输入流中标记当前的位置。 markSupported() 测试此输入流是否支持mark和reset方法。 read() 从此输入流中读取下一个字节(此方法是抽象方法,子类必须实现该方法)。 read(byte[]) 从输入流中读取一定数量的字节,存储在参数指定的字节数组中。 read(byte[],int,int)从输入流中指定位置起读取若干字节存储在指定字节数组中。 reset() 将此输入流定位到最后一次mark的位置。 skip(long) 跳过和丢弃此输入流中数据的若干字节。
下面举几个例子:
1 ByteArrayInputStream
public void testByteArray(){ byte[] buf=new byte[]{3,4,1,127,67,45,76,90,0,2}; byte[] b=new byte[2]; ByteArrayInputStream in=new ByteArrayInputStream(buf); int first=in.read(); System.out.println("Read the first byte is: "+first); in.skip(2); System.out.println("Skip 2 bytes."); in.read(b,0,2); System.out.println("Read 2 bytes to byteArray.\nNow the byteArray b is "+Arrays.toString(b)); System.out.println("After the operations above, the left bytes is: "+ in.available()); }/*output:Read the first byte is: 3Skip 2 bytes.Read 2 bytes to byteArray.Now the byteArray b is [127, 67]After the operations above, the left bytes is: 5共10个字节,存储在数组buf中。读取第一个字节,跳过2个字节,读取两个字节放在数组b中,还有5个剩余字节。*/
2 FileInputStream
public void testFile() throws IOException{ File f=new File("testFile.txt"); FileInputStream in=new FileInputStream(f); int first=in.read(); System.out.println("The first byte is: "+first);}/*testFile:99 84 80 45Output:The first byte is: 57可以看出:每个字符的低八位可以使用。/*
3 StringBufferInputStream
public void testStringBuffer(){ String s="abcdefg"; StringBufferInputStream in=new StringBufferInputStream(s); int first=in.read(); System.out.println("The firts byte is: "+first); }/*Output:The firts byte is: 97可以看出:每个字符的低八位可以使用。*/
由上面的代码片断可以看出,InputStream的子类的读取方法都大同小异,且都是以字节为单位。由代码结果也可以看出,在有些情况下,因为是以字节为单位,所以未能正确的将字符转换为字符。像StringBufferInputStream,从java 1.1开始,该类就被废弃了,从字符串创建流的首选方法变成了StringReader(后面还会讲到)。
- Java之I/O(1-InputStream类及其子类)
- Java之I/O(2-OutputStream类及其子类)
- java I/O InputStream 及子类 FileInputStream 源码分析
- Java I/O系统之InputStream
- Java I/O系统之InputStream
- java I/O FilterInputStream及其子类源码分析
- Java I/O Reader及其子类源码解析
- Java I/O总结 -- InputStream
- Java I/O流-总结(InputStream,OutputStream,Reader,Writer)
- Java I/O流-总结(InputStream,OutputStream,Reader,Writer)
- Java I/O流-总结(InputStream,OutputStream,Reader,Writer)
- Java随笔(2)I/O流中InputStream/OutputStream
- Java I/O总结——InputStream
- Java I/O总结——InputStream
- Java I/O总结——InputStream
- Java I/O总结——InputStream
- Java I/O总结——InputStream
- Java的 字节流 InputStream 类及其子类 FileInputStream 的使用
- [leetcode] 96.Unique Binary Search Trees
- MATLAB卷积运算(conv、conv2、convn)
- ubuntu用不了root用户:~$ su - root Password: su: Authentication failure怎么办?
- 环形缓冲区 -- circular buffer
- 《Pro Git》笔记五:不常用的工具和对这些工具的看法
- Java之I/O(1-InputStream类及其子类)
- GitHub学习笔记
- java 关于日期的记录
- 开发cocos2d-js项目总结(js3.6版本)
- LeetCode 206 Reverse Linked List
- 拥抱Swift吧,骚年!
- 剑指offer 面试题9
- 详细解析Java中抽象类和接口的区别
- 双向链表图文解析