IO流常见知识点学习

比特(Bit)、字节(Byte)

  • 比特是计算机最小的二进制单位,是最小的传输单位,取值为0或者1
  • Byte表示字节,有8个比特位,是最小的存储单位。

输入流与输出流

  • 按照传输方向分为输出流和输入流
  • 输入流:指的是将流从外部文件输入到程序中(read读进来)
  • 输出流:指的是将流从程序中输出到外部文件中去(write写出去)
  • 也可以将内容从一个文件输到另一个文件,比如copy,因此程序作为输入与输出的中转部分

字符流、字节流

  • 按照出传输流的数据单位分为字节流和字符流
  • 字节流:字节流是按照字节去读写数据的,读取是以单个字节为单位,操作对象一般为二进制文件,根类是InputStream和OutputStream
  • 字符流:按照字符去读取数据的,一般用于字符文件,字符流是由java虚拟机将单个字节转换为两个字节的unicode字符,操作对象一般为文本,根类为Reader和Writer
  • InputStream、OutputStream、Reader、Writer都是抽象类

节点流和处理流

  • 按照功能划分为节点流和处理流
  • 节点流:直接与数据源进行连接,用于数据的输入与输出
  • 处理流(包装流):不直接连接到数据源或者目的地,是其他流进行封装,他的构造方法主要是传入节点流的子类,处理流的子类必须传入节点流的子类。主要是简化操作和提高性能
  • 关系:节点流处于第一线,所有的操作都通过他们进行操作,处理流是进行简化

转换流

  • InputStreamReader:是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。
  • OutputStreamWriter:是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集讲字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。

字节数组流

  • 字节数组输入流ByteArrayInputStream:在内存中创建一个字节数组缓冲区,从输入流中读取的数据保存在字节数组缓冲区中,从字节数组中读取数据。
  • 字节数组输出流ByteArrayOutputStream:在创建字节数组输出流的同时,内存会为该输出流创建一个默认大小的字节数组,用来存储写入的字节内容。
  • 使用字节数组时会使用到多态,也就是方法的重写。
  • 所有的东西都可以读到字节数组
  • 字节数组:是一个内存,与操作系统无关,数组流无需关闭,字节数组为二进制,量少,否则内存会爆满,转换为字节数组后方便网络的传输

缓冲流

  • 字节缓冲流:BufferedInputStream和BufferedOutputStream
  • 字符缓冲流:BufferedReader和BufferedWriter
    手动释放规则,从里到外释放

Serializable接口

  • Serializable接口是一种标记接口,实现这个接口可以启动java序列化机制,自动完成存储对象和数组的过程。
  • 存储对象的过程称为对象序列化,读取对象的过程称为对象的反序列化。
  • 序列化:序列化是处理对象流的一种机制,将对象转化为二进制文件存到硬盘上
  • 反序列化:是将保存在硬盘上的对象二进制文件转化为对象读到程序中
  • 要实现对象的序列化必须实现Serializable接口,该接口没有任何方法,可以理解为一个标记,表明这个类是可序列化的。
  • SerivalVersionUID字段的作用:这是版本号,保持版本号一直来进行序列化,防止序列化出错。

关闭流

  • 在实际开发中,经常会在程序中打开一些物理资源,如数据库的连接,网络连接,磁盘文件等,打开这些资源呢必须显示关闭,否则会引起的资源泄露。
  • JVM中的垃圾回收机制属于java内存管理的一部分,他只回收堆内存中分配出来的内存,至于程序中打开的物理资源垃圾回收机制是无能为力的。

不关闭流的影响

如果不关闭资源或者不正确的关闭资源,会导致程序还在占用着资源,浪费资源,随着运行时间的加倍,一方面会内存泄露,另一方面会导致其他资源的代码获取不到资源,这样获取资源的线程会在获取资源上卡住。

关于资源泄露

  • 资源是存在于内存中的,资源泄露也叫做内存泄露。还有一种特指的内存泄露,指的是动态分配得到一个内存块,在使用完成后,忘记释放,这是单纯的内存泄露。
  • 操作系统规定,进程申请的内存,只要没释放,且进程没有中止,那么这个内存就是属于进程的,这块内存就不能被其他进程所使用。如果你之前申请的内存,在使用完后没有释放,然后又重新申请,这样之前的内存没有任何指针指向,也就无法操作,对于你的进程来说,这个内存就丢失了

如何关闭流

//使用可变参数关闭流
public static void clo(Closeable...ios) {
		for(Closeable io:ios)
		if(null != io)
			try {
				io.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}
//使用try-with-resources方法关闭流
	try(inputStream;outputStream){
		//inputStream;outputStream为要释放的资源
	}

猜你喜欢

转载自blog.csdn.net/qq_41357573/article/details/85620284