這兩天在做一個上傳文件到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指針,他指示每次讀取之後下一次要讀取的起始位置