IO流

作者: 哈哈海 | 来源:发表于2016-11-07 23:45 被阅读0次
    package nodstream;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    
    public class TestFileCopy {
    
        /**
         * 测试文件拷贝
         * 
         *  \转义字符 :使得紧跟在它之后的字符就按本意处理,不做任何特殊用途
         */
        public static void main(String[] args) throws Exception{
            //读取源文件的输入流
            FileInputStream fis = new FileInputStream("f:\\corejava\\1.png");
            
            //写备份文件的输出流
            FileOutputStream fos = new FileOutputStream("copy1.png");
            
            //边读边写
            byte[] b = new byte[100];
            
            while(true){
                int n = fis.read(b);
                if(n==-1) break;
                fos.write(b,0,n); // 防着最后一次读到的数据(不一定完全装满数组b)
            }
    
            fis.close();
            fos.close();
        }
    
    }
    

    IO流
    一.流

    1. 概念:是对象,用来在内存和外部的存储设备之间交换数据的通道。

    2. 分类
      1)方向: 输入流 输出流 【判定标准,以当前程序为参照物】
      2)单位:
      字节流 -- 以字节为单位传递数据 , 可以传递任意类型的数据
      字符流 -- 以字符为单位传递数据 , 只可以读写文本文件
      3)功能:
      节点流 -- 实际负责数据传递的流对象
      过滤流 -- 负责为其他流对象添加辅助功能的流对象

    二.字节流

    1. 字节流父类:OutputStream(字节输出流) | InputStream(字节输入流)

    2. 字节节点流 【重点】
      1)FileOutputStream : 文件字节输出流

      2)FileInputStream :文件字节输入流

    2016-11-07_230746.png
    1. 字节过滤流

    1)DataInputStream | DataOutputStream
    I. 提供了直接读写8种基本数据类型的功能
    II. 提供了直接读写String的方法(writeUTF readUTF )

    1. BufferedInputStream | BufferedOutputStream
      I. 提供了缓存功能的字节过滤流,以空间换时间,减少访问硬盘的次数,提高数据
      传输速度。缓存功能对于输入流效果不明显
      II. 缓冲器输出:
      A. 关闭流时,会自动flush
      B. 数据将缓冲区填满,会自动flush
      C. 手动输出: 需要调用流对象的flush()

    3)ObjectInputStream | ObjectOutputStream
    I. 提供了直接读写对象 以及 8种基本数据类型数据 的功能
    提供了缓冲功能 --- 可以用它替换上面两种过滤流
    II. 对象只有能够序列化,才能放在流里传递
    实现类Serializable接口的对象,就是可序列化的对象
    注意:Serializable接口是一个“标记接口”
    III. 不需要参与序列化的属性,可以用关键字transient修饰
    IV. 对象以及对象的所有属性都必须是可序列化的,才能通过流传递
    V. 读取对象的输入流以抛出EOFException的形式提示用户文件读取完毕

    4)PrintStream --- System.out

    三.字符编码

    1. ASCII编码 --- 美国
    2. GB2312 --- 中国,国标
    3. GBK ---- 国标的扩展
    4. BIG5 ---- 中文繁体,台湾
    5. ISO8859_1 --- 西欧,希腊,阿拉伯,泰语,希伯来
    6. UTF-8 ---- 国际统一编码,是可变长的unicode

    注意:如果编解码方式不统一,则可能导致乱码

    四.字符流

    1. 父类 : Reader | Writer

    2. 节点流:
      FileWriter

      1. write(int c) --- 向流里写一个字符
        2)write( char[] c) --- 向流里写一个字符数组
        3)write(String str) --- 向流里写一个String
        FileReader
        1)read() --- 读取一个字符,返回字符的int形式,-1结束
        2)read(char[] c) ---一次读取多个字符,存入数组返回,返回值为读到的个数,
        -1结束
    3. 过滤流
      BufferdReader | PrintWriter --- 带缓冲功能的字符流
      1)PrintWriter提供了大量的println方法,输出方便
      2)BufferedReader 提供了readLine(),一次读取一行文字,直到读到行结束符为止。
      这是一个阻塞方法。

      InputStreamReader | OutputStreamWriter ---- “桥转换器”
      1)负责将一个字节流转换成字符流
      2)可以在构建过程中,指定编码方式(唯一一个可以指定编码的流)
      通常和FileInputStream配合,用来读取指定了编码的文本文件

    五.流总结
    流程序的编程步骤:
    1. 创建节点流对象 (优选FileInputStream,FileOutputStream)
    2. 封装过滤流 (优选“桥转换器”,带缓冲的字符过滤流)
    3. 读写数据 ( println 和 readLine )
    4. 关闭流对象

    2016-11-07_230720.png

    六.File类 (辅助类)

    1. 概念:一个File类的对象代表了文件系统里的一个文件或者目录,使用File类不能改变文件内容,只能设置一些属性。

    相关文章

      网友评论

          本文标题:IO流

          本文链接:https://www.haomeiwen.com/subject/fmqauttx.html