Java-IO流

1 IO流概述

(1)IO流是内存与硬盘或可持久化设备之间数据传输的通道,以内存为参考进行数据流向的划分,从内存可持久化设备数据流为输出流,从可持久化设备内存的数据流称为输入流;

(2)IO流是以字节进行传输的,因为一切的文件都是以二进制字节进行存储;IO流分为字节流字符流,以及这两者的增强流;字节流是所有流的基础,所有流底层都要调用IO流;字符流是字节流加上字符编码,用来解决字符文件的读取编码问题;

(3)常用的几个增强流主要是缓冲流转换流序列流打印流;缓冲流带缓冲区,用来提高字符和字节流的读写效率;转换流可以指定字符编码对字符文件进行读取,解决字符编码乱码问题;序列化流用来实现对象和字节流的转换,实现对象的存储和读取;打印输出流用来将任意类型的数据转换为字符类型输出到指定目标。

2 字节流

(1)字节输入流

       1)InputStream是所有字节输入流的根类,本身是一个抽象类,通常使用其子类FileInputStream;

       2)常用方法

    (1)int read();读取一个字节数据,将读取的值以int返回

    (2)int read(byte[] b):读取一个字节数组数据,返回读取的字符个数,读取完成返回-1

    (3)int read(byte[] b,int off,int len):读取指定字节长度的数据,返回字符长度,读取完成返回-1

    (4)void close():关闭流资源

       3)常用子类 FileInputStream

          (1)构造方法

             1)FileInputStream(File file) :通过一个File对象来初始化流,文件必须存在,否则创建对象会抛异常;

             2)FileInputStream(String name):指定一个字符串路径来创建流对象,必须存在,否则创建对象抛异常;

         (2)常用方法和InputStream类似。

(2)字节输出流

       1)OutputStream是所有字节输出流的根类,本身是一个抽象类,常用FileOutputStream子类进行读取;

       2)常用方法

       1)void write(int b):写入一个字节数据

       2)void write(byte[] b )写入一个字节数组数据

       3)void write(byte[] b ,int off ,int len) 写入指定长度的字节数据

       4)void close():关闭流资源

       5)void flush():将缓冲区的数据刷新到存储设备,字节流没有缓冲区该方法无效,字符流和缓冲流底层调用这个方法;

      3)常用子类FileOutputStream

            1)构造方法

          1)public FileOutputStream(File file) :创建文件输出流以写入由指定的 File对象表示的文件。
          2)public FileOutputStream(String name) : 创建文件输出流以指定的名称写入文件。

            2)常用方法和OutputStream类似;

3 字符流

 (1)字符输入流Reader

         1)字符输入流的根类是Reader,本身是一个抽象类,常用FileReader子类;

         2)常用方法

       int read();从输入流读取一个字符,返回该字符的int表示形式

       int read(char[] cbuf):从输入流读取自定符数组数组,返回读取的字符个数

       int read(char[] cbuf,int off,int len)从输入流读取指定个数的字符数组数据,返回读取到的字符个数

       3)构造方法

     1)FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。
     2)FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称

       4)常用方法和Reader类似 

(2)字符输出流

         1)常用方法

        1)void write(int c):写入单个字符,字符以int表示形式作为参数传递;

        2)void write(char[] cbuf)写入一个字符数组数据;

        3)void write(char[] cbuf,int off,int len)写入指定长度的字符数组数据;

        4)void write(String str)写入字符串

        5)void write(String str,int off,int len)写入字符串的某一部分

        6)void flush() 刷新该缓冲流

        7)void close()关闭流资源

            2)常用子类FileWriter

                1)构造方法

                1)FileWriter(File file) : 创建一个新的 FileWriter,给定要读取的File对象。
                2)FileWriter(String fileName) : 创建一个新的 FileWriter,给定要读取的文件的名称

           3)常用方法和Writer类似 

4 缓冲流

(1)概述:缓冲流是用来提高字符流和字节流传输效率,因为自带缓冲区,可以一次读取多个数据,较少操作IO流的次数,从而提高效率

(2)字节缓冲流

        1)BufferedInputStream:字节输入缓冲流

            1)构造方法

BufferedInputStream(InputStream in):将一个字节输入流包装为字节输入缓冲流

BufferedInputStream(InputStream in,int size):将一个字节输入流包装为字节输入缓冲流,并指定缓冲区字节大小

           2)常用方法和字节流类似

       2)BufferedOutputStream:字节输出缓冲流

           1)构造方法

BufferedOutputStream(OutputStream in):将一个字节输出流包装为字节输出缓冲流

BufferedOutputStream(OutputStream in,int size):将一个字节输出流包装为字节输出缓冲流,并指定缓冲区字节大小

           2)常用方法和字节流类似

(3)字符缓冲流

      1)BufferedReader:字符输入缓冲流

           1)构造方法

BufferedReader(Reader in ):将字符输入流包装为一个字符输入缓冲流

BufferedReader(Reader in ,int sz) 将字符输入流包装为一个字符输入缓冲流,并指定缓冲区大小

          2)特有常用方法

 public String readLine() : 读一行文字。

     2)BufferedWriter字符输出缓冲流

         1)构造方法

BufferedWriter(Writer w):将字符输出流包装为一个字符输出缓冲流

BufferedWriter(Writer w,int sz):将字符输出流包装为一个字符输出缓冲流,并指定缓冲区大小

         2)特有常用方法

public void newLine() : 写一行行分隔符,该分隔符是根据系统而产生。

5 转换流

(1)字符编码和字符集

        1)字符集,也叫编码表,是带有唯一编号的字符的集合,常见的字符集有ASCII字符集,GBK字符集,Unicode字符集

              1)ASCII字符集:是基于拉丁字母的一套编码系统,用来表示现代英语,主要包括控制字符(不可显示)和可显示字符(英文大小写字母,阿拉伯数字,西文符号),使用7位二进制表示一个字符,ASCII的扩展集使用8位二进制表示,方便支持常用的欧洲字符。

             2)ISO-8859-1:用来表示欧洲使用的语言,使用单字节编码,兼容ASCII编码

             3)GBKxxx字符集

                   1)GB2312:简体中文码表,在ASCII的基础上,增加了中文字符,二进制值小于127的字节表示的还是ASCII的字符,大于127的两个字节组合起来表示一个中文,可以表示大概7000多个简体中文,此外还增加了数学符号,希腊字母,日文假名;ASCII表中本来就有的数字,字母和标点重新使用2个字节进行编码,称为全角,ASCII原有的称为半角。

                   2)GBK:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等。

                   3)GB18030:最新的中文码表。收录汉字70244个,采用多字节编码,每个字可以由1个、2个或4个字节组成。支持中国国内少数民族的文字,同时支持繁体汉字以及日韩汉字等

           4)Unicode字符集 :
               Unicode编码系统为表达任意语言的任意字符而设计,是业界的一种标准,也称为统一码、标准万国码。 它最多使用4个字节的数字来表达每个字母、符号,或者文字。有三种编码方案,UTF-8、UTF-16和UTF-32。最为常用的UTF-8编码。UTF-8编码,可以用来表示Unicode标准中任何字符,它是电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。所以,我们开发Web应用,也要使用UTF-8编码。它使用一至四个字节为每个字符编码,编码规则:
        1. 128个US-ASCII字符,只需一个字节编码。
        2. 拉丁文等字符,需要二个字节编码。
        3. 大部分常用字(含中文),使用三个字节编码。
        4. 其他极少使用的Unicode辅助字符,使用四字节编码

           2)字符编码

                字符编码 Character Encoding : 就是一套自然语言的字符与二进制数之间的对应规则
             

 (2)InputStreamReader:输入转换流,将输入的字节流通过指定的字符编码装换为对应的字符

          1)构造方法

InputStreamReader(InputStream in):使用默认编码集(编译器默认)创建转换流对象;

InputStreamReader(InputStream in ,String str):使用指定字符集创建转换流对象;

         2)常用方法和输入字符流类似

(3)OutputStreamWriter:输出转换流,将字符流通过指定的编码转换为字节流;

        1)构造方法

OutputStreamWriter(OutputStream out):使用默认编码创建转换流对象

OutputStreamWriter(OutputStream out ,String str):使用指定的编码创建转换流

        2)常用方法和输出字符流类似

6 序列化流 

(1)序列化和反序列化

        1)序列化是指将对象转换为字节序列保存到文件中,序列化的对象必须实现Serializable接口

        2)反序列化是指将文件中的字节序列读取出来,重构为对象;

(2)ObectOutputStream:序列化流,将内存中的对象转换为字节流输出;

          1)构造方法

 ObjectOutputStream(OutputStream out):创建一个指定OutputStream的ObjectOutputStream对象

         2)常用方法

void wirteObject(Object obj):将一个对象写入文件中。

(3)ObjectInputStream

         1)构造方法

ObjectInputStream(InputStream in) :创建一个指定InputStream的ObjectInputStream对象

        2)常用方法

public final Object readObject ():从序列化文件中读取序列化字节并重构为一个对象

7 打印流

(1)打印流作用是将任意类型的数据转换为字符串,并将其编码为字节流输出到指定目标例如控制台或者某个文件,例如我们平时经常使用的System.out.println()方法就是使用了PrintStream打印流

(2)PrintStream

        1)构造方法

       1)PrintStream(File file) 创建具有指定文件且不带自动行刷新的新打印流。 
       2)PrintStream(File file, String csn) 创建具有指定文件名称和字符集且不带自动行刷新的新打印流。 
       3)PrintStream(OutputStream out) 创建新的打印流。 
       4)PrintStream(OutputStream out, boolean autoFlush) 创建新的打印流。 
       5)PrintStream(OutputStream out, boolean autoFlush, String encoding) 创建新的打印流。 
       6)PrintStream(String fileName) 创建具有指定文件名称且不带自动行刷新的新打印流。 
       7)PrintStream(String fileName, String csn) 创建具有指定文件名称和字符集且不带自动行刷新的新打印流。

        2)常用方法

 1)void print(boolean b) 打印 boolean 值。 
 2)void print(char c) 打印字符。 
 3)void print(char[] s) 打印字符数组。 
 4)void print(double d) 打印双精度浮点数。 
 5)void print(float f) 打印浮点数。 
 6)void print(int i) 打印整数。 
 7)void print(long l) 打印 long 整数。 
 8)void print(Object obj) 打印对象。 
 9)void print(String s) 打印字符串。 

8 IO异常处理

(1)IO异常属于编译期异常,正常开发过程,属于编译期的异常都要进行处理。在JDK1.7之前和JDK1.7及之后有所不同。

(2)JDK1.7之前的异常处理

        1)使用try-catch-finally处理

public class HandleException1 {
  public static void main(String[] args) {
      // 声明变量
      FileWriter fw = null;
      try {
        //创建流对象
        fw = new FileWriter("fw.txt");
        // 写出数据
        fw.write("HelloWorld"); 
      } catch (IOException e) {
        e.printStackTrace();
      } finally {
        try {
          if (fw != null) {
            fw.close();
          }
        } catch (IOException e) {
          e.printStackTrace();
        }
     }
  }
}

(3)JDK1.7及之后

       1)实现了AutoCloseable接口,使用try-with-resource形式可以实现自动关流操作

public class HandleException2 {
  public static void main(String[] args) {
    // 创建流对象
    try ( FileWriter fw = new FileWriter("fw.txt"); ) {
    // 写出数据
       fw.write("HelloWorld"); 
    } catch (IOException e) {
       e.printStackTrace();
    }
  }
}

(4)JDK1.9新特性

         1)JDK9中 对try-with-resource 改进,对于引入对象的方式,支持的更加简洁。被引入的对象,同样可以自动关闭,
无需手动close

public class TryDemo {
	public static void main(String[] args) throws IOException {
	  // 创建流对象
	  final FileReader fr = new FileReader("in.txt");
	  FileWriter fw = new FileWriter("out.txt");
	  // 引入到try中
	  try (fr; fw) {
	    // 定义变量
	    int b;
	    // 读取数据
	    while ((b = fr.read())!=‐1) {
			// 写出数据
			fw.write(b);
	    }
	  } catch (IOException e) {
		e.printStackTrace();
	  }
    }
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值