java的stram流操作
垃圾回收(GC)的特别说明
- 垃圾回收机制只负责回收堆内存资源,不会回收任何物理资源
- 程序无法精确控制垃圾回收动作的具体发生时间
- 在垃圾回收之前,总会先调用它的finalize方法
常见的需要手动释放的物理资源
- 文件/流资源
- 套接字资源
- 数据库连接资源
物理资源不手动释放有哪些问题
- 资源被长时间无效占用
- 超过最大限制后,将无资源可用
- 导致系统无法正常运行
流的组成
jdk7之前和jdk7之后的文件拷贝功能案例说明
jdk7之前案例
import org.junit.Test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* JDK7之前的文件拷贝功能
*/
public class FileCopyTest {
@Test
public void copyFile() {
/**
* 1. 创建输入/输出流
* 2. 执行文件拷贝,读取文件内容,写入到另一个文件中
* 3. **关闭文件流资源**
*/
// 定义输入路径和输出路径
String originalUrl = "D:\\kaifa\\rxyx-sys-2017\\lxi-java\\mk996\\src\\test\\java\\file\\lib\\FileCopyTest.java";
String targetUrl = "D:\\kaifa\\rxyx-sys-2017\\lxi-java\\mk996\\src\\test\\java\\file\\targetTest\\target.txt";
// 声明文件输入流,文件输出流
FileInputStream originalFileInputStream = null;
FileOutputStream targetFileOutputStream = null;
try {
// 实例化文件流对象
originalFileInputStream =
new FileInputStream(originalUrl);
targetFileOutputStream =
new FileOutputStream(targetUrl);
// 读取的字节信息
int content;
// 迭代,读取/写入字节
while ((content = originalFileInputStream.read()) != -1) {
targetFileOutputStream.write(content);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭流资源
if (targetFileOutputStream != null) {
try {
targetFileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (originalFileInputStream != null) {
try {
originalFileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
jdk7之后案例
/**
* 基于JDK7之后,实现正确关闭流资源方法
* try - with - resource
*/
public class NewFileCopyTest {
@Test
public void copyFile() {
// 先定义输入/输出路径
String originalUrl = "D:\\kaifa\\rxyx-sys-2017\\lxi-java\\mk996\\src\\test\\java\\file\\lib\\FileCopyTest.java";
String targetUrl = "D:\\kaifa\\rxyx-sys-2017\\lxi-java\\mk996\\src\\test\\java\\file\\targetTest\\target.txt";
// 初始化输入/输出流对象
try (
FileInputStream originalFileInputStream =
new FileInputStream(originalUrl);
FileOutputStream targetFileOutputStream =
new FileOutputStream(targetUrl);
) {
int content;
// 迭代,拷贝数据
while ((content = originalFileInputStream.read()) != -1) {
targetFileOutputStream.write(content);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
jdk7之后的try-with-resource使用
是 JDK 7 中一个新的异常处理机制,它能够很容易地关闭在 try-catch 语句块中使用的资源。所谓的资源(resource)是指在程序完成后,必须关闭的对象。try-with-resources 语句确保了每个资源在语句结束时关闭。所有实现了 java.lang.AutoCloseable 接口(其中,它包括实现了 java.io.Closeable 的所有对象),可以使用作为资源。
- 多资源自动关闭
- 实现AutoCloseable接口
- 避免异常屏蔽
资源关闭顺序问题
- 先开后关原则
- 从外到内的原则
- 底层资源单独声明原则
资源关闭特殊情况
- 资源对象被return的情况下,由调用方关闭
- bytearrayinputstream等不需要检查关闭的资源对象
- 使用scoket获取的IputStream和OutputStream对象不需要关闭