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