有人能告诉我如何尽量少地创建时间来克隆输入流吗? 我需要为多个方法克隆一个输入流以处理该IS。 我已经尝试过三种方法,但由于某种原因,事情都不起作用。
方法二: 我还尝试使用BufferedInputStream来克隆IS。这个方法很快(最慢的创建时间为1毫秒,最快的为0毫秒)。然而,在我发送is1进行处理后,处理is2和is3的方法抛出了一个错误,说没有要处理的内容,就像下面的所有3个变量都引用了同一个IS一样。
或者只需
在传递IS到我的各个方法之前。在上述两个示例中,我收到一个错误,说它是无效的标记。
我现在已经没有想法了,所以提前感谢您能给我的任何帮助。
附言:从我收到的评论中,需要澄清一些关于我的情况的事情: 1)此程序正在虚拟机上运行 2)输入流由另一个方法传递给我。我不从本地文件读取 3)输入流的大小未知
方法#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);
方法二: 我还尝试使用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);
方法三: 我认为编译器在欺骗我。我检查了is1的markSupported()函数,对于上述两个示例,它返回true,所以我认为我可以运行。
is1.mark()
is1.reset()
或者只需
is1.reset();
在传递IS到我的各个方法之前。在上述两个示例中,我收到一个错误,说它是无效的标记。
我现在已经没有想法了,所以提前感谢您能给我的任何帮助。
附言:从我收到的评论中,需要澄清一些关于我的情况的事情: 1)此程序正在虚拟机上运行 2)输入流由另一个方法传递给我。我不从本地文件读取 3)输入流的大小未知