【发布时间】:2013-07-07 19:45:49
【问题描述】:
我非常了解 Java 库,所以当我意识到显然没有简单的方法可以用流来完成看似简单的事情时,我感到很惊讶。我正在尝试读取包含多部分表单数据的 HTTP 请求(大的多行标记分隔为分隔符,例如,------WebKitFormBoundary5GlahTkFmhDfanAn--),并且我想读取直到遇到具有给定名称的请求的一部分,然后返回该部分的 InputStream。
我可以将流读入内存并返回ByteArrayInputStream,因为提交的文件不应大于 1MB。但是,我想确保如果文件大于 1MB,读取方法会引发异常,以便过大的文件不会填满 JVM 的内存并导致服务器崩溃。文件数据可能是二进制的,因此排除了BufferedReader.readLine()(它会删除换行符,可以是\r、\n 或\r\n 中的任何一个,从而导致数据丢失)。
所有明显的标记化解决方案,例如Scanner,都将标记读取为Strings,而不是流,这可能会导致OutOfMemoryErrors 用于大文件——这正是我想要避免的。据我所知,没有与Scanner 等效的方法将每个令牌作为InputStream 返回而不将其读入内存。有什么我遗漏的东西,或者有什么方法可以自己创建类似的东西,只使用标准 Java 库(no Apache Commons 等),不需要我阅读一次流一个字符并自己编写所有令牌扫描代码?
附录:在发布此之前不久,我意识到解决我最初问题的明显方法是将完整的请求正文读入内存,如果它太大则失败,然后对结果进行标记ByteArrayInputStream 和 Scanner。这是低效的,但它有效。但是,我仍然很想知道是否有办法将InputStream 标记为子流,无需将它们读入内存,无需使用额外的库,也无需进行逐个字符处理。
【问题讨论】:
标签: java forms inputstream