节点流
理解流的概念
流是字节序列的抽象概念;
文件时数据的静态存储形式,而流是指数据传输时的形态;
流类分为两个大类:节点流类和过滤流类(也叫处理流类);
InputStream与OutputStream类
程序可以从中连续读取字节的对象叫输入流,在java中,用InputStream类来描述所有输入流的抽象概念;
方法:
int read():从输入流中读取一个字节的内容,以int返回;int read(byte[] b):int read(byte[] , int off, int len)long skip(long n)int available();void mark(int readlimit);void reset();boolean markSupported();void close();
有了垃圾回收器为什么还要调用close方法:
java会在内存中产生类对象和操作系统产生的资源,垃圾回收器只回收类对象,close方法回收系统产生的资源;
程序可以向其中连续写入字节的对象叫输出流,在java中,用OutputStream类来描述所有输出流的抽象概念;
方法:
void write(int b);void write(byte[] b)void write(byte[] , int off, int len)void flush():在内存缓冲区还没有填满的时候,将缓冲区中的内容强制写入IO设备;void close():当调用此方法是,缓冲区的内容也会写入IO设备;
应用程序《——》内存缓冲区《——》IO设备
FileInputStream与FileOutputStream类
- FileInputStream和FileOutputStream类分别用来创建磁盘文件的输入流和输出流对象,通过它们的构造函数来指定文件路径和文件名;
- 创建FileInputStream实例对象时,指定的文件应该是存在和可读的。创建FileOutputStream实例对象时,如果指定的文件已经存在,这个文件中原来内容将被覆盖清除;
- 对同一磁盘文件创建FileInputStream对象的两种方式:
- FileInputStream inOne = new FileInputStream("hello.test");
- File f = new File("hello.test");
- FileInputStream inOne = new FileInputStream("hello.test");
FileInputStream inTwo = new FileInputStream(f);
- 创建FileOutputStream实例对象时,可以指定还不存在的文件名,不能指定一个已经被其他程序打开了的文件
- 思考:要将A文件的内容写入B文件,在程序代码中,是用输出类对象,还是用输入类对象来连接A文件并完成对A文件的操作呢?
- 答案:输入类对象
- 编程举例:用FileOutputStream类想文件中写入一个字符串,然后用FileInputStream读出写入的内容;
Reader与Writer类
- Reader和Writer是所有字符流类的抽象基类,用于简化对字符串的输入输出编程,即用于读写文本数据;
- 二进制文件和文本文件的区别;
- 编程举例:用FileWriter类向文件中写入一个字符串,然后用FileReader读出写入的内容;
PipedInputStream与PipedOutputStream类
- PipedInputStream类与PipedOutputStream类用于在应用程序中创建管道通信;
- 编程实例:Sender,Reveiver,PipedStreamThread;
- PipedWriter和PipedReader类:用于面向字符串的方向;
- 使用管道流类,可以实现各个程序模块之间的松耦合通信;
ByteArrayInputStream与ByteArrayOutputStream类
- 这两个类用于以IO流的方式来完成对字节数组内容的读写,来支持类似内存虚拟文件或者内存映像文件的功能;
- ByteArrayInputStream的两个构造函数:
- ByteArrayInputStream(byte[] buf);
- ByteArrayInputStream(byte[] buf, int offset, int length);
- ByteArrayInputStream(byte[] buf);
- ByteArrayOutputStream的两个构造函数:
- ByteArrayOutputStream();
- ByteArrayOutputStream(int);
- ByteArrayOutputStream();
- 编程举例:编写一个把输入流中所有英文字母变成大写字母,然后将结果写入到一个输出流对象;
- StringReader类和StringWriter类来一字符IO流的方式处理字符串;
重视程序代码的复用性
- System.in连接到键盘,是InputStream类型的实例对象,System.out连接到显示器,是PrintStream类的实例对象;
- 不管各种底层物理设备用什么方式实现数据的终止点,InputStream的read方法总是返回-1来表示输入流的结束;
- 在Windows下,按下Ctril+Z组合键可以产生键盘输入流的结束标志,在Linux下,则是按下Ctrl+D组合键来产生键盘输入流的结束标志;
- 编程举例:借助上一页编写的函数,将键盘上输入的内容转变成大写字母后打印在屏幕上;
- 建议:要编程从键盘上连续读取一大段数据时,应尽量将读取数据的过程放在函数中完成,使用-1来作为键盘输入的结束点。在该函数中编写的程序代码不应直接使用System.in读取数据,而是用一个Inputstream类型的形式参数对象来读取数据,然后将System.in作为实参传递给形式参数;