zoukankan      html  css  js  c++  java
  • Java精选笔记_IO流(转换流、常用流、流操作规律、字符编码)

    IO流

    用来处理设备之间的数据传输,java对数据的操作是通过流的方式,java用于操作流的对象都在IO包中

    按操作数据分为:字节流和字符流;按流向分为:输入流和输出流

    程序从输入流中读取数据,向输出流中写入数据

    字节流的抽象基类:Inputstream  和 OutputStream;字符流的抽象基类:Reader 和 Writer

    其他流均是继承这4个抽象类而来的。

    转换流

    转换流也是一种包装流,其中OutputStreamWriter是Writer的子类,可以将一个字节流输出流包装成字符输出流,方便直接写入字符,而InputStreamReader是Reader的子类,它可以将一个字节输入流包装成字符输入流,方便直接读取字符。


    InputStreamReader读取转换流--------字节流通向字符流的桥梁

    步骤 :

        1.获取键盘录入对象

        Inputstream in=System.in

        2.将字节流对象转换成字符流对象,使用转换流InputStreamReader 

        InputStreamReader isr=new InputStreamReader(in);

        3.提高效率使用字符流缓冲区 BufferedReader进行读取

        BufferedReader bf=new BufferedReader(isr);

        String line=null;
        while((line=bf.readLine())!=null) {
            if("over".equals(line))
            break;
            sop(line);
        }
        bufr.close;


    OutputStreamReader写入转换流----------字符流通向字节流的桥梁
    步骤 :

        1.获取输出对象

        Outputstream out=System.out

        2.将字符流对象转换成字节流对象,使用转换流OutputstreamWriter 

        OutputstreamWriter osw=new OutputstreamWriter(out);

        3.提高效率使用字符流缓冲区 BufferedWriter进行写入

        BufferedWriter bw=new BufferedWriter(osw);

        String line=null;
        while((line=bf.readLine())!=null) {
           if("over".equals(line))
            break;
            bw.write(line);
            bufw.newLine();
        }
        bufr.close;


    常用流

    字节流
        InputStream
        int read()
        int read(byte[])
        int read(byte[], int, int)
            FileInputStream
            AudioInputStream
            ByteArrayInputStream
            ObjectInputStream
            PipedInputStream
        int available()
        void close()
        OutputStream
        write(int)
        write(byte[])
        write(byte[], int, int)
            FileOutputStream
            ByteArrayOutputStream
            ObjectOutputStream
            PipedOutputStream
        flush()
        close()
    字符流
        Reader
        FileReader节点流
        BufferedReader过滤流(处理流)
        InputStreamReader转换流
        Writer
        FileWriter节点流
        BufferedWriter过滤流(处理流)
        OutputStreamWriter转换流


    读取键盘录入
    System.out:对应的是标准输出设备,控制台
    System.in:对应的标准输入设备,键盘
        InputStream in=System.in;
        int by=in.read();
        sop(by);
        in.close();  //结束录入 

    流操作规律

    基本规律

    1.明确源和目的

        源:输入流。InputStream字节流  Reader 字符流

        目的:输出流 OutPutStream 字节流  Writer 字符流

    2.操作的数据是否是纯文本

        是就是字符流,如果设备是键盘 就将字节流转换为字符流

        不是就是字节流

    3.当体系明确后,在明确要是用那个具体的对象

        通过设备来区分:

        源设备  内存 硬盘 键盘

        目的设备  内存  硬盘  控制台

    4.是否需要提高效率 

        是 BufferedReader  BufferedInputStream

        否 BuffreredWriter BufferedOutputStream

    案例分析

    1.将一个文本文件中的数据存储到另一个文件中,复制文件

    源:InputStream字节流  Reader 字符流
           是否是纯文本 是  Reader
           设备: 文件   操作文件的对象 就是FileReader
           是否需要高效 
           是  BufferedReader
           FileReader fr=new FileReader("a.txt");
           BufferedReader bufr=new BufferedReader(fr);
     
    目的:OutPutStream 字节流  Writer 字符流
              是否是纯文本 :是 Writer 
              设备: 文件 写入文件的对象 就是 FileWriter 
              是否需要高效  是   BufferedWriter
              FileWriter fw=new FileWriter("b.txt");
              BufferedWriter bufw=new BufferedWriter(fw);


    2.将一个图片文件数据存储到另一个文件中,复制文件。
    源:是否是纯文本 : 不是  InputStream
         设备 文件 就是 FileInputStream
         是否高效 是
         BufferedInputStream
         FileInputStream isr=new FileInputStream("a.jpg");
         BufferedInputStream bufis=new BufferedInputStream(isr);
    目的:是否纯文本 :不是 OutPutStream
         设备:文件 FileOutPutStream
         是否高效 是
         BufferedOutputStream
         FileOutPutStream osw=new FileOutPutStream("b.jpg");
         BufferedOutputStream bufos=new BufferedOutputStream(osw);


    3.需求将键盘录入的数据保存到一个文件中 。

        源:键盘  字节流 

        是否纯文本  Reader

        设备 :键盘  ,对应的对象时 System.in 对应的是字节流 ,为了操作方便 转成字符流

        既然明确了Reader 就将System.in 转换成字符流 InputStreamReader

        InputStreamReader isr=new InputStreamReader(System.in);

        需要高效吗 ?

        BufferedReader bufr=new BufferedReader(isr);

    目的: 文件

        是否纯文本 是  Writer
        设备:文件 FileWriter

        需要高效吗?

        是 BufferedWriter


    4.扩展 :想要把录入的数据按照指定的编码表(utf-8)将数据存到文件中

    目的:OutPutStream 字节流  Writer 字符流

         是否是存文本:是  Writer

         设备 :文件 fileWriter

         默认编码表是 gbk

         编码标只有转换流可以指定。所以要使用的对象是写入转换流 OutputStreamWriter

         转换流需要接受一个自己输出流,操作字节输出流的是FileOutputStream

         OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("b.txt"),"utf-8");

         BufferedWriter bufw=new BufferedWriter (osw);



    通常涉及到字符编码转换的时候,就需要用到转换流。

    字符编码

    字符码表

    字符码表是一种可以方便计算机识别的特定字符集,它是将每一个字符和一个唯一的数字对应而形成的一张表。ASCII、ISO8859-1、GB2312、GBK、Unicode、UTF-8

    字符编码和解码

    把字符串转换成计算机识别的字节序列称为编码

    把字节序列转换为普通人能看懂的明文字符串称为解码

    字符传输

    通过构造方法InputStreamReader(InputStream in,String charsetName)和OutputStreamReader(OutputStream in,String charsetName)创建流对象时,可以对需要读写的数据指定编码格式



    两种设计模式

    适配器模式

    将字节流适配成可以用字符的方式操作的字符流

    适配:把不兼容的(接口)变成兼容的(接口)

    InputStreamReader
    OutuptStreamWriter

    装潢模式

    处理流(过滤流)基本上都是用了装潢模式

    BufferedReader / BufferedWriter
    PrintStream / PrintWriter
    DataInputStream / DataOutputStream
  • 相关阅读:
    梅小雨 20180912-3 词频统计
    梅小雨20190912-2 命令行
    梅小雨20190905-1 每周例行报告
    梅小雨20190905-2 博客作业
    梅小雨20190905-3 命令行和控制台编程
    20190919-4 单元测试 结对
    20190919-2 功能测试
    20190919-1 每周例行报告
    20190919-6 四则运算试题生成
    20190919-5 代码规范
  • 原文地址:https://www.cnblogs.com/justdoitba/p/7582141.html
Copyright © 2011-2022 走看看