当前位置: 首页 > news >正文

IO流的操作规律

流的操作规律
之所以要弄清楚这个规律,是因为流对象太多,开发时不知道用哪个对象合适.
想知道开发时用到哪些对象,只要通过四个明确即可
1.明确源和目的
源:InputStream Reader
目的:OutputStream Writer
2.明确数据是否是纯文本数据.
源: 是纯文本  Reader
否  InputStream
目的: 是纯文本  Writer
否  OutputStream
到这里,就可以明确需求中具体要使用哪个 体系了
3.明确具体的设备
源设备:
硬盘: File
键盘: System.in
内存:数组
网络:Socket流
目的设备:
硬盘: File
控制台: System.out
内存:数组
网络:Socket流
4.是否需要其他额外功能
a.是否需要高效(缓冲区)
是,就加上buffer
b.转换流  InputStreamReader OutputStreamWriter




需求1:复制一个文本文件
a.明确源和目的
  源:InputStream Reader
  目的: OutputStream Writer
b.是否是纯文本
 是,源:Reader
  目的:Writer
c.明确具体设备
源:硬盘  File
目的:硬盘 File
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
d.需要额外功能
需要,高效,
BufferedReader buff = 
new BufferedReader(fr);
BufferedWriter bufw = new BufferedWriter(fw);
[java]  view plain  copy
 print ?
  1. import java.io.BufferedReader;  
  2.   
  3. import java.io.BufferedWriter;  
  4.   
  5. import java.io.FileReader;  
  6.   
  7. import java.io.FileWriter;  
  8.   
  9. import java.io.IOException;  
  10.   
  11. public class BufferedCopy {  
  12.   
  13.    public static void main(String[] args)throws IOException {  
  14.   
  15.       //创建BufferedReader一样,必须先有流。  
  16.   
  17.       FileReader fr = new FileReader("tempfile\\buf.txt");  
  18.   
  19.       BufferedReader bufr = new BufferedReader(fr);  
  20.   
  21.       //创建一个字符写入流的缓冲区。应该先创建流。  
  22.   
  23.        FileWriter fw = new FileWriter("tempfile\\buf2.txt");  
  24.   
  25.       BufferedWriter bufw = new BufferedWriter(fw);  
  26.   
  27.       String line = null;  
  28.   
  29.       while((line=bufr.readLine())!=null){  
  30.   
  31.          bufw.write(line);  
  32.   
  33. //       换行  
  34.   
  35.          bufw.newLine();  
  36.   
  37.          bufw.flush();  
  38.   
  39.       }  
  40.   
  41.       bufr.close();  
  42.   
  43.       bufw.close();  
  44.   
  45.    }  
  46.   
  47. }     

需求2:读取键盘录入信息,并写入到文本文件中
a.明确源和目的
  源:InputStream Reader
  目的: OutputStream Writer
b.是否是纯文本
 是,源:Reader
  目的:Writer
c.明确具体设备
源:键盘  System.in
目的:硬盘 File
InputStream in = System.in;//字节流,使用InputStreamReader
FileWriter fw = new FileWriter("b.txt");
这样做可以完成,但是麻烦,将读取的字节数据转成字符串,再由字符流操作
d.需要额外功能
转换.将字节流围成字符流,因为明确的源是Reader,这样操作方便数据时,便捷.所以要将已有的字节流转成字符流.使用字节-->字符  使用InputStreamReader
InputStreamReader isr = 
new InputStreamReader(System.in);
FileWriter fw = new FileWriter("b.txt");
需要,高效,
BufferedReader buff = 
new BufferedReader(isr);

BufferedWriter bufw = new BufferedWriter(fw);

[java]  view plain  copy
 print ?
  1. import java.io.BufferedReader;  
  2.   
  3. import java.io.BufferedWriter;  
  4.   
  5. import java.io.FileWriter;  
  6.   
  7. import java.io.IOException;  
  8.   
  9. import java.io.InputStreamReader;  
  10.   
  11. public class ReadKeyDemo {  
  12.   
  13.    public static void main(String[] args) throws IOException {  
  14.   
  15.        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//记住:以后读取键盘都用这句,可以背下来。  
  16.   
  17.        BufferedWriter bufw = new BufferedWriter(new FileWriter("d:/a.txt"));  
  18.   
  19.        String line = null;  
  20.   
  21.          while((line=bufr.readLine())!=null){  
  22.   
  23.             //如果输入over,程序结束  
  24.   
  25.             if("over".equals(line))  
  26.   
  27.             {  
  28.   
  29.                 break;  
  30.   
  31.             }  
  32.   
  33.             bufw.write(line);  
  34.   
  35. //          换行  
  36.   
  37.             bufw.newLine();  
  38.   
  39.             bufw.flush();  
  40.   
  41.          }  
  42.   
  43.          bufr.close();  
  44.   
  45.          bufw.close();  
  46.   
  47.    }  
  48.   
  49. }  

需求3:将一个文件文件内容显示在控制台上
a.明确源和目的
  源:InputStream Reader
  目的: OutputStream Writer
b.是否是纯文本
 是,
 源:Reader
 目的:Writer
    c.明确具体设备
    源:硬盘:File
    目的:控制台:System.out


    FileReader fr = new FileReader("a.txt");
    OutputStream out = System.out;//这样输出内容很麻烦,使用转换流
    d.需要额外功能吗?
    需要:
    转换流
    FileReader fr = new new FileReader("a.txt");
    OutputStreamWriter osw = new OutputStreamWriter(System.out);
    高效,buffer
    BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));

    BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

[java]  view plain  copy
 print ?
  1. import java.io.BufferedReader;  
  2.   
  3. import java.io.BufferedWriter;  
  4.   
  5. import java.io.FileReader;  
  6.   
  7. import java.io.IOException;  
  8.   
  9. import java.io.OutputStreamWriter;  
  10.   
  11. public class ReadKeyDemo {  
  12.   
  13.    public static void main(String[] args) throws IOException {  
  14.   
  15.       BufferedReader bufr = new BufferedReader(new FileReader("d:/a.txt"));  
  16.   
  17.       BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));  
  18.   
  19.       String line = null;  
  20.   
  21.          while((line=bufr.readLine())!=null){  
  22.   
  23.             bufw.write(line);  
  24.   
  25. //          换行  
  26.   
  27.             bufw.newLine();  
  28.   
  29.             bufw.flush();  
  30.   
  31.          }  
  32.   
  33.          bufr.close();  
  34.   
  35.          bufw.close();  
  36.   
  37.    }  
  38.   
  39. }  

需求4:读取键盘录入数据,显示在控制台上
a.明确源和目的
  源:InputStream Reader
  目的: OutputStream Writer
b.是否是纯文本
 是,
 源:Reader
 目的:Writer
    c.明确具体设备
    源:键盘:System.in
    目的:控制台:System.out
    InputStream in = System.in;
    OutputStream out = System.out;
    d.明确额外功能?
    需要转换,因为都是字节流,但是操作的却是文本数据
    所以使用字符流操作起来更为便捷
    InputStreamReader isr = 
     new InputStreamReader(System.in);
    OutputStreamWriter osw = 
     new OutputStreamWriter(System.out);
    为了将其高效
    BufferedReader bufr = new BufferedReader(isr);
    BufferedWriter bufw = new BufferedWriter(osw);
[java]  view plain  copy
 print ?
  1. /** 
  2. 录入键盘输入字母并将小写变为大写 
  3. */  
  4. import java.io.*;  
  5. class readin   
  6. {  
  7.     public static void main(String[] args)throws IOException   
  8.     {  
  9.         InputStream in = System.in;//引入输入流  
  10.         InputStreamReader isr = new InputStreamReader(in);  
  11.         StringBuilder sb = new StringBuilder();//新建一个缓冲区  
  12.         while(true)  
  13.         {  
  14.             int ch = in.read();//读入键盘输入  
  15.             if(ch=='\r')  
  16.                 continue;  
  17.             if(ch=='\n')  
  18.             {  
  19.                 String s = sb.toString();//讲读入输入转换为字符型  
  20.                 if("over".equals(s))//判断S是否为OVER  
  21.                     break;  
  22.                 else  
  23.                     System.out.println(s.toUpperCase());//打印出字母大写  
  24.                 sb.delete(0,sb.length());  
  25.             }  
  26.             else  
  27.                 sb.append((char)ch);  
  28.         }  
  29.     }  
  30. }  



什么时候使用转换流呢?
  1.源或者目的对应的设备是字节流,但是操作的却是文本数据,可以使用转换作为桥梁,提高对文本操作的便捷.

  2.一旦操作文本涉及到具体的指定编码表时,必须使用转换流


转载:http://blog.csdn.net/chaoyu168/article/details/49663881

相关文章:

  • C#创建https请求并使用pfx证书
  • Xcode 7 缺少 *.dylib库的解决方法
  • [C#基础]说说lock到底锁谁?
  • Shell学习笔记---重定向输入、输出(原创)
  • 堆的一些简单应用
  • dtrace4linux_Example
  • jQuery.extend 函数详解
  • Shiro安全框架入门篇(登录验证实例详解与源码)
  • goldengate一些参数整理
  • HDU1161 Eddy's mistakes
  • Unity3d标签管理类-利用脚本控制标签,提升工作效率
  • putty如何设置密钥登陆
  • 程序员该如何有效的找工作?
  • Android 认识Activity 生命周期
  • C#基础内容学习笔记(一)
  • 【React系列】如何构建React应用程序
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Babel配置的不完全指南
  • C++类中的特殊成员函数
  • C学习-枚举(九)
  • Java 内存分配及垃圾回收机制初探
  • java小心机(3)| 浅析finalize()
  • js递归,无限分级树形折叠菜单
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Markdown 语法简单说明
  • OSS Web直传 (文件图片)
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • uva 10370 Above Average
  • Vue2.0 实现互斥
  • 机器学习中为什么要做归一化normalization
  • 类orAPI - 收藏集 - 掘金
  • 嵌入式文件系统
  • 双管齐下,VMware的容器新战略
  • 推荐一个React的管理后台框架
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 用简单代码看卷积组块发展
  • 【云吞铺子】性能抖动剖析(二)
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • ###STL(标准模板库)
  • #pragma pack(1)
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (33)STM32——485实验笔记
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • ******之网络***——物理***
  • ./和../以及/和~之间的区别
  • .Net CF下精确的计时器
  • .NET Core 项目指定SDK版本
  • .net FrameWork简介,数组,枚举