`
1021082712
  • 浏览: 84216 次
  • 性别: 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 的区别

    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 ...

    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项目超市

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

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

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

    SocketInputStream.java

    深入剖析tomcat第三章SocketInputStream源码 * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/util/StringManager.java,v 1.2 2001/07/22 20:25:14 pier Exp $ * $Revision: 1.2...

    计算机网络实验报告 获取MAC socket通信

    java.io.InputStream is = new java.io.DataInputStream( sk.getInputStream()); // 接受网络输入流 写入文件 int len = 0; byte[] buff = new byte[1024]; while((len=is.read(buff))!=-1){ fos....

    java7源码-JavaIO:JavaIO

    java.io.InputStream java.io.OutputStream java.io.Reader java.io.Writer 4. FileInputStream和FileOutputStream是什么? 这是在拷贝文件操作的时候,经常用的两个类。在处理小文件的时候,它们的性能还不错,在大...

    java网络编程抓取指定网页信息--UrlHtml(java源码)

    import java.io.DataInputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; public class UrlHtml { @SuppressWarnings("deprecation") public ...

    java网络编程示例

    import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class TCPServer { public static void main(String[] args) { try { ServerSocket socket = new ...

    Java设计模式

    ● java.io.InputStreamReader(InputStream) ● java.io.OutputStreamWriter(OutputStream) ● javax.xml.bind.annotation.adapters.XmlAdapter#marshal() ● javax.xml.bind.annotation.adapters.XmlAdapter#...

    htmlparser下载网页

    java.io.InputStream l_urlStream; java.net.URL l_url = new java.net.URL( "http://sports.sina.com.cn/iframe/nba/live/"); java.net.HttpURLConnection l_connection = (java.net.HttpURLConnection) l_url ....

    读取sd卡图片

    import java.io.InputStream; import android.graphics.Bitmap; import android.graphics.BitmapFactory; public class ImageUtil { /** * 获取网络address地址对应的图片 * @param address * @return bitmap的...

    Java学习测试题,看你会多少(主要基础类)

    import java.io.InputStream; import java.util.Properties; /** *@authorleno *单子模式,保证在整个应用期间只加载一次配置属性文件 */ publicclass Singleton { privatestatic Singleton instance; ...

    restream:用于缓冲和重新读取 java.io.InputStream 的实用程序类

    转播用于缓冲和重新读取 java.io.InputStream 的实用程序类

    Struts Updownload 源码

    import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; ...

    txt读取文本

    import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class FileTxt { public static void main(String[] args) { String path = "D:\\...

    传智博客jdbc学习案例

    import java.io.InputStream; import java.util.Properties; /** * * 2008-12-6 * * @author <a href="mailto:liyongibm@gmail.com">liyong</a> * */ public class DaoFactory { private static UserDao ...

    aesjava源码-THIS-.-IS-GREAT-:////IntelliJIDEA从.class文件重新创建的源代码//(由Fernflo

    导入java.io.InputStream; 导入java.io.NotSerializableException; 导入java.io.ObjectStreamException; 导入java.io.Serializable; 导入java.security.AccessController; 导入java.security.AuthProvider; 导入java...

    java解析给定url

    import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL...

Global site tag (gtag.js) - Google Analytics