欢迎光临
我们一直在努力

IO流(二):

IO流资源释放

3.1 JDK7以前的资源释放

在JDK7版本以前,我们可以使用try…catch…finally语句来处理。格式如下:

try{
    // 有可能产生异常的代码
}catch(异常类 e){
    // 处理异常的代码
}finally{
    // 释放资源的代码
    // finally里面的代码有一个特点,无论try中的程序是正常执行了,还是出现了异常,最后都一定会执行finally区,除非JVM终止。
    // 作用:一般用于在程序执行完成后进行资源的释放操作(专业级做法)
}

public class FinallyTest {
public static void main(String[] args) {
try {
System.out.println(10 / 2);
// System.out.println(10 / 0);
// return; // 跳出方法的执行 finally也会执行
// System.exit(0); // 只要终止虚拟机finally就不再执行了
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("——-finally——-");
}
// 思考: 如果不添加finally 放在try…catch…外边是否可以呢? 一旦出现return就不行了
// System.out.println("——-Finally——-");

System.out.println(chu(10, 5));
}

public static int chu(int a, int b){
try {
return a / b;
} catch (Exception e){
e.printStackTrace();
return -1; // 代表的是出现异常
} finally {
// 千万不要在finally中返回数据
// return 111;
}
}
}

改造上面的代码:

public class CopyDemo1 {
public static void main(String[] args) {
// 需求:复制照片。
InputStream is = null;
OutputStream os = null;
try {
// 1、创建一个字节输入流管道与源文件接通
is = new FileInputStream("D:/resource/meinv.png");
// 2、创建一个字节输出流管道与目标文件接通。
os = new FileOutputStream("E:/data//meinv.png");

System.out.println(10 / 0);

// 3、创建一个字节数组,负责转移字节数据。
byte[] buffer = new byte[1024];
// 4、从字节输入流中读取字节数据,写出去到字节输出流中。读多少写出去多少。
int len;
while ((len = is.read(buffer)) != -1){
os.write(buffer, 0, len);
}
System.out.println("复制完成!!");
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
/**
* 在释放资源时需要考虑两个问题:
* 1. 在try代码块中是否存在关闭流的情况
* 2. 在创建流对象时是否存在异常的情况
*/
try {
if (os != null) os.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
try {
if (is != null) is.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}

3.2 JDK7以后的资源释放

格式如下:

try(资源对象1; 资源对象2;){
    可能出现异常的代码;
}catch(异常类 e){
    处理异常的代码
}
() 中只能放置资源,否则报错
    
什么是资源呢?
    资源一般指的是最终实现了AutoCloseable接口。
public abstract class InputStream implements Closeable{ }
public abstract class OutputStream implements Closeable, Flushable { }
public interface Closeable extends AutoCloseable { }

//注意:这里没有释放资源的代码。该资源使用完毕后,会自动调用其close()方法,完成对资源的释放!

/**
* 目标:掌握释放资源的方式:try-with-resource
*/
public class CopyDemo2 {
public static void main(String[] args) {
// 需求:复制照片。
try (
// 1、创建一个字节输入流管道与源文件接通
InputStream is = new FileInputStream("D:/resource/meinv.png");
// 2、创建一个字节输出流管道与目标文件接通。
OutputStream os = new FileOutputStream("E:/data//meinv.png");
){
// 3、创建一个字节数组,负责转移字节数据。
byte[] buffer = new byte[1024];
// 4、从字节输入流中读取字节数据,写出去到字节输出流中。读多少写出去多少。
int len; // 记住每次读取了多少个字节。
while ((len = is.read(buffer)) != -1){
os.write(buffer, 0, len);
}
System.out.println("复制完成!!");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

四、字符流

4.1 FileReader类

FileReader读取文件的步骤如下:

第一步:创建FileReader对象与要读取的源文件接通
第二步:调用read()方法读取文件中的字符
第三步:调用close()方法关闭流

/**
* 目标:掌握文件字符输入流。
*/
public class FileReaderTest {
public static void main(String[] args) {
try (
// 1、创建一个文件字符输入流管道与源文件接通
Reader fr = new FileReader("day11_io\\\\src\\\\sy01.txt");
){
// 2、一个字符一个字符的读(性能较差)
/*int len; // 记住每次读取的字符编号。
while ((len = fr.read()) != -1){
System.out.print((char) len);
}*/

/**
* 每次读取一个字符的形式,性能肯定是比较差的。
* 3、每次读取多个字符。(性能是比较不错的!)
*/
char[] buffer = new char[3];
int len; // 记住每次读取了多少个字符。
while ((len = fr.read(buffer)) != -1){
// 读取多少倒出多少
String str = new String(buffer, 0, len);
System.out.print(str);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

4.2 FileWriter类

FileWriter往文件中写字符数据的步骤如下:

第一步:创建FileWirter对象与要读取的目标文件接通
第二步:调用write(字符数据/字符数组/字符串)方法读取文件中的字符
第三步:调用close()方法关闭流

/**
* 目标:掌握文件字符输出流:写字符数据出去
*/
public class FileWriterTest {
public static void main(String[] args) {
try (
// 0、创建一个文件字符输出流管道与目标文件接通。
// 覆盖管道
//Writer fw = new FileWriter("day11_io\\\\src\\\\sy02.txt");
// 追加数据的管道
Writer fw = new FileWriter("day11_io\\\\src\\\\sy02.txt", true);
){
// 1、写一个字符出去
fw.write('a');
fw.write(97);
//fw.write('东'); // 写一个字符出去
fw.write("\\r\\n"); // 换行

// 2、写一个字符串出去
fw.write("我爱你中国abc");
fw.write("\\r\\n");

// 3、写字符串的一部分出去
fw.write("我爱你中国abc", 0, 5);
fw.write("\\r\\n");

// 4、写一个字符数组出去
char[] buffer = {'胜', '雅', 'a', 'b', 'c'};
fw.write(buffer);
fw.write("\\r\\n");

// 5、写字符数组的一部分出去
fw.write(buffer, 0, 2);
fw.write("\\r\\n");
} catch (Exception e) {
e.printStackTrace();
}
}
}

赞(0)
未经允许不得转载:171主机测评 » IO流(二):
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址