zoukankan      html  css  js  c++  java
  • Java & IO流

    转换流:
    InputStreamReader :字节到字符的桥梁。解码。
    OutputStreamWriter:字符到字节的桥梁。编码。
     
    流的操作规律:
    之所以要弄清楚这个规律,是因为流对象太多,开发时不知道用哪个对象合适。
     
    想要知道开发时用到哪些对象。只要通过四个明确即可。
     
    1,明确源和目的(汇)
    源:InputStream  Reader
    目的:OutputStream  Writer
     
    2,明确数据是否是纯文本数据。
    源:是纯文本:Reader
    否:InputStream
    目的:是纯文本 Writer
    否:OutputStream
     
    到这里,就可以明确需求中具体要使用哪个体系。
     
    3,明确具体的设备。
    源设备:
    硬盘:File
    键盘:System.in
    内存:数组
    网络:Socket流
     
    目的设备:
    硬盘:File
    控制台:System.out
    内存:数组
    网络:Socket流
     
    4,是否需要其他额外功能。
    1,是否需要高效(缓冲区);
    是,就加上buffer.
    2,转换。
     
     
     
    需求1:复制一个文本文件。
    1,明确源和目的。
    源:InputStream Reader
    目的:OutputStream  Writer
    2,是否是纯文本?
    是!
    源:Reader
    目的:Writer
     
    3,明确具体设备。
    源:
    硬盘:File
    目的:
    硬盘:File
     
    FileReader fr = new FileReader("a.txt");
    FileWriter fw = new FileWriter("b.txt");
     
    4,需要额外功能吗?
    需要,需要高效。
    BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
    BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
     
    ================================================
     
    需求2:读取键盘录入信息,并写入到一个文件中。
     
    1,明确源和目的。
    源:InputStream Reader
    目的:OutputStream  Writer
    2,是否是纯文本呢?
    是,
    源:Reader
    目的:Writer
    3,明确设备
    源:
    键盘。System.in
    目的:
    硬盘。File
     
    InputStream in = System.in;
    FileWriter fw = new FileWriter("b.txt");
    这样做可以完成,但是麻烦。将读取的字节数据转成字符串。再由字符流操作。
    4,需要额外功能吗?
    需要。转换。 将字节流转成字符流。因为名确的源是Reader,这样操作文本数据做便捷。
    所以要将已有的字节流转成字符流。使用字节-->字符 。InputStreamReader
    InputStreamReader isr = new InputStreamReader(System.in);
    FileWriter fw = new FileWriter("b.txt");
     
    还需要功能吗?
    需要:想高效。
    BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
     
     
     
    ===================================================
     
    需求3:将一个文本文件数据显示在控制台上。
    1,明确源和目的。
    源:InputStream Reader
    目的:OutputStream  Writer
    2,是否是纯文本呢?
    是,
    源:Reader
    目的:Writer
    3,明确具体设备
    源:
    硬盘:File
    目的:
    控制台:System.out
     
    FileReader fr = new FileReader("a.txt");
    OutputStream out = System.out;//PrintStream
    4,需要额外功能吗?
    需要,转换。
    FileReader fr= new FileReader("a.txt");
    OutputStreamWriter osw = new OutputStreamWriter(System.out);
    需要,高效。 
    BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
    BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
     
    ================================================================
     
    需求4:读取键盘录入数据,显示在控制台上。
    1,明确源和目的。
    源:InputStream Reader
    目的:OutputStream  Writer
    2,是否是纯文本呢?
    是,
    源:Reader
    目的:Writer
    3,明确设备。
    源:
    键盘:System.in
    目的:
    控制台:System.out
     
    InputStream in = System.in;
    OutputStream out = System.out;
     
    4,明确额外功能?
    需要转换,因为都是字节流,但是操作的却是文本数据。
    所以使用字符流操作起来更为便捷。
    InputStreamReader isr = new InputStreamReader(System.in);
    OutputStreamWriter osw = new OutputStreamWriter(System.out);
     
    为了将其高效。
    BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
     
     
    ============================================================
     
    5,将一个中文字符串数据按照指定的编码表写入到一个文本文件中.
     
    1,目的。OutputStream,Writer
    2,是纯文本,Writer。
    3,设备:硬盘File 
    FileWriter fw = new FileWriter("a.txt");
    fw.write("你好"); 
     
    注意:既然需求中已经明确了指定编码表的动作。
    那就不可以使用FileWriter,因为FileWriter内部是使用默认的本地码表。
    只能使用其父类。OutputStreamWriter.
    OutputStreamWriter接收一个字节输出流对象,既然是操作文件,那么该对象应该是FileOutputStream
     
    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.txt"),charsetName);
     
    需要高效吗?
    BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),charsetName));
     
    什么时候使用转换流呢?
     
    1,源或者目的对应的设备是字节流,但是操作的却是文本数据,可以使用转换作为桥梁。
    提高对文本操作的便捷。
    2,一旦操作文本涉及到具体的指定编码表时,必须使用转换流 。
  • 相关阅读:
    【转】Visual studio 快捷键大全
    C++ 中的权限控制
    论C++11 中vector的N种遍历方法
    c++ 模板仿函数初探
    OBS (open boardcast server)结构分析
    OpenCV学习笔记:opencv_core模块
    [转]C++ new操作符详解
    进程已经被attach debug,如何解除其debug权限?
    dll 在进程中怎么区分的
    树状数组学习笔记
  • 原文地址:https://www.cnblogs.com/xiarongjin/p/8310823.html
Copyright © 2011-2022 走看看