目录
InputStream(输入字节流)和OutputStream(输出字节流)
Reader(字符输入流)与Writer(字符输出流)
Print 流
我们通过对File类的学习, 了解到File类并不能去操作文件的内容,可以操作文件内容的则是以下这些实现类,现在来一一介绍
InputStream(输入字节流)和OutputStream(输出字节流)
在谈这两个类之前,我们先来聊聊,什么是输入和输出呢 , 简单理解的话,我们编写的程序就相当于一个中转站, 首先将一个文件的内容输入进来, 然后再通过中转站将内容输出到另一个文件上,那么在这个基础之上呢 , 我们将要介绍的inputStream与OutputStream就相当于两段传输的管道, 起到传输字节的作用,如下图
需要注意的是, InputStream与OutputStream是抽象类
最终的实现类我们用的是 FileInputStream 与 FileOutputStream , 先看示例,完整代码如下
FileInputStream in = null; //字节输入流
BufferedInputStream bin = null; //高效字节缓冲流
FileOutputStream out = null; //字节输出流
BufferedOutputStream bout = null; //高效字节输出流
try {
in = new FileInputStream("D:\\demo\\www.txt");
bin = new BufferedInputStream(in); //用缓冲流包装包装
out = new FileOutputStream("D:\\demo\\eee.txt");
bout = new BufferedOutputStream(out);
//定义一个缓冲数组,一次读入1024个字节
byte[] bytes = new byte[1024];
//length为实际读入byte[]数组的字节个数
int length = 0;
//read()方法读完之后会返回-1
while ((length = bin.read(bytes))!=-1){
//写出
bout.write(bytes,0,length);
}
} catch (FileNotFoundException e) { //处理编译期异常
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭管道
try {
if (bin != null){
bin.close();
}
if (bout != null){
bout.flush(); //刷新缓冲区
bout.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
原文件 :
执行后目标文件 :
需要注意的几点是, 如果我们输出的目标文件不存在的话,那么java是会去自动创建这个文件的,但是不能创建文件夹 , 并且在上述代码中,采用了缓冲数组和高效缓冲流(BufferedInputStream与BufferedOutputStream)的做法 , 这样做的好处是大大提升了效率
高效缓冲流的底层做法其实也是提供了缓存数组
试想,原本的字节流一次读一个字节,然后将它写出去,每次读一个效率未免太低,所以我们采用了缓冲数组的做法, 让它一次读入一定数量的字节,然后再去处理它,这样提升了效率
Reader(字符输入流)与Writer(字符输出流)
有了字节流, 那么也会有字符流, 顾名知义, 字节流每次会读入一个字节,而字符流每次则会读入一个字符, 采用utf-8的编码规范 , 一个英文字母就是一个字节, 一个汉字则是三个字节, 但它们都是一个字符, 字符流每次会读入一个完整的字符
另外,这两个类也是抽象类, 我们实现用的是FileReader与FileWriter这两个实现类
代码如下:
FileReader in = null;
FileWriter out = null;
BufferedReader bin = null;
BufferedWriter bout = null;
try {
in = new FileReader("D:\\demo\\www.txt");
bin = new BufferedReader(in);
// 构造方法中将append属性设置为:true 不会替换原来的文件内容
out = new FileWriter("D:\\demo\\eee.txt",true);
bout = new BufferedWriter(out);
String str = null;
while ((str = bin.readLine()) != null){
bout.write(str);
bout.newLine(); //换行
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
bin.close();
bout.flush();
bout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
上述代码可将以下文件完整的输出到另一文件中
字符流为何能辨别我们读入的是一个正确的字符呢 , FileReader类继承了 InputStreamReader类,这个类又称为转换流, 它是字节流到字符流之间的桥梁
Print 流
这里我们主要介绍PrintWriter流(字符打印流) , 我们一般在javaEE程序中用到 , 例 :
try {
PrintWriter out = new PrintWriter("D:\\demo\\asd.html");
out.println("<a href=''>超链接</a>"); //超链接标签, html语言
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
结果 :