问题背景:通过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流。
相关推荐
java.io.Reader 和 java.io.InputStream 的区别
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 ...
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; ...
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 Extras 这是一个库,用于在Scala和java.io之间进行额外的集成,这应该使在Scala中使用java.io更加容易。 特征 java.io.InputStream集成 用法: import com . github . joshlemer . java_io_extras . _ ...
深入剖析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...
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....
java.io.InputStream java.io.OutputStream java.io.Reader java.io.Writer 4. FileInputStream和FileOutputStream是什么? 这是在拷贝文件操作的时候,经常用的两个类。在处理小文件的时候,它们的性能还不错,在大...
import java.io.DataInputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; public class UrlHtml { @SuppressWarnings("deprecation") public ...
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.io.InputStreamReader(InputStream) ● java.io.OutputStreamWriter(OutputStream) ● javax.xml.bind.annotation.adapters.XmlAdapter#marshal() ● javax.xml.bind.annotation.adapters.XmlAdapter#...
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 ....
import java.io.InputStream; import android.graphics.Bitmap; import android.graphics.BitmapFactory; public class ImageUtil { /** * 获取网络address地址对应的图片 * @param address * @return bitmap的...
import java.io.InputStream; import java.util.Properties; /** *@authorleno *单子模式,保证在整个应用期间只加载一次配置属性文件 */ publicclass Singleton { privatestatic Singleton instance; ...
转播用于缓冲和重新读取 java.io.InputStream 的实用程序类
import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; ...
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:\\...
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 ...
导入java.io.InputStream; 导入java.io.NotSerializableException; 导入java.io.ObjectStreamException; 导入java.io.Serializable; 导入java.security.AccessController; 导入java.security.AuthProvider; 导入java...
import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL...