Java基础 - IO流

2019-04-15  本文已影响0人  ADMAS

6.IO流

6.1 File

系统中我们一眼看到的就是文件或者文件夹
本质是一个路径(字符串);用字符串来表示这个路径不符合面向对象

File类对路径的字符串进行面向对象的封装,是文件和文件夹路径的抽象表现形式

基本操作:

File类的高级获取

    listFiles():返回一个File数组,包括了路径名下的的所有文件和文件夹路径名

    listRoots():此方法是静态的,返回路径名下的所有根路径

    listFiles(FileFilter filter):返回File数组,数组是有经过过滤器FileFilter筛选的

    FileFilter 重写的方法: accept(File pathname)  返回true表示需包含在数组内,不要去掉

6.2 IO流基类

  1. 字节输入流 InputStream

  2. 字节输出流 OutputStream

  3. 字符输入流 Reader

  4. 字符输出流 Writer

特点:


6.2.1 字节流

字节输入流  InputStream

字节输出流  OutputStream 

字节文件流

1-1.FileOutputStream

将数据写到目标文件中

1-2.FileInputStream

从源文件读取数据

缓冲流

字节缓冲流

2-1.BufferedInputStream

2-2.BufferedOutputStream

对象流

3-1.ObjectOutputStream

ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants

序列化:把内存中的对象保存到硬盘中

3-2.ObjectInputStream

ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants

反序列化:将文件中的对象读取到内存中

一个程序去读取另一个程序序列化的数据,达到进程通信

字节数组流

4-1.ByteArrayOutputStream

ByteArrayOutputStream extends OutputStream

4-2.ByteArrayIntputStream

ByteArrayInputStream extends InputStream


6.2.2 字符流

字符输入流  Reader

字符输出流  Writer

1-1. FileReader

FileReader extends InputStreamReader

擅长从文件读取字符的类

1-2.FileWriter

FileWriter extends OutputStreamWriter

擅长写出字符到文件的类

转换字符流

特点:

为什么要转换?

  1. 字节流是基本流,一般流对象都设计成字节流,比较通用

  2. 有时流对象并不是我们自己创建的,而是别的地方返回的,而返回的一般是字节流,如果字节流用来处理文本数据可能会出现乱码,所以必须将字节流转成字符流

2-1.InputStreamReader

转换输入流

2-2.OutputStreamWriter

转换输出流

字符缓冲流

3-1.BufferedReader

3-2.BufferedWriter


6.3 文件拷贝

6.4 IO流异常处理

从上面的代码可以看出处理异常的代码逻辑比IO操作还多,结构嵌套很深

6.5 字符的编码和解码

  1. 编码表

    所谓编码表就是用一个整数去对应一个字符

    如: ASCII编码表字符's' s --> 10 -->0000 1010(二进制)

    • ASCII
    - 是用**一个 8 位的字节**来表示空格、标点符号、数字、大小写字母或者控制字符的,其中最高位为 "0",其他位可以自由组合成 128 个字符的码表

    - **ASCII的汉字是1个字节**

- IOS-8859-1

    是国际标准化组织 ISO 字符编码标准 ISO-8859 的一部分,它在 ASCII 编码空置的 0xA0-0xFF 的范围内加入了其他符号字母以供西欧来使用,所以也叫 "西欧语言",另外 ISO 的编码还有其他的一些语言编码,这些都是**单字节 8 位编码**。

- GB*
    
    - GB2312 共收录了七千个字符,由于 GB2312 支持的汉字太少而且不支持繁体中文,所以 GBK 对 GB2312 进行了扩展,对低字节不再做大于 127 的规定,以支持繁体中文和更多的字符,GBK 共支持大概 22000 个字符,GB18030 是在 GBK 的基础上又增加了藏文、蒙文、维吾尔文等主要的少数民族文字。

    - **GBK的汉字是2个字节**

- Unicode

    - 一个全球性的编码方案把所有字母和符号都统一编码进去

    - UTF-8以字节为单位对Unicode进行编码

    - **UTF-8的汉字是3个字节**
  1. 编码和解码

    编码和解码都必须依靠一个工具作为桥梁,这个工具就是编码表

    • 编码: 把字符变成字节(整数)

      String类的编码方法:

        byte[] getBytes() 使用平台默认字符集(一般默认GBK)将String编码为byte,并存到byte数组中
      
        byte[] getBytes(String charsetName) 使用指定字符集将String编码为byte,并存到byte数组中
      
    • 解码: 把字节(整数)变成字符

      String类的解码方法:

        String(byte[] bytes) 使用默认字符集将字节数组解码成一个String对象
      
        String(byte[] bytes,String charsetName) 使用指定字符集将字节数组解码成一个String对象
      
    • 编码和解码的字符集必须一致,不然在多个字节的数据中,会出现乱码

    • 示例代码

        String str = "你好啊";
        byte[] bytes = str.getBytes();//使用默认字符集GBK进行编码
        String s = new String(bytes); //使用默认字符集GBK进行解码
      
        //编码和解码的字符集必须一致
        byte[] bUtf =  str.getBytes("UTF-8");//使用UTF-8编码
        String sUtf = new String(bUtf,"UTF-8");//使用UTF-8解码
      

6.6 属性文件 properties

6.7 RandomAccessFile

RandomAccessFile implements DataOutput, DataInput, Closeable

支持对随机访问文件的读取和写入


6.8 正则表达式

上一篇下一篇

猜你喜欢

热点阅读