比特(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为要释放的资源
}