这两天在做一个上传文件到oss,然后从oss获取文件发送邮件的case。
然后发现文件上传到了oss,但是取出来之后邮件的附件是空的。
找了半天也没有发现,之后通过日志发现他们的长度是不同的。
写了个测试demo
import org.apache.commons.io.IOUtils;
import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
public class TestInputStream {
@Test
public void demo(){
try{
// 创建一个InputStream
InputStream inputStream = new ByteArrayInputStream(IOUtils.toByteArray("aaaaa"));
System.out.println(IOUtils.toByteArray(inputStream).length);
// 再次打印
System.out.println(IOUtils.toByteArray(inputStream).length);
}catch (Exception e){
e.printStackTrace();
}
}
}
输出发现不同。很坑 真的坑!!
有人这样比喻,InputStream就类比成一个杯子,杯子里的水就像InputStream里的数据,你把杯子里的水拿出来了,杯子的水就没有了,InputStream也是同样的道理!!
深入了解发现InputStream不能读取两次是因为,在InputStream读取的时候,会有一个pos指针,他指示每次读取之后下一次要读取的起始位置