赞
踩
目录
InputStream(输入字节流)和OutputStream(输出字节流)
我们通过对File类的学习, 了解到File类并不能去操作文件的内容,可以操作文件内容的则是以下这些实现类,现在来一一介绍
在谈这两个类之前,我们先来聊聊,什么是输入和输出呢 , 简单理解的话,我们编写的程序就相当于一个中转站, 首先将一个文件的内容输入进来, 然后再通过中转站将内容输出到另一个文件上,那么在这个基础之上呢 , 我们将要介绍的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)的做法 , 这样做的好处是大大提升了效率
高效缓冲流的底层做法其实也是提供了缓存数组
试想,原本的字节流一次读一个字节,然后将它写出去,每次读一个效率未免太低,所以我们采用了缓冲数组的做法, 让它一次读入一定数量的字节,然后再去处理它,这样提升了效率
有了字节流, 那么也会有字符流, 顾名知义, 字节流每次会读入一个字节,而字符流每次则会读入一个字符, 采用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类,这个类又称为转换流, 它是字节流到字符流之间的桥梁
这里我们主要介绍PrintWriter流(字符打印流) , 我们一般在javaEE程序中用到 , 例 :
- try {
- PrintWriter out = new PrintWriter("D:\\demo\\asd.html");
- out.println("<a href=''>超链接</a>"); //超链接标签, html语言
- out.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
结果 :
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。