概念:
流是字节序列的抽象概念。
是指数据传输时的形态。
是IO设备进行读取和写入操作的方式。
分节点流和过滤流
输入流:连续【读取】字节的对象。
InputStream类 描述了所有输入流的通用方法。
输出流:连续【写入】字节的对象。
OutputStream类 描述了所有输出流的通用方法。
InputStream类(抽象类)读取 | OutputStream类(抽象类)写入 | ||
int read() | 读取流 | Void write(int b) | 写入流 |
Int read(byte[] b) | 读取字节流 | Void write(byte[] b) | 所有的字节写入流 |
Int read(byte[] b,int off, int len) | 从off下标开始读len个。 | Void write(byte[] b,int off, int len) | 从off下标开始写len个。 |
long skip(long n) | 跳过n个读取。包装类中使用 | void flush() | 内存缓冲区的内容清空,并输出到目标IO上。 |
int available() | 返回当前流字可读节数。检查是否有流。占cpu资源。读取尽可能多的数据。可用户判定 |
|
|
Void mark(int adlimit) | 建立标记,当前位置开始最多能读取多少个字节。 包装类中使用 |
|
|
void reset() | 指针回到标记处。配合mark使用。 |
|
|
boolean markSupported() | 是否支持 mark,和reset方法 |
|
|
void close() | 关闭流 |
|
|
void flush() | 内存缓冲区清空,并输出到目标IO上。 |
|
|
为什么要使用close();垃圾回收器 只回收类识别对象。不会管理程序生成的资源。
创建磁盘文件的输入流和输出流:
对字节操作 | 对字符操作 | ||
FileInputStream | FileOutputStream | FileReader | FileWriter |
文件存在时才能读 | 如果文件存在,将覆盖。不能指定被其他程序打开的文件。否则会出错。 | 专门用于读写文本数据。 用于简化对字符串的输入编出编程。 是Reader,Writer字符流类的子类 | |
读取 | 写入 | 读取 | 写入 |
注意:
FileWriter的write方法不会真正写入。需要执行close方法才会被写入。
FileOutputStream的write方法会默认调用flush()写入
DEMO:
import java.io.*;
class StreamDemo{
public static void main(String[] args) throws Exception{
//字节写入操作
FileOutputStream out=new FileOutputStream("good.txt");
out.write("very good".getBytes());
out.close();
//字节读取操作
byte[] buf=new byte[1024];
File f=new File("good.txt");
FileInputStream in=new FileInputStream(f);
int len= in.read(buf);
System.out.println(new String(buf,0,len));
in.close();
//字符写入操作
FileWriter out2=new FileWriter("goodwriter.txt");
out2.write("very good writer");
out2.close();//执行它才会真正写入。
//字符读取操作
char[] buf2=new char[1024];
FileReader in2=new FileReader("goodwriter.txt");
int len2= in2.read(buf2);
System.out.println(new String(buf2,0,len2));
}
}