有人能告诉我如何克隆输入流,尽可能少地花费创建时间吗?我需要多次克隆输入流以使用多种方法来处理 IS。我已经尝试了三种方法,但由于某种原因,事情不起作用。
方法 #1:感谢 stackoverflow 社区,我发现以下链接很有帮助,并将代码片段合并到我的程序中。
但是,使用此代码可能需要一分钟(对于 10MB 文件)来创建克隆的输入流,并且我的程序需要尽可能快。
int read = 0;
byte[] bytes = new byte[1024*1024*2];
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((read = is.read(bytes)) != -1)
bos.write(bytes,0,read);
byte[] ba = bos.toByteArray();
InputStream is1 = new ByteArrayInputStream(ba);
InputStream is2 = new ByteArrayInputStream(ba);
InputStream is3 = new ByteArrayInputStream(ba);
方法 #2:我也尝试使用 BufferedInputStream 克隆 IS。这很快(最慢的创建时间 == 1 毫秒。最快的 == 0 毫秒)。但是,在我发送 is1 进行处理后,处理 is2 和 is3 的方法抛出了一个错误,说没有要处理的内容,几乎就像下面所有 3 个变量都引用了同一个 IS。
is = getFileFromBucket(path,filename);
...
...
InputStream is1 = new BufferedInputStream(is);
InputStream is2 = new BufferedInputStream(is);
InputStream is3 = new BufferedInputStream(is);
方法#3:我认为编译器在骗我。对于上面的两个示例,我检查了 is1 的 markSupported()。它返回了 true,所以我认为我可以运行
is1.mark()
is1.reset()
要不就
is1.reset();
在将 IS 传递给我各自的方法之前。在上面的两个例子中,我都收到一个错误,说它是一个无效的标记。
我现在没有想法,所以提前感谢你能给我的任何帮助。
PS根据我从人们那里收到的评论,我需要澄清一些关于我的情况的事情:1)这个程序在VM上运行2)输入流是从另一种方法传递给我的。我没有从本地文件中读取 3) 输入流的大小未知