IO流

2016-11-07  本文已影响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类不能改变文件内容,只能设置一些属性。
上一篇下一篇

猜你喜欢

热点阅读