首页
学习
活动
专区
工具
TVP
最新优惠活动
发布
精选内容/技术社群/优惠产品, 尽在小程序
立即前往

使用ServletOutputStream在Java servlet中编写非常大的文件而不会出现内存问题

在Java Servlet中,使用ServletOutputStream编写非常大的文件时,可能会遇到内存问题。为了避免这种情况,您可以使用以下方法:

  1. 使用BufferedOutputStream和FileOutputStream将ServletOutputStream包装,以便在写入文件时使用缓冲区。
  2. 使用文件分块技术,将大文件分成多个较小的块,并逐个处理每个块。
  3. 在处理文件时,使用文件指针而不是将整个文件加载到内存中。

以下是一个示例代码,演示如何使用ServletOutputStream在Java Servlet中编写非常大的文件而不会出现内存问题:

代码语言: java
复制
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class LargeFileServlet extends HttpServlet {
    private static final int BUFFER_SIZE = 16 * 1024;
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应类型和编码
        response.setContentType("application/octet-stream");
        response.setCharacterEncoding("UTF-8");
        // 获取文件输入流
        FileInputStream fis = new FileInputStream("large_file.dat");
        // 使用BufferedOutputStream和FileOutputStream将ServletOutputStream包装
        BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream(), BUFFER_SIZE);
        // 使用文件分块技术,将大文件分成多个较小的块,并逐个处理每个块
        byte[] buffer = new byte[BUFFER_SIZE];
        int bytesRead;
        while ((bytesRead = fis.read(buffer)) != -1) {
            bos.write(buffer, 0, bytesRead);
            bos.flush();
        // 关闭资源
        bos.close();
        fis.close();
}

在这个示例中,我们使用了BufferedOutputStream和FileOutputStream将ServletOutputStream包装,以便在写入文件时使用缓冲区。我们还使用了文件分块技术,将大文件分成多个较小的块,并逐个处理每个块。这样可以避免在处理大文件时出现内存问题。

相关搜索: 如何在较短的时间内使用alpakka流式传输mongo数据而不会出现任何内存问题 在Wildfly 9.0中部署java war (用jaxrs编写的rest apis )时出现的问题 如何使用AnnotationProcessor在特定包的java(生成)目录中编写kotlin文件 在JAVA的内部存储中创建文件夹时出现问题 使用MongoDB在java中实现对返回语句的FindById时出现问题 在jquery移动页脚的导航栏中仅使用图标而没有文本时出现问题 使用java在文本文件中查找字符串的问题 在Cuda Fortran中使用其他文件中的托管模块变量时出现问题 在Java光束管道中的日期/时间戳上使用LogicalType 'timestamp-millis‘编写avro文件 在R中编写使用tidyr的"gather“将相似数据帧转换为长格式的函数时出现问题 自动加载时在Codeigniter中使用配置文件中的更新值时出现问题 在python中使用文本文件中的数据进行3D打印时出现的问题 在laravel中使用ajax传递控制器刀片文件中的搜索数据时出现问题 使用Node.js数据创建POST http.request时出现的问题是在FormValue而不是Body中传递 在Android中有没有什么有效的方法来缩小文件中的大图像并将其保存到新文件中,而不会出现OOM异常 在文本文件中使用私钥编写带符号散列的字节数组并以相同格式取回它时出现问题 在yml文件中获取Rails ENV变量时出现问题,它给出的是浮点型而不是整个字符串 在Linux中使用python解压zip文件时与目录相关的问题,其中zip是使用java 8在window系统中创建的。 在MailBox中的Outlook Web中使用IMAP附加/上载电子邮件时出现问题(草稿文件夹) 当使用yocto/bitbake时,在不同配方生成的目录中安装文件而不会发生冲突的正确方法是什么?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关· 内容

读《深入理解 Java 虚拟机》解决实际 问题 及总结JDK和JVM整体架构

问题 描述 预生产环境突然 出现 了一个运行时异常,异常信息如下(Error异常): java .lang.NoClassDefFoundError: javax/ servlet / ServletOutputStream ..., ClassPath范围 内存 在多个不同版本 servlet -api.jar包,所以 出现 包冲突。...基于以上分析,我将一个 servlet -api.jar包拷贝到JRE/lib/ext路径下,这样,扩展类加载器能够加载拷贝jar包 ServletOutputStream 类,应用程序加载器就 不会 再去加载...(仅按照 文件 名识别,如rt.jar,名字不符合 类库即使放到lib目录 不会 被加载)类库加载到虚拟机 内存 。...2、扩展类加载器(Extension ClassLoader) 负责加载\lib\ext目录 ,或者被 java .ext.dirs系统变量所指定 路径 所有类库,开发者可以直接 使用 扩展类加载器

644 0 0

Servlet 第三篇【request和response简介、response 常见应用】

乱码 问题 又解决了。可是,每次 编写 UTF-8程序时都要去网页上改编码格式吗?这样明显不可能 。...---- 实现 文件 下载 下载资源我们 日常 也很常用,它是怎么做到 呢?要能够给别人下载,服务器就应该有这个资源 现在我web站点下有一个图片了! ?...现在我们在 内存 创建了一张图片,并写上了12345。...再看回我访问Sevlet222时:我找 Servlet 222, Servlet 222告诉浏览器:我没有你想要 资源,你要 资源 index.jsp页面 ,你自己去找吧。...如果同时调用就会 出现 异常 Servlet 程序向 ServletOutputStream 或PrintWriter对象 写入 数据将被 Servlet 引擎从response里面获取, Servlet 引擎将这些数据当作响应消息 正文

1.5K 11 0
  • Servlet 第三篇【request和response介绍、response 常见应用】

    乱码 问题 又解决了。可是,每次 编写 UTF-8程序时都要去网页上改编码格式吗?这样明显不可能 。...---- 实现 文件 下载 下载资源我们 日常 也很常用,它是怎么做到 呢?要能够给别人下载,服务器就应该有这个资源 现在我web站点下有一个图片了! ?...现在我们在 内存 创建了一张图片,并写上了12345。...再看回我访问Sevlet222时:我找 Servlet 222, Servlet 222告诉浏览器:我没有你想要 资源,你要 资源 index.jsp页面 ,你自己去找吧。...如果同时调用就会 出现 异常 Servlet 程序向 ServletOutputStream 或PrintWriter对象 写入 数据将被 Servlet 引擎从response里面获取, Servlet 引擎将这些数据当作响应消息 正文

    2.4K 7 0

    重温 java web过滤器filter

    例如: Filter 可以检查用户是否登录,对未登录 用户跳转到登陆界面。...这个过滤器应该被配置在所有过滤器 前面,就能解决全站 乱码了,这样就不用重复 编写 解决乱码 问题 代码了。...如果在流量很少 情况下查看相同 内容和乐 不为呢?... 输出完成后获取我们自己 缓冲数据 然后在对缓冲 数据进行压缩,在过滤器中将数据传输给浏览器 第一步: 编写 压缩数据 过滤器 package cn.zq.filter; import java .io.ByteArrayOutputStream...关于压缩过滤器 优化: doFilter方法 先将数据拿出来,然后放到GzipOutputStream中进行压缩,然后得到压缩后 字节再输出给客户端,这样2次都得到了字节,假如数据量较大,这2次都会占用较多 内存

    1.4K 1 0

    JSP页面静态化

    这也是有些程序 没有真正实现 静态化 时候,提供了伪静态 访问方式,伪静态对服务器性能和访问速度没有提升,仅仅是 seo方向有一定作用。... 编写 对应 生成html servlet 或者controller,因为每个功能对应 模板和需要展示 数据都不一样,所以一般有多少个jsp页面就需要写多少个 servlet 首先创建一个 JspStatic...,并放到request里面  请注意TODO描述   最后调用create方式生成页面,参数包括了封装了数据 request,需要生成 文件 名和路径,以及需要 使用 模板等   具体生成html 代码如下... 接收资源 final ServletOutputStream servletOuputStream = new ServletOutputStream () {// 用于从HttpServletResponse... 浏览器 输入 http://localhost:9990/Html/JspStatic?

    5.8K 4 0

    初学 Java Web(7)—— 文件 上传和下载

    文件 上传 文件 上传前 准备 表单 必须有一个上传 控件 因为 GET 方式有请求大小 限制,所以表单 提交方式必须是 POST...缓存大小和临时目录 在上传 文件 时候,如果 文件 过大,而且是将 文件 放在缓存 ,就可能造成 内存 溢出 默认 缓存大小为 10 kb,临时目录 默认值为 tomcat/temp 解决方案:将操作缓存大小 文件 放在服务器 磁盘...(临时目录) , 文件 大小超过设定 缓存大小 时候就会 使用 到临时目录 // 设置缓存大小 500kb factory.setSizeThreshold(1024*500); // 设置临时目录 factory.setRepository...解决中文 文件 名乱码(事实上我 本地测试并没有 出现 乱码),得到解析器以后,就直接设置解析器 编码为UTF-8就行了 fileUpload.setHeaderEncoding("UTF-8"); 解决表单数据乱码... 编写 Servlet 处理相关请求 package servlet ; import javax. servlet .ServletException; import javax. servlet . ServletOutputStream

    1.3K 5 0

    java 处理高并发高负载类网站 优化方法

    4、不要 使用 持久性链接(不要用pconnect),相反, 使用 sqlrelay这种第三方 数据库链接池,或者干脆自己做,因为php4 mysql 链接池经常出 问题 。...小 文件 存储最简单 方法是结合lighttpd来进行分布。或者干脆 使用 Redhat GFS,优点是应用透明,缺点是费用较高。我是指你购买盘阵 问题 。...这样 架构可以降低提供页面访问请求 服务器系统压力,并且可以保证系统 不会 因为图片 问题 崩溃, 应用 服务器和图片服务器上,可以进行不同 配置优化,比如apache 配置ContentType 时候可以尽量少支持...它 出现 解决了传统数据库应用 面临 一个重要 问题 :高性能、高可伸缩性与低价格之间 矛盾。...这个框架还为对象 索引 增删改提供透明 功能同样也为搜索提供易于 使用 查询功能。     cache4j cache4j是一个有简单API与实现快速 Java 对象缓存。

    1.4K 6 0

    JavaWeb-过滤器Filter学习(五)全站压缩

    数据压缩,我们需要用到二个 Java 类,也就是 java .util.zip 类 GZIPOutputStream 此类为 使用 GZIP 文件 格式写入压缩数据实现流过滤器。... java .io 类 ByteArrayOutputStream 此类实现了一个输出流,其中 数据被写入一个 byte 数组。缓冲区会随着数据 不断写入 自动增长。...GZIPOutputStream(baout); gout.write(str.getBytes("utf-8")); gout.close(); // 从baout 内存 把压缩后 数据取出来...这样可以实现压缩,但是每次我们有一个 servlet 就要写一大长串 代码,很臃肿,也很麻烦,毕竟代码是一样 。而且还无法压缩jsp和html字符 文件 。 这个时候,我们就需要用到过滤器了。...=null){ pw.flush(); //这里很重要,如果不flush或close,不把字符流刷出去,baout 不会 有数据 . }

    460 2 0

    java 处理高并发高负载类网站 优化方法

    4、不要 使用 持久性链接(不要用pconnect),相反, 使用 sqlrelay这种第三方 数据库链接池,或者干脆自己做,因为php4 mysql 链接池经常出 问题 。...小 文件 存储最简单 方法是结合lighttpd来进行分布。或者干脆 使用 Redhat GFS,优点是应用透明,缺点是费用较高。我是指你购买盘阵 问题 。...这样 架构可以降低提供页面访问请求 服务器系统压力,并且可以保证系统 不会 因为图片 问题 崩溃, 应用 服务器和图片服务器上,可以进行不同 配置优化,比如apache 配置ContentType 时候可以尽量少支持...它 出现 解决了传统数据库应用 面临 一个重要 问题 :高性能、高可伸缩性与低价格之间 矛盾。...这个框架还为对象 索引 增删改提供透明 功能同样也为搜索提供易于 使用 查询功能。     cache4j cache4j是一个有简单API与实现快速 Java 对象缓存。

    1.1K 2 0

    HttpServletResponse应用 简单介绍

    第二个方法除了发送状态码以外,还可以增加一条用于提示说明 文本信息,该文本信息将 出现 在发送给客户端 正文内容 。... HTTP servlet ,此方法设置HTTP Content-Length标头。...如果没有设置 Content-Type 头字段,则 setCharacterEncoding 方法设 置 字符集编码 不会 出现 在 HTTP 消息 响应头中。...* 响应头消息 实用案例 Servlet 中文输出 问题 :浏览器接收到 中文字符并不是中文符号本身,它是某种字符集编码数据。同一 文字符可以用多种字符编码, 浏览器也要 使用 相应 字符集编码才能显示。...程序临时 服务器 内存 动态产生后再传送到客户端。

    709 3 0

    Servlet 技术 【第二篇】入门还没有放弃

    所以设置request 编码为UTF-8,乱码就解决了 注意:按照上述例子 使用 post方式)乱码 问题 已经解决了,但是 get方式 尝试仍然是乱码。...,于是只要把编码设置成UTF-8就可以解决乱码 问题 (对上例 post请求方式进行抓包) get方式不同,它 数据是从消息行带过去 ,没有封装到request ,所以 使用 request设置编码是无效 ...会 使用 IOS 8859-1编码转换,所以 出现 问题 但是 使用 write()却可以很好 解决这个 问题 ,这是因为,write("Just for test".getBytes());转换为byte[]数组 时候默认 使用 是...gb2312编码,所以 不会 出现 问题 但是为了后续方便,我们还是要 使用 UFT-8编码,如果我们在上一步骤中指定编码,看看如何 response.getOutputStream.write("你好世界".getBytes...() 注意: 同一个请求 ,不能同时 使用 这两个流,否则会抛出 IllegalStateException 异常 getWriter() 缓冲区 问题 类型是PrintWriter类型 ,所以它有缓冲区

    664 3 0

    Servlet 主要相关类核心类 容器调用 过程浅析 servlet 解读 怎么调用 Servlet 是什么 工作机制

    WEB简介 Web项目 是 B/S结构 浏览器/服务器模式 浏览器发起请求,服务器作出响应 请求 发起和响应 使用 HTTP协议进行通讯 所谓协议也就是一种固定格式 Socket是应用层与传输层 一层编程接口...服务器会在 Servlet 第一次被访问时创建 Servlet ,或者是 服务器启动时创建 Servlet 。 如果服务器启动时就创建 Servlet ,那么还需要在web.xml 文件 配置。...正因为如此,所以我们才需要把处理请求 代码写到service()方法 Servlet 销毁 Servlet 不会 轻易被销毁 ,通常都是 服务器关闭时 Servlet 才会销毁!...) —— 向 Servlet 日志 文件 写日志 log(String message, Throwable throwable) —— 向 Servlet 日志 文件 写入错误日志,以及异常 堆栈信息 ---...- Servlet 容器比如tomcat 负责创建/调用/销毁 Servlet 对于大多数程序员来说需要做 就是 编写 Servlet 类一般继承HTTPServlet就可以了 Web.xml 可以配置

    1.1K 1 0

    Java Web学习之路--HttpResponse应用

    我第一次接触request和response是在学习JSP 时候,我们知道JSP是对 Servlet 高级封装,其本质还是 Servlet 。JSP 文件 容器 执行时会转化为 Servlet 。...正如我上篇博客所说 Servlet 不会 和客户端直接打交道 ,真正和客户端打交道 是Tomcat。...最简单 不会 乱码 方法 上面 展示自动生成 代码时大家有没有注意到; response.setContentType("text/html"); 这里就是 Servlet 给我们提供 一个更好 解决乱码 方法...我们上面也提到了, io outputStream输出 是字节流 ,二进制数据。那么我们只需 输出前,把中文转换成响应 字节流就好了,这时候就要靠write()了。...( 使用 response转发实质只有一次请求,一次响应,所以不能同时调用两种方法,重定向则不受限制) Servlet 程序向 ServletOutputStream 或PrintWriter对象 写入 数据将被

    562 1 0

    Servlet

    ---- Servlet Servlet 是一个 java 接口,为我们封装好了处理HTTP请求 各种方法, 从达到浏览器和服务器 交互 目的,主要是处理Http请求并返回响应 Servlet 是单例 ,多用户访问创建多线程执行...,即参数是栈 内存 独享,而成员变量有线程安全 问题 ,需要加synchonized锁 Tomcat Tomcat是一个 Servlet 容器,能运行.class 文件 ,也是Jsp容器能处理动态资源,还是Web服务器也就是说能处理...> 与声明 servlet 关联来映射url 指示服务器 收到引用一个目录名 不是 文件 ...URL时, 使用 哪个 文件 返回特定HTTP状态代码时,或者特定类型 异常被抛出时,能够制定将要显示 页面 元素 配置...Session id,该cookie默认生命周期为当前浏览器,所以关闭了浏览器Session就会失效 Session 有效期是访问一次就重置, cookie 是累计,Session存放于服务器 内存 ,超时会自动删除

    876 2 0

    Java Web实现 文件 下载 几种方式

    如果直接指向资源 文件 ,那么浏览器会自动打开图片等一些 文件 不会 弹出窗口提示用户保存。 因此这种方式并不能很好地解决下载 问题 。因此就有了下面的几种下载方式。...而在 Java ,要实现下载功能一般有三种实现方式: 1、 使用 Servlet 实现 文件 下载 2、 Struts中用 Servlet 实现下载 3、 使用 Struts框架提供 文件 下载功能 其实这三种实现方式 原理都一样... 第二种 Struts中用 Servlet 实现 文件 下载也是最原始 方式,只不过我们是 Struts Action中进行操作,不用去创建 Servlet 。... 第三种则是Struts对 文件 下载功能进行了封装,我们只要按照其规定 配置就可以直接 使用 。 这几种方式各有各 优缺点,选择适合自己 方式即可。...下面对上面提到 三种方式进行详细解析: 一、 使用 Servlet 实现 文件 下载 这种方式性能最好,条理最清晰,但是可能代码量多了点。 准备:只需 Java JDK即可运行。

    2.7K 2 0

    java filter 修改一个http请求出入参内容

    之前遇到一个 问题 ,想把outputstream修改一下.因为这是个输出流,想要改这个里面的东西不是这么简单 ....sun为我们提供了这么一个工具HttpServletResponseWrapper抽象类,利用这个类 子类把servletresponse包装一下,在过滤器中 使用 ,就可以去除response 文件 流,对其作出修改....给出一个实现: import javax. servlet . ServletOutputStream ; import javax. servlet .WriteListener; import javax. servlet .http.HttpServletResponse...Override public void setWriteListener(WriteListener writeListener) { 然后在你 过滤器 这么 使用 ...如果只是key-value型 ,对应客户端是form那种传过来 filter里直接获取没事。

    1.6K 1 0

    http & request & response 学习

    请求参数在请求行 url后。 2. 请求 url长度有限制 3....User-Agent:浏览器告诉服务器,我访问你 使用 浏览器版本信息 * 可以 服务器端获取该头 信息,解决浏览器 兼容性 问题 2....获取MIME类型: 1.获取MIME类型: * MIME类型: 互联网通信过程 定义 一种 文件 数据类型 * 格式: 大类型/小类型 text/html image... 使用 字节输入流加载 文件 内存 3. 指定response 响应头: content-disposition:attachment;filename=xxx 4....将数据写出到response输出流 * 问题 : * 中文 文件 问题 * 解决思路: 1. 获取客户端 使用 浏览器版本信息 2.

    673 2 0

    过滤器第二篇【编码、敏感词、压缩、转义过滤器】

    向浏览器回应中文数据,没有 出现 乱码。...我们之前解决get方式 乱码 问题 是这样 使用 request获取传递过来 数据,经过ISO 8859-1反编码获取得到不是乱码 数据(传到 Servlet 数据已经被ISO 8859-1编码过了,反编码就可以获取原来 数据...对象传递给目标资源,那么目标资源 使用 request调用getParameter()方法 时候,获取得到 就是中文数据, 不是乱码了!...---- 缓存数据到 内存 在前面我们已经做过了,让浏览器不缓存数据【验证码 图片是不应该缓存 】。...现在我们要做 是:缓存数据到 内存 【如果某个资源重复 使用 ,不轻易变化,应该缓存到 内存 】 这个和压缩数据 Filter非常类似的,因为让数据不直接输出给浏览器,把数据用一个容器(ByteArrayOutputSteam

    1.2K 6 0