IO流相关

1 字节流

  1. FIleOutputStream:文件输出流,会创建一个指定的空文件,把流指向文件,java->jvm->找os(操作系统)->调用os方法写数据。
  2. FileInputStream:文件输入流,从磁盘中读取文件数据,使用read()方法每次读取一个字节,当读不到的时候返回-1,如果使用使用read(byte[] byte)读取,每次会读取多个字节返回的是读取到有效的字节个数,读不到的时候也会返回-1,但是缓冲区中只会覆盖掉重新读取的数据,如果没有新的则不覆盖,提高效率。
    在这里插入图片描述

2 字符流

  1. 小问题:使用字节流读取文件的时候会有一些小问题,遇到中文字符可能不会显示完整的字符,因为一个字符占用多个字节存储,所以java提供了专门处理文本文件袋额字符流类。
  2. FileWriter:用来读取字符文件的便捷类,会创建一个指定的空文件,把流指向文件,java->jvm->找os(操作系统)->调用os方法写数据。
  3. FileReader:用来写入字符文件的便捷类,文件 不存在会抛异常。
  4. 注意:别的方法使用和字节流几乎一致,刷新flush和close方法有区别,刷新后流可以继续使用,close之后流不可用。

3 Properties和IO

  1. getProperty(String key):用指定的键在此属性列表中搜索属性。
  2. setProperty(String key, String value) : 调用 Hashtable 的方法 put。
  3. stringPropertyNames() :返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。
  4. store(…):写中文传入字符流,传字节流会乱码。
  5. load(…):读取键值对,读中文传入字符流对象。

4 缓冲流

  1. 字节缓冲流: BufferedInputStream , BufferedOutputStream
    字符缓冲流: BufferedReader , BufferedWriter
    缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO 次数,从而提高读写的效率。
  2. 字节缓冲流
// 创建字节缓冲输入流 
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bis.txt")); 
// 创建字节缓冲输出流 
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt"));
  1. 字符缓冲流
    字符缓冲流的基本方法与普通字符流调用方式一致,不再阐述,我们来看它们具备的特有方法。
    BufferedReader: public String readLine() : 读一行文字。
    BufferedWriter: public void newLine() : 写一行行分隔符,由系统属性定义符号。

  2. 如何高效使用
    创建缓冲流,并且配合字节数组一起使用读写。

public class BufferedDemo { 
	public static void main(String[] args) throws FileNotFoundException {
		 // 记录开始时间 
		 long start = System.currentTimeMillis(); 
		 // 创建流对象 
	 	try (
	 	BufferedInputStream bis = new BufferedInputStream(new FileInputStream("jdk9.exe"));
	 	BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.exe")) 
	 	){
	  	// 读写数据 
		  int len; 
		  byte[] bytes = new byte[8*1024]; 
		  while ((len = bis.read(bytes)) !=1) { 
		  	bos.write(bytes, 0 , len); 
		  } 
		  } catch (IOException e) { 
		  	e.printStackTrace(); 
		  }
		  // 记录结束时间 
		  long end = System.currentTimeMillis(); 
		  System.out.println("缓冲流使用数组复制时间:"+(end ‐ start)+" 毫秒"); } 
}

5 转化流

  1. 转换流的原理
    在这里插入图片描述

  2. InputStreamReader类
    InputStreamReader(InputStream in) : 创建一个使用默认字符集的字符流。
    InputStreamReader(InputStream in, String charsetName) : 创建一个指定字符集的字符流。

  3. OutputStreamWriter类
    OutputStreamWriter(OutputStream in) : 创建一个使用默认字符集的字符流。
    OutputStreamWriter(OutputStream in, String charsetName) : 创建一个指定字符集的字符流。

6 序列化流和反序列化流

  1. 概念
    Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该 对象的数据 、 对象的类型 和 对象中存储的属性 等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。
    反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。
    注意: 一个对象要想序列化,必须满足两个条件:
    –> 该类必须实现 java.io.Serializable 接口, Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出 NotSerializableException 。
    –> 该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰。

  2. ObjectOutputStream类
    public ObjectOutputStream(OutputStream out) : 创建一个指定OutputStream的ObjectOutputStream。
    public final void writeObject (Object obj) : 将指定的对象写出。
    注意:
      static修饰的不能序列化,静态优先于对象产生,我们序列化的都是对象,序列化保存的是对象的状态,静态变量数以类的状态,因此序列化并不保存静态变量。这里的不能序列化的意思,是序列化信息中不包含这个静态成员域。如果都在同一个机器(而且是同一个进程),因为这个jvm已经把静态成员加载进来了,所以你获取的是加载好的成员,如果你是传到另一台机器或者你关掉程序重写写个程序读入obj,此时因为别的机器或新的进程是重新加载的,所以信息就是类初始时的信息。
      transient 瞬态关键字,修饰的也不能序列化。

  3. ObjectInputStream类
    public ObjectInputStream(InputStream in) : 创建一个指定InputStream的ObjectInputStream。
    public final Object readObject (): 读取一个对象。
    –>对于JVM可以反序列化对象,它必须是能够找到class文件的类。如果找不到该类的class文件,则抛出一个ClassNotFoundException 异常。
    –>另外,当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,抛出一个 InvalidClassException 异常。发生这个异常的原因如下:
    a 该类的序列版本号与从流中读取的类描述符的版本号不匹配
    b 该类包含未知数据类型
    c 该类没有可访问的无参数构造方法
    –>Serializable 接口给需要序列化的类,提供了一个序列版本号。 serialVersionUID 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。
    在这里插入图片描述

7 打印流

  1. 平时我们在控制台打印输出,是调用 print 方法和 println 方法完成的,这两个方法都来自于java.io.PrintStream 类,该类能够方便地打印各种数据类型的值,是一种便捷的输出方式。
  2. public PrintStream(String fileName) : 使用指定的文件名创建一个新的打印流。
public class PrintDemo {
    public static void main(String[] args) throws IOException {
		// 调用系统的打印流,控制台直接输出97        
        System.out.println(97);
     
		// 创建打印流,指定文件的名称        
        PrintStream ps = new PrintStream("ps.txt");
       
       // 设置系统的打印流流向,输出到ps.txt  
        System.setOut(ps);
       // 调用系统的打印流,ps.txt中输出97  
        System.out.println(97);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值