输入输出流IO

来源:互联网 发布:大非农数据一定准确吗 编辑:程序博客网 时间:2024/06/07 20:45

File

表示一个与硬盘上的文件联系
File表示一个联系,文件可能存在,也可能不存在
File有可能是一个文件,也有可能是一个文件夹

输入输出流IO


    • 数据在内存和数据源间流动,包括硬盘文件 数据库和网络等
    • 操作的数据单元
      • 字节流操作8位
      • 字符流操作16位
  • 节点流和处理流
    • 从一个特定的I/O设备读取数据的流,为节点流
    • 将一个已存在的节点流进行连接,或则封装,为处理流,使用装饰器设计模式
    • 节点流位于IO操作的一线,所有操作必须由它们完成
    • 处理流可以对其他流进行处理,主要时增强 提升性能的,本身不具备直接操作节点的能力。
      • 性能提高:增加缓存的方式提高性能
      • 操作的便捷:提供一系列便捷的方法来一次输入输出大量内容

IO流

输入流

  • InputStream和Reader
    • InputStream 和 Reader 是所有输入流的基类,它们是两个抽象类,是所有输入流的模版
    • inputStream读取一个字节,Reeader读取一个字符
    • 创建输入流时,需要借助其实现子类
  • FileInputStream和FileReader
    • 它们都是节点流,直接和指定文件关联
    • FileInputStream;读取的字节数,若到达文件尾部,返回-1;在输入可用之前,方法会阻塞
      • read():读取一个字节数据
      • read(byte[] b):读取流数据放入byte数组内
      • read(byte[] b,int start,int len):读取数据大byte数组内,起始位置为start,其长度为len
    • 缓存流BufferedInputStream和 BufferedReader
      • 缓存提高性能
      • 构造器使用InputStream和Reader
  • 转换流:InputStreamReader
    • 将字节流转为字符流,处理乱码(编码集、解码集)
    • 构造器中传入InoutStream,返回Reader
    • 可指定字符集
  • 字节数组输入流ByteArrayInputStream
    • 将字节数组输出流的缓存字节数组读入输入流中
    • 由垃圾回收机制管理,不需要手动关闭。此流被关闭后,仍可调用,不会产生异常
  • 数据处理流:DataInputStream
    • 可以处理基本类型+String,保留数据的类型。前提是读取顺序与写出顺序一致,否则读
      取数据不正确
    • 读取基本数据到输入流中
  • 对象处理流:反序列化ObjectInputStream
    • 将已序列化的对象的文件读取进输入流,由输入流创建原始的对象
    • readObject()读取对象

输出流

  • 文件续写和换行

    • 在输出流的构造器中加入boolean append参数,实现续写功能
    • 换行可在字符串中加入:”\r\n”
    • BufferedWriter的newLine()方法,写入换行符
  • OutputStream 和 Writer

  • 将流内的数据写出

  • FileOutputStream

    • write()写入输出流
  • FileWriter

    • append(char):将字符加入输出流
    • wirte():写入输出流
  • 缓冲处理流:BufferedOutputStream 和 BufferedWriter

    • 缓存,提高性能
  • 转换处理流:OutputStreamWriter

    • 将字符流转换成字节流
    • 构造器传入字符流,返回字节流
    • 可指定字符集
  • 字节数组节点类: ByteArrayOutputStream

    • 创建一个字符数组缓存用,所有内容写入到此字节数组中,获取用toByteArray和toString方法
    • 不用关闭,垃圾回收机制;关闭后依然可以使用
  • 数据处理流:DataOutputStream

    • 将数据内容及类型持久化到存储介质中,这里的类型为基本类型和字符串
  • 对象处理流(序列化):ObjectOutputStream

    • 序列化需要对象实现serializable接口
    • 不想序列化的属性用transient修饰

IO流

输入流与输出流的桥梁是字节数组,输入流从数据源读取数据到输入流,然后read()方法读入字节数组
输出流利用资格字节数组写入输出流,存入相应IO设备等处

字节流
 FileInputStream 操作文件的字节输入流
 BufferedInputStream 高效的字节输入流
 ObjectInputStream 反序列化流
字节输出流 OutputStream
 FileOutputStream 操作文件的字节输出流
 BufferedOutputStream 高效的字节输出流
 ObjectOuputStream 序列化流
 PrintStream 字节打印流

字符流
字符输入流 Reader
 FileReader 操作文件的字符输入流
 BufferedReader 高效的字符输入流
 InputStreamReader 输入操作的转换流(把字节流封装成字符流)
字符输出流 Writer
 FileWriter 操作文件的字符输出流
 BufferedWriter 高效的字符输出流
 OutputStreamWriter 输出操作的转换流(把字节流封装成字符流)
 PrintWriter 字符打印流
方法:
读数据方法:
 read() 一次读一个字节或字符的方法
 read(byte[] char[]) 一次读一个数组数据的方法
 readLine() 一次读一行字符串的方法(BufferedReader 类特有方法)
 readObject() 从流中读取对象(ObjectInputStream 特有方法)
写数据方法:
 write(int) 一次写一个字节或字符到文件中
 write(byte[] char[]) 一次写一个数组数据到文件中
 write(String) 一次写一个字符串内容到文件中
 writeObject(Object ) 写对象到流中(ObjectOutputStream 类特有方法)
 newLine() 写一个换行符号(BufferedWriter 类特有方法)

Io流总结

IO流异常处理

  • 出现异常:先try。。。catch下,然后在finally处理关闭,关闭出问题,上抛异常
  • 许多在finally里关闭的资源,因为怕关闭时出异常,一般都这么处理
finally {//一定要判断 fos 是否为 null,只有不为 null 时,才可以关闭资源if (fos != null) {try {fos.close();} catch (IOException e) {throw new RuntimeException("");}}

commons-IO

  • FilenameUtils
    • getExtension(String path):获取文件的扩展名
    • getName():获取文件名
    • isExtension(String fileName,String ext):判断 fileName 是否是 ext 后缀名
  • FileUtils
    • readFileToString(File file):读取文件内容,并返回一个 String
    • writeStringToFile(File file,String content):将内容 content 写入到 file 中
    • copyDirectoryToDirectory(File srcDir,File destDir);文件夹复制
    • copyFile(File srcFile,File destFile);文件复制