1.所有字节流类都继承自InputStream或OutputStream两个抽象类,这两个抽象类拥有的方法可以通过查阅JavaAPI(API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。)获得。JDK提供了不少字节流,下面列举了六个输入字节流类,输出字节流类和输入字节流类存在对应关系,这里不一一列举。
FileInputStream
把一个文件作为输入源,从本地文件系统中读取数据字节,实现对文件的读取操作。
ByteArrayInputStream
把内存中的缓冲区作为输入源,从内存数组中读取数据字节。
ObjectInputStream
对以前使用ObjectInputStream写入的基本数据和对象进行反序列化,用于恢复那些以前序列化的对象,注意这个对象所属的类必须实现Serializable接口。
PipedInputStream
实现了管道的概念,从线程管道中读取数据字节。主要在线程中使用,用于两个线程间的通信。
SequenceInputStream
其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直至到达文件末尾,接着从第二个输入流开始读取,依次类推,直至到达包含的最后一个输入流的文件末尾为止。
System.in
从用户控制台读取数据字节,在System类中,in是InputStream类的静态对象。
package cn.lanqiao01;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class use{
public static void main(String[] args) {
FileInputStream in = null;
FileOutputStream out = null;
try {
File f = new File("C://Users/SweetTeacher/Desktop/copyWords.txt");
f.createNewFile();
//通过构造方法之一:String构造输入流
in = new FileInputStream("C://Users/SweetTeacher/Desktop/words.txt");
//通过构造方法之一:File类构造输入流
out = new FileOutputStream(f);
//通过逐个读取、存入字节,实现文件复制
int c;
while((c=in.read())!=-1) {
out.write(c);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(in!=null) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(out!=null) {
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
结果:

注意:read()方法碰到数据流末尾,返回时-1,而是在输入、输出流用完之后,要关闭输入流、输出流,节省资源。
2.下面来列举InputStream输入流的可用方法:
int read()
从输入流中读取数据的下一个字节,返回0~255范围内的Int型字节值。
int read(byte[] b)
从输入流中读取一定数量的字节,并将其存储在字节数组b中,以整数形式返回实际读取的字节数。
int read(byte[] b,int off,int len)
将输入流中最多len个数据字节读入字节数组b中,以整数形式返回实际读取的字节数,off指数组b中将写入数据的初始偏移量。
void close()
关闭此输入流,并释放与该流关联的所有系统资源。
int available()
返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。
void mark(int readimit)
在此输入流中标记当前位置。
void reset()
在此输入流从新定位到最后一次对此输入流调用mark()方法时的位置。
boolean markSupported()
判断此输入流是否支持mark()和reset()方法。
long skip(long n)
跳过和丢弃此输入流中数据的n字节。

被折叠的 条评论
为什么被折叠?



