A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程振 中级黑马   /  2012-9-17 17:05  /  1461 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 orgcheng 于 2012-9-17 17:32 编辑

看下面的流的封装
  1. import java.io.BufferedReader;
  2. import java.io.File;
  3. import java.io.FileReader;
  4. import java.io.IOException;
  5. import java.util.Scanner;

  6. public class IODemo {
  7.         public static void main(String[] args) throws IOException {
  8.                
  9.                 File file = new File("input.txt");
  10.                 FileReader reader = new FileReader(file);
  11.                 BufferedReader bufferedReader = new BufferedReader(reader);
  12.                 Scanner cin = new Scanner(bufferedReader);
  13.                
  14.                 String line = null;
  15.                 while((line = cin.nextLine())!=null){
  16.                         System.out.println(line);
  17.                 }
  18.         }
  19. }
复制代码
这种封装是没问题的,但是既然打开,那就得关闭,但是关闭。。。先关闭那个,有点晕,求教

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!鼓励新人

查看全部评分

3 个回复

倒序浏览
一般情况下是:先打开的后关闭,后打开的先关闭
另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b
例如处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b
当然完全可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法
如果将节点流关闭以后再关闭处理流,会抛出IO异常

评分

参与人数 2技术分 +1 黑马币 +2 收起 理由
刘芮铭 + 1 赞一个!
程振 + 2 赞一个!

查看全部评分

回复 使用道具 举报
直接bufferedReader.close就好了
回复 使用道具 举报
首先我们看你创建了一个字符读取流对象,FileReader reader = new FileReader(file);

又创建了一个字符缓冲区对象BufferedReader bufferedReader = new BufferedReader(reader);
我们知道通过缓冲区能够将读取的数据暂时存储在缓冲区中,然后再写入或者打印,这就像
我们接水一样,先用一个桶接,接满之后可以再存储到另外的容器中,通过字符缓冲区能够
提高我们读取的效率,但是使用缓冲区的时候一定要刷新,这样才能保证数据流入到我们
指定的目的中。
关闭的时候有了缓冲区,只要把缓冲区关闭就行了,字符读取流就不用单独关闭了

一般只有字符流或者字节流的时候,要关闭字符流或者字节流
如果字符流或者字节流对应的输入流或者输出流有缓冲区对象的话,那么直接关闭缓冲区就行了。
import java.io.*;
class BufferedReaderDemo
{
public static void main(String[] args) throws IOException
{
  //创建一个读取流对象文件相关联;
  FileReader fr=new FileReader("buf.txt");
  //为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。
  BufferedReader bufr=new BufferedReader(fr);
  
  //读取一行
  String s1=bufr.readLine();
  System.out.println("s1:"+s1);
  //读取多行
  String line=null;
  while((line=bufr.readLine())!=null)
  {
   System.out.println(line);
  }
  bufr.close();
}
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马