下面我就根据代码,讲讲流的使用方式和组装
1. 使用输入流读取一个文件的原始写法
try{ File file = new File("dsds.dat"); //备注 :这样的路径是项目文件夹下的根目录 //将文件读入到流中 FileInputStream fis = new FileInputStream(file); //将文件流加修饰,变成能只读取特定数据的流 InputStreamReader isr= new InputStreamReader(fis); //读取整型 isr.read(); } catch (FileNotFoundException fne) { e.printStackTrace(); } catch (IOException ioe) { e.printStackTrace(); }finally{ try{ //关闭流 dis.close(); fis.close(); file.close(); }catch(Exception e){ e.printStackTrace(); } }感受到装饰者带来的好处了吧。没错,这样可以灵活组合,让我们使用不同方式通讯
2. 当然上面的代码是繁杂,每次使用流都要关闭,下面代码实现三个目的 1) 优化代码 2)使用 jse 7 新的特性 try-with-resources语句,取消掉流关闭的代码 3)统计下读取出多少的字节
int count=0; //try-with-resources语句 //try的构造实例,流会在退出try 前关闭 ,当然是按一次操作而言 try(InputStreamReader isr=new InputStreamReader ( new FileInputStream( new File("emplyes.dat")))){ //统计拿到多少的字节并打印到控制台 while(isr.read()!=-1) count++; System.out.println(count); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }这样的代码就清爽多了
等等,好像忘了什么东西
3. 让我们将输入流和输出流结合起来使用 将一个文件的内容输出到另一个文件
//缓冲,后面讲解 byte [] buf = new byte[1024]; //用于存放所读取字节的长度 int len = 0; //这里 对于多个资源的创建要使用 ; 作为分隔符 //首先是建立两条通道 文件1 -通道fis- 程序 -通道fos- 文件2 try(FileInputStream fis = new FileInputStream(new le("emplyes.dat")) ; FileOutputStream fos = new FileOutputStream(new File("emplyes2.dat"))) { //读取操作 while((len = fis.read(buf))!=-1){ //write 方法(一次读取的字节数,从那个位子开始,在哪个位置结束) fos.write(buf,0,len); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }这样一个简单的输入输出流就构建好了。