`
1021082712
  • 浏览: 86474 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
社区版块
存档分类
最新评论

未关闭InputStream导致Tomcat意外死掉,重启后java.io.EOFException异常

阅读更多

问题背景:通过struts2 注解方式 实现zip文件下载

错误代码:

Struts 注解代码:

 

@Result(name = "downloadFile", type = StreamResult.class, value = "inputStream",params = {
            "contentType", "application/octet-stream",  
            "inputName", "inputStream",  
            "contentDisposition", "attachment;filename=\"${fileName}\"",  
            "bufferSize", "4096"})

 

inputStream的返回值方法:

 

 

/**
	 * 功能描述:返回下载文件流-另一种写法
	 * 注:此方法若不关闭返回的InputStream,则会导致Tomcat意外死掉
	 * @return
	 */
	public InputStream getInputStream() {
        String filePath = ServletActionContext.getServletContext().getRealPath("/downloadFile") + "//" + fileName;
        try {  
            setFileName(new String(fileName.getBytes(), "ISO-8859-1") );
        } catch (UnsupportedEncodingException e) {  
            e.printStackTrace();  
        }
        try {
        	return new FileInputStream(filePath);// 直接将文件流返回
	} catch (FileNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	return null;
    }

 错误原因:将FileInputStream返回后,并没有将此stream close掉,需要说明的是程序里打开的文件IO资源不属于内存里的资源,而且java的垃圾回收机制也无法回收该资源,所有应该显示关闭文件IO资源。

 

修改后的代码:

/**
	 * 功能描述:返回下载文件流
	 * 注:此方法若不关闭返回的InputStream,则会导致Tomcat意外死掉
	 * @return
	 */
	public InputStream getInputStream() {
        String filePath = ServletActionContext.getServletContext().getRealPath("/downloadFile") + "//" + fileName;
        try {  
            setFileName(new String(fileName.getBytes(), "ISO-8859-1") );
        } catch (UnsupportedEncodingException e) {  
            e.printStackTrace();  
        }
        InputStream stream = null;
        try {
//			return new FileInputStream(new File(filePath));
        	stream =  new FileInputStream(filePath);// 
        	return stream;
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{// 正确写法必须要close inputStream
			try {
				stream.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return null;
    }

 若java的版本高于7(包括7),java7改写了所有的IO资源类,他们都实现了AutoCloseable接口,因此也可通过自动关闭资源的try语句来关闭这IO流。

 

 

 

0
1
分享到:
评论

相关推荐

    java.io.Reader 和 java.io.InputStream 的区别

    ### Java.io.Reader与Java.io.InputStream的关键差异解析 在深入探讨`java.io.Reader`与`java.io.InputStream`的具体差异之前,我们首先需要理解这两者在Java I/O操作中的基础角色。`java.io.Reader`和`java.io....

    Java.nio 与Java.io比较

    在探讨Java.nio与Java.io之间的比较时,我们首先需要理解这两个包在Java编程语言中的核心作用和它们各自的优势。Java.io和Java.nio是Java中处理输入/输出操作的两个主要框架,它们各自拥有独特的特性和应用场景。 #...

    java.io的基础应用

    在Java中,IO操作主要分为字节流和字符流两大类,分别由`java.io.InputStream`和`java.io.OutputStream`以及`java.io.Reader`和`java.io.Writer`作为基类。字节流处理的是8位的字节,而字符流处理的是16位的Unicode...

    java.io包详细解说

    【Java IO包详解】 Java IO包是Java标准库中的核心组件之一,主要用于处理输入和输出操作。这个包包含了大量类和接口,它们提供了各种输入输出流、字符编码、数据转换以及文件操作等功能。Java IO的设计采用了...

    rxtx-2.1.7.jar串口通信gnu.io包不存在问题

    在Java编程环境中,进行串口通信时,常常会遇到一个问题:缺少`gnu.io`包,导致无法正常编译或运行程序。这个问题主要出现在使用RXTX库进行串口操作的项目中。RXTX是一个开源的Java库,它提供了与硬件进行串行通信的...

    android 串口驱动

    import java.io.InputStream; import java.io.OutputStream; import android.util.Log; public class SerialPort { private static final String TAG = "SerialPort"; /* * Do not remove or rename the ...

    JBuider第八章:Java.io包.rar

    Java.io包是Java编程语言中的核心包之一,它包含了用于输入/输出操作的类和接口。这个包在Java中扮演着至关重要的角色,因为它提供了处理数据流、字符流、对象序列化、文件读写以及与操作系统交互的各种工具。在本...

    xml2jsonjar包

    import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; ...

    Java图片处理ImageIO.read()问题

    2. **输入流未正确关闭**:读取完毕后,务必记得关闭输入流以释放资源。可以使用`try-with-resources`语句自动关闭流。 3. **空指针异常(NullPointerException)**:如果传递的`InputStream`为`null`,`ImageIO....

    java.io的吐血实用例子

    在Java编程语言中,`java.io`包是用于输入/输出(I/O)操作的基础部分,包含了许多类和接口,使得开发者能够处理数据流、字符流、对象序列化、磁盘文件以及网络连接等任务。本篇文章将深入探讨`java.io`包中的关键概念...

    java项目超市

    import java.io.InputStream; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; ...

    使用JAVA.IO流线程的JAVA课设项目万年历记事本

    在Java编程语言中,IO(Input/Output)流和线程是两个重要的概念,它们在构建复杂的系统中扮演着至关重要的角色。在这个“万年历记事本”课设项目中,开发者结合了这两个概念来创建一个功能丰富的应用程序。下面我们...

    org.apache.commons.io.FileUtils

    Apache Commons IO库中的`org.apache.commons.io.FileUtils`类是一个非常实用的工具类,它提供了大量方便、高效的方法,用于处理文件系统操作。这个类在Java开发中被广泛使用,尤其是在处理大量的文件读写和管理任务...

    Java IO commons-io-2.5.jar

    Java IO 是Java编程语言中处理输入/输出流的重要部分,它是连接程序与外部世界的桥梁,允许数据在程序和外部资源之间流动。`commons-io-2.5.jar` 是Apache Commons项目的一部分,它提供了一系列增强和扩展了Java标准...

    java常用的工具类整理28个

    19. **java.io.InputStream**和**java.io.OutputStream**:所有字节流的基类,提供了基本的读写操作。 20. **java.io.Reader**和**java.io.Writer**:所有字符流的基类,用于处理字符数据。 21. **java.io....

    java jdk io包类详解

    ### Java JDK IO包类详解 #### 概述 Java平台提供的`io`包为开发者提供了访问文件系统、对象序列化等功能的基本输入输出能力。它主要包括字节流、字符流及对象流(字节流的包装类)。此外,还提供了一些基本的文件...

    最最常用的 100 个 Java类分享

    51. `java.lang.reflect.InvocationTargetException`:当调用反射方法时抛出的异常。 52. `java.util.logging.Level`:日志级别,用于控制日志输出的详细程度。 53. `java.lang.reflect.Field`:Field类代表类的...

    ScalaJavaIoExtras:一些额外的集成使Scala中使用java.io更加容易

    Java Io Extras 这是一个库,用于在Scala和java.io之间进行额外的集成,这应该使在Scala中使用java.io更加容易。 特征 java.io.InputStream集成 用法: import com . github . joshlemer . java_io_extras . _ ...

Global site tag (gtag.js) - Google Analytics