InputStream会保存一个位置:Stream.Position,表示当前流中的位置,每次读取都是从这个位置开始,并且读取完成之后会把这个位置设置为最后读取的位置,因此第一次读整个Stream.Position到了末尾或者close了,第二次就读不到内容。
解决办法1:nputStream转化成ByteArrayOutputStream,后面要使用InputStream对象时,再从ByteArrayOutputStream转化回来就好了.
例子如下:
InputStream input = response.body().byteStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len=-1;
while ((len = input.read(buffer)) = -1 ) {
baos.write(buffer, 0, len);
}
baos.flush();
input.close
InputStream input1 = new ByteArrayInputStream(baos.toByteArray());
InputStream input2 = new ByteArrayInputStream(baos.toByteArray());
转自:https://blog.csdn.net/qq_24004499/article/details/70860213
方法2:https://blog.csdn.net/v5_BAT/article/details/85014223
调用了open的方法,利用了反射。
@Test
public void testFileinp() throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
FileInputStream inputStream=new FileInputStream("E:/test/te.txt");
FileOutputStream outputStream=new FileOutputStream("E:/test/te2.txt");
FileOutputStream outputStreams=new FileOutputStream("E:/test/te3.txt");
int len;
byte [] by=new byte[8192];
while ((len=inputStream.read(by))!=-1){
outputStream.write(by,0,len);
}
if(inputStream.read()==-1){
Class in=inputStream.getClass();
Method openo= in.getDeclaredMethod("open0", String.class);
openo.setAccessible(true);
openo.invoke(inputStream,"E:/test/te.txt");
}
while ((len=inputStream.read(by))!=-1){
outputStreams.write(by,0,len);
}
outputStream.close();
}