IO流原理及分类
非文本比如视频、图像适合字节流,文本适合字符流。
IO流体系
FileReader读入数据
空参read方法
package demo10;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class IOTest {
public static void main(String[] args) throws IOException {
//1.实例化File对象,指明要操作的文件
File file = new File("hello.txt");
//2.提供具体的流
FileReader fr = new FileReader(file);
//3.数据的读入
//read():返回读入的字符,如果达到文件末尾,返回-1
int data = fr.read();
System.out.println((char)data);
while (data != -1){
System.out.print((char)data);
data = fr.read();
}
//4.流的关闭操作
fr.close();
}
}
改进
package demo10;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class IOTest {
public static void main(String[] args) throws IOException {
FileReader fr = null;
//1.实例化File对象,指明要操作的文件
File file = new File("hello.txt");
try {
//2.提供具体的流
fr = new FileReader(file);
//3.数据的读入
//read():返回读入的字符,如果达到文件末尾,返回-1
int data;
while ((data = fr.read())!=-1){
System.out.print((char)data);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.流的关闭操作
fr.close();
}
}
}
使用read重载方法
package demo10;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class IOTest {
public static void main(String[] args) throws IOException {
FileReader fr = null;
//1.实例化File对象,指明要操作的文件
File file = new File("hello.txt");
try {
//2.提供具体的流
fr = new FileReader(file);
//3.数据的读入
char[] cbuf = new char[5];
int len;
while ((len = fr.read(cbuf)) != -1) {
for (int i = 0; i < len; i++) {
System.out.print(cbuf[i]);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.流的关闭操作
fr.close();
}
}
}
注意我们这里的循环里是i<len
,我们下面把它改成i<cbuf.length
,
结果:
可以看到cbuf在每一次读取时被一个个覆盖,而不是清空重新赋值。
这里重载的reader方法的返回值是:
或者不用for循环,用String输出,也要注意char数组的长度问题:
FileWriter写出
package demo10;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class IOTest {
public static void main(String[] args) throws IOException {
//1.提供File类对象,指明写出到的文件
File file = new File("Hello.txt");
//2.提供FileWriter对象,用于数据的写出
FileWriter fw = new FileWriter(file);
//3.写出的操作
fw.write("Hello World!");
fw.write("Hello Java!");
//4.流的关闭
fw.close();
}
}
加个换行
之前文件被覆盖了。
如果源文件存在,就覆盖,如果不存在,就创建然后写出。
如果不想覆盖,就在FileWriter构造器中添加个true。
可以看到该参数为append,既追加,默认为false,所以是覆盖。
字符流不能处理图片
不能使用字符流来处理字节数据!