java 中IO关闭流

问题描述

public class Test_01 {public static void main(String[] args) {FileInputStream fis=null;try { fis=new FileInputStream("D:\workspace\TestIO\src\TestTO_01\TestFile.java"); byte[] buf=new byte[1024]; int c=0; try {while((c=fis.read(buf))>=0){System.out.write(buf); }} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}} catch (FileNotFoundException e) {e.printStackTrace();}finally{if(fis!=null){try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}} 红色的这个地方不能理解 fis不等于空? 然后又调用close来关闭这个流 假设fis等于空怎么办? 求解!

解决方案

你把文件路径:D:\workspace\TestIO\src\TestTO_01\TestFile.java改为一个不存在的路径,即:D:\workspace\TestIO\src\TestTO_01\TestFile111.java然后执行这段代码,你就会发现程序抛出:FileNotFoundException这个异常,但此时fis为null,而你的finally里面如果不对fis判断是否为空,则会抛出java.lang.NullPointerException异常。所以需要你在close之前,再增加判断语句:if(fis!=null)
解决方案二:
首先 ,你的代码有问题。因为FileNotFoundException继承了IOException,所以catch (FileNotFoundException e) 应该在catch (IOException e) 前。其次,fis == null 的情况是在 运行到new FileInputStream("D:\workspace\TestIO\src\TestTO_01\TestFile.java")时发生 FileNotFoundException。这样fis就没有被赋值。这时,如果finally块中直接执行fis.close,就会出现NullException如果是运行到 fis.read时,抛出IOException,则 null != fis。
解决方案三:
if(fis!=null){ try { fis.close(); } catch (IOException e) { e.printStackTrace(); } 不加也无所谓 加上的目的是如果打开时出问题 此时为null 就没必要再让它抛空指针了 性能比没有判断要好点
解决方案四:
不理解你为什么会不理解?finally这里就是要确保流能够被正确关闭。有两种可能1. fis打开了即非空,那么就必须关闭。2. fis根本就没打开即为null,那么就可以无视了。
解决方案五:
这里主要是确保释放资源的问题,这里fis不可能为空的,要是为空的话,则说明文件读取不到,也就是会IOException,结果可能是文件读取不到或者是其它问题导致的。程序根本不会执行的。

时间: 2024-09-22 00:31:38

java 中IO关闭流的相关文章

Java中IO流缓冲区的装饰模式的体现

一.Java中IO流缓冲区 import java.io.*; public class BufferedTest {public static void copy1(){InputStream is = null;OutputStream os = null;try{is = new FileInputStream("c:\\xy1.jpg");os = new FileOutputStream("d:\\xy2.jpg");int len = 0;byte[]

举例讲解Java中的Stream流概念_java

1.基本的输入流和输出流 流是 Java 中最重要的基本概念之一.文件读写.网络收发.进程通信,几乎所有需要输入输出的地方,都要用到流. 流是做什么用的呢?就是做输入输出用的.为什么输入输出要用"流"这种方式呢?因为程序输入输出的基本单位是字节,输入就是获取一串字节,输出就是发送一串字节.但是很多情况下,程序不可能接收所有的字节之后再进行处理,而是接收一点处理一点.比方你下载魔兽世界,不可能全部下载到内存里再保存到硬盘上,而是下载一点就保存一点.这时,流这种方式就非常适合. 在 Jav

对象-java中io等非托管资源close与赋值为null有什么区别

问题描述 java中io等非托管资源close与赋值为null有什么区别 io操作如果没有close而直接赋值为null有什么后果,而close之后又没有赋值为null,也就是还有对象的引用,那这个对象会不会释放内存,垃圾回收器会不会回收它 Reader reader = new InputstreamReader(new FileInputStream()); 如果reader.close()关闭了reader的资源 则FileInputStream的资源有没有关闭 ,没关闭的话如何关闭 解决

Java中窗口关闭事件。

问题描述 Java中窗口关闭事件. 程序代码如下: package com.packageTemp; import java.awt.event.*; import javax.swing.*; import java.awt.*; public class MouseAdapterTest { JFrame f=null; JButton btn=null; public static void main(String[] args) { new MouseAdapterTest(); } /

Java中IO流,输入输出流概述与总结

总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入流),或者抽象类Reader(字符输入流)的子类: 而所有输出流都是抽象类OutputStream(字节输出流)或者Writer(字符输出流)的子类. [首先需要明白的是:流是干什么的???(为了永久性的保存数据)   根据数据流向的不同分为输入流和输出流:   根据处理数据类型的不同分为字符流和字

Java中IO流知识点总结

一.流的分类 1.按功能分 读取流:InputStream Reader 写出流:OutPutStream Writer 2.按流的类型分类 字节流:InputStream OutputStream 字符流:Reader Writer 二.流功能分析 读取流是从输入设备或数据对象中读取数据到程序,用程序进行处理读入的数据,写出流是把程序处理的数据输出到 输出设备上比如硬盘和控制台. 字节流读取和写入的数据单位是字节,可以读取和写入任何类型的数据.字符流读取跟写入的数据单位是字符,只能 读取和 写

Java中的stream流的概念解析及实际运用总结_java

流是字节序列的抽象概念. 文件是数据的静态存储形式,而流是指数据传输时的形态. 流类分为两个大类:节点流类和过滤流类(也叫处理流类). 程序用于直接操作目标设备所对应的类叫节点流类,程序也可以通过一个间接流类去调用节点流类,以达到更加灵活方便地读取各种类型的数据,这个间接流类就是过滤流类(也叫处理流类),或者称为包装类. 包装类的调用过程如下图: 流分类的关系不管流的分类是多么的丰富和复杂,其根源来自于四个基本的类.这个四个类的关系如下: 字节流 字符流 输入流 InputStream Read

java中 IO 常用IO操作类继承结构分析_java

IO 常用IO操作类继承结构IO 字符流 Reader(源) BufferedReader LineNumberReaderInputStreamReader FileReader(字节流通向字符流的桥梁)      StringReader        Writer(目的) BufferedWriter      OutputStreamWriter FileWriter(字符流通向字节流的桥梁)      StringWriter 空      PrintWriter 空      字节流

java中IO操作 利用文件流 过滤流对文件进行读写操作

/* 两种基本的流是:输入流(Input Stream)和输出流(Output Stream) .可从中读出一系列字节的对象称为输入流. 而能向其中写入一系列字节的对象称为输出流. System.out.println   中的 out 是 PrintStream 类对象   System类的静态成员可以向 输出流写入数据 System.in.read()     in 是InputStream类的成员 可以从键盘等输入设备读取字节数据  利用FileInputStream   FileOutp