将Java InputStream标记为流,而不是字符串

将Java InputStream标记为流,而不是字符串,java,forms,inputstream,Java,Forms,Inputstream,我非常了解Java库,所以当我意识到,显然,用流做一些看似简单的事情并不容易时,我感到很惊讶。我试图读取一个包含多部分表单数据的HTTP请求(大型、多行标记分隔为分隔符,例如,----WebKitFormBoundary5GlahTkFmhDfanAn--),我想一直读取,直到遇到具有给定名称的请求部分,然后返回该部分的输入流 我可以将流读入内存并返回一个ByteArrayInputStream,因为提交的文件不应该大于1MB。但是,我想确保如果文件大于1MB,reading方法会引发异常,这样

我非常了解Java库,所以当我意识到,显然,用流做一些看似简单的事情并不容易时,我感到很惊讶。我试图读取一个包含多部分表单数据的HTTP请求(大型、多行标记分隔为分隔符,例如,
----WebKitFormBoundary5GlahTkFmhDfanAn--
),我想一直读取,直到遇到具有给定名称的请求部分,然后返回该部分的输入流

我可以将流读入内存并返回一个
ByteArrayInputStream
,因为提交的文件不应该大于1MB。但是,我想确保如果文件大于1MB,reading方法会引发异常,这样过大的文件不会填满JVM的内存并使服务器崩溃。文件数据可以是二进制的,这样就排除了
BufferedReader.readLine()
(它会删除换行符,换行符可以是
\r
\n
\r\n
,从而导致数据丢失)

所有明显的标记化解决方案,例如
Scanner
,都将标记读取为
String
s,而不是流,这可能会导致大文件出现
OutOfMemoryError
s,这正是我试图避免的。据我所知,没有一种等价于
Scanner
的方法可以将每个令牌作为
InputStream
返回,而不将其读入内存。是否有我遗漏的东西,或者是否有任何方法可以自己创建类似的东西,只使用标准Java库(noApacheCommons,等等),而不需要我一次读取一个字符的流并自己编写所有的令牌扫描代码



附录:在发布这篇文章之前不久,我意识到解决我最初问题的显而易见的方法就是将完整的请求正文读入内存,如果太大则会失败,然后用
扫描仪将结果
ByteArrayInputStream
标记化。这是低效的,但它是有效的。然而,我仍然有兴趣知道是否有一种方法可以将
输入流
标记为子流,而无需将它们读入内存,无需使用额外的库,也无需逐个字符处理。

如果不将它们加载到内存(您不想要的解决方案)或将它们保存到磁盘上,这是不可能的将流标记为单独的流而不将其加载到内存中意味着您可以读取流(将其标记化)简而言之,除非您的流是可查找的,否则您想要的是不可能的,但这些流通常是用于非常特定的应用程序和专用I/O对象的专用流,例如。

如果令牌流是严格按顺序读取的,则不必在流中查找。理想的解决方案是一次按顺序提供一个流,每个流在到达下一个分隔符时结束,在该点可以创建下一个流。@ACE91我开始键入该流,但认为它是多余的。我能想到的唯一原因是异步处理数据。