关于在读取调用中使用偏移量的说明

时间:2012-10-08 00:57:41

标签: java inputstream

我找到了这段代码,以便将文件编码为base64。它正在使用偏移量。

File filePath = new File("/sdcard/videooutput.mp4");
try{
    FileInputStream fin=new FileInputStream(filePath);
    long length = filePath.length();
    // Create the byte array to hold the data
    byte[] bytes = new byte[(int)length];
    // Read in the bytes
    int offset = 0;
    int numRead = 0;
    while (offset<bytes.length && (numRead=fin.read(bytes, offset, bytes.length-offset))>=0){
        offset += numRead;
    }
    // Ensure all the bytes have been read in
    if (offset < bytes.length) {
    throw new IOException("Could not completely read file "+filePath.getName());
}


Base64.encodeToString(bytes, Base64.DEFAULT);

我对此代码的理解是while (offset < bytes.length && (numRead=fin.read(bytes, offset, bytes.length-offset)) >= 0)

任何人都可以解释代码试图做什么吗?我只是理解它检查偏移量是否小于字节长度,其余我不确定。

我的下一个问题是,使用偏移量对文件进行编码的原因是什么?

关于这个问题的任何答案都会非常有帮助。很抱歉提出这类问题,但我真的需要理解这段代码。

1 个答案:

答案 0 :(得分:1)

InputStream#read()

int numRead=fin.read(bytes, offset, bytes.length-offset)

对于给定的字节数,

read从给定的偏移量开始填充给定的字节数组。但是,即使您请求100个字节,也无法保证您将获得它们。所以这段代码基本上是在每次调用read()之后递增偏移量。

初始呼叫将尝试完全填充字节[]。如果失败,它会将偏移量向前移动成功复制的字节数,并从新偏移量开始尝试填充byte []。每次新的尝试都只能读取足以填充缓冲区中的内容。