inputstream重复使用方法(FileInputStream 阿里面试)

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();
    }

猜你喜欢

转载自blog.csdn.net/mulinsen77/article/details/88715207