IO流用来处理设备之间的数据传输。
Java程序中,对于数据的输入/输出操作以”流(stream)” 的方式进行。是指从源节点到目标节点的数据流动
源节点和目标节点可以是文件、网络、内存、键盘、显示器等等。
java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。
输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中
按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)
按数据流的流向不同分为:输入流,输出流
|
字节流 |
字符流 |
输入流 |
InputStream(基类) |
Reader(基类) |
输出流 |
OutputStream (基类) |
Writer(基类) |
流中的数据 |
二进制字节(8位) |
Unicode字符(16位) |
Java的IO流共涉及40多个类,实际上非常规则,都是从如下4个抽象基类派生的。
由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。
无论是文本文件还是二进制文件,当需要读取文件数据时,需要完成以下步骤:
使用文件输入流打开指定文件:
对于文本文件,应使用字符输入流FileReader流
对于二进制文件,应使用字节输入流FileInputStream流
读取文件数据
关闭输入流
无论是文本文件还是二进制文件,当需要将数据写入文件时,需要完成以下步骤:
使用文件输出流打开指定文件:
对于文本文件,应使用字符输出流FileWriter流
对于二进制文件,应使用字节输出流FileOutputStream流
将数据写入文件
关闭输出流
package com.xatu.IO;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import org.junit.Test;
public class IOTest {
/*
* 要处理IO三步
* 打开
* 处理
* 关闭(通道)//因为流不是内存资源,而是和操作系统有关的资源,所以必须现实关闭
*不关闭无法写入文件
*/
@Test
public void testFileReader() {
Reader fr = null;
try {//打开流,创建对象
fr = new FileReader("input.txt");
//处理流中的数据
char[] buf = new char[100];
int realCount = 0;
while ((realCount = fr.read(buf)) != -1) {
//for (int i = 0; i
在打开一个现有文件的输出流以准备写入数据时,有两种方式可供选择:
以清空方式打开
以添加方式打开
Reader 和 InputStream 是所有输入流的基类。
Reader(典型实现:FileReader)
int read() // 读取一个字符
int read(char [] c) //一次性读多个字符到缓冲区数组
int read(char [] c, int off, int len)
InputStream(典型实现:FileInputStream)
int read() //读取一个字节
int read(byte[] b) //一次性读多个字节到缓冲区数组
int read(byte[] b, int off, int len)
程序中打开的文件 IO 资源不属于内存里的资源,而是和操作系统相关的资源。垃圾回收机制无法回收该资源,所以应该显式关闭文件 IO 资源。
Writer 和 OutputStream 也非常相似:
void write(int b/int c);// 向流中写一个字节/字符
void write(byte[] b/char[] cbuf);//向流中写一个数组
void write(byte[] b/char[] buff, int off, int len);
void flush();
void close(); 需要先刷新,再关闭此流
因为字符流直接以字符作为操作单位,所以 Writer 可以用字符串来替换字符数组,即以 String 对象作为参数
void write(String str);
void write(String str, int off, int len);
@Test
public void testFileWriter() {
Writer fw = null;
try {
fw = new FileWriter("output",true);//后面的参数true指明写入文件时用追加的方式
String[] text = {
"zheshiyaoxiedewenjian\n",
"zheshiyaoxiedewenjian\n",
"zheshiyaoxiedewenjian\n",
"zheshiyaoxiedewenjian\n",
"zheshiyaoxiedewenjian\n",
"zheshiyaoxiedewenjian\n",
"zheshiyaoxiedewenjian\n"
};
for (String line : text) {
char[] buf = line.toCharArray();//把字符串对象转换成为相应的字符数组
//fw.write(buf);//把数组内容写入输出流
fw.write(buf, 0, 22);//把数组下标3开始,总共写9个字符写入输出流
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
fw.close();//输出流调用close会间接调用flush把缓冲区的数据强行写入硬盘
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
在Windows系统中,文本文件每行结尾都有两个不可见的特殊字符表示该行结束。
这两个字符为<回车>符(Unicode码为13)和<换行>符(Unicode码10 )称为<回车>-<换行>序列。
在Unix系统中,文本文件每行结尾只有<换行>符。
在Java语言中, <回车>符用’ \r’表示,<换行>符用’ \n’表示。
System.out.println语句,就是在输出一行内容后,继续输出<回车>-<换行>序列,从显示效果上使光标移动下一行开始。
通常情况下只需要\n即可换行