Java的file.close()放在finally代码块报错

在学习Java的IO部分时有如下代码:

import java.io.*;
public class InputFile {
    public static void main(String [] args){
        int a = 0;
        FileInputStream file = null;
        try {
            file = new FileInputStream("G:\\java\\InputFile\\src\\InputFile.java");     //(1)     
            while((a = file.read()) != -1){
                System.out.print((char)a);
            }
           
        } catch (IOException e){
            System.out.println("文件读取错误");
            System.exit(-1);
        }
        finally{
            if(file != null){
            file.close();
            }
        }
    }
}

 


一般都要将关闭资源.close()放在finally代码块中,防止try中发生异常资源没有关闭,可上边代码报了IOException错误,当file.close();写在try块最后就没有问题,原因是我把文件声名
FileInputStream file = null;
放在try块的外面,如果try中(1)执行失败,将会抛出NullPointerException异常,此时file==null,不会执行file.close();如果(1)成功,关闭file时会抛出IOException异常,Java要求必须处理,所以需要在finally加一个try-catch块。

finally{
            if(file != null){
                try{
                    file.close();
                    }
                catch(IOException e){}
                }
        }

 


  或者用java7或更晚的版本中出现的try-with-resources:

import java.io.*;
public class InputFile {
    public static void main(String [] args){
        int a = 0;
        
        try (FileInputStream file = new FileInputStream("G:\\java\\InputFile\\src\\InputFile.java"))
        {        
            while((a = file.read()) != -1){
                System.out.print((char)a);
            }
            file.close();
        } catch (IOException e){
            System.out.println("文件读取错误");
            System.exit(-1);
        }    
        
    }
}

 

总结:1.声明FileInputStream需要在try块外保证finally能访问到
2.声名时必须赋初值,否则如果在new时错误将出现编译错误
3.file.close()会抛出IOException异常,需要处理
4.java7的新特性try-with-resources,
try(try-with-resources){
}
在try-with-resources中声名资源,java会帮我们自动关闭,这是一种比较简单的处理方式

转载于:https://www.cnblogs.com/atongmumu/p/6430540.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java.net.SocketException: Connection reset at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:323) at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350) at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803) at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966) at java.base/java.io.InputStream.read(InputStream.java:218) at SSocket/com.cuc.socketfile.FileClinet.<init>(FileClinet.java:19) at SSocket/com.cuc.socketfile.FileClinet.main(FileClinet.java:40)网络没问题但就是连接出会不会是代码问题以下第一个是我的服务器代码,第二个是我的客户端代码package com.cuc.socketfile; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class FileServer { ServerSocket server; Socket socket; public FileServer() { FileInputStream file = null; try { server = new ServerSocket(6634); socket = server.accept(); OutputStream out = socket.getOutputStream(); file = new FileInputStream("src/s.txt"); byte buffer[] = new byte[1024]; int len = 0; while ((len=file.read(buffer)) != -1) { out.write(buffer, 0, len); out.flush(); } socket.shutdownInput(); } catch (IOException e) { e.printStackTrace(); }finally { if (file != null) { try { file.close(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } } } public static void main(String[] args) { new FileServer(); } }客户端代码如下package com.cuc.socketfile; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.Socket; import java.net.UnknownHostException; public class FileClinet { Socket socket; public FileClinet() { FileOutputStream file = null; try { socket = new Socket("127.0.0.1", 6634); InputStream in = socket.getInputStream(); file = new FileOutputStream("5237.file"); byte buffer[] = new byte[1024]; int len = 0; while (((len = in.read(buffer)) != -1)) { file.write(buffer, 0, len); file.flush(); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { if (file == null) { try { file.close(); socket.close(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } } } public static void main(String[] args) { new FileClinet(); } }
05-11

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值