103 lines
3.0 KiB
Java
103 lines
3.0 KiB
Java
package me.ag2s.base;
|
|
|
|
import static me.ag2s.base.ThrowableUtils.rethrowAsIOException;
|
|
|
|
import android.os.ParcelFileDescriptor;
|
|
import android.system.ErrnoException;
|
|
import android.system.OsConstants;
|
|
|
|
import java.io.EOFException;
|
|
import java.io.IOException;
|
|
|
|
/**
|
|
* 读取ParcelFileDescriptor的工具类
|
|
*/
|
|
@SuppressWarnings("unused")
|
|
public final class PfdHelper {
|
|
|
|
/**
|
|
* 读取基本类型的buffer
|
|
*/
|
|
private static final byte[] readBuffer = new byte[8];
|
|
|
|
public static void seek(ParcelFileDescriptor pfd, long pos) throws IOException {
|
|
try {
|
|
android.system.Os.lseek(pfd.getFileDescriptor(), pos, OsConstants.SEEK_SET);
|
|
} catch (ErrnoException e) {
|
|
throw rethrowAsIOException(e);
|
|
}
|
|
|
|
}
|
|
|
|
public static long getFilePointer(ParcelFileDescriptor pfd) throws IOException {
|
|
try {
|
|
return android.system.Os.lseek(pfd.getFileDescriptor(), 0, OsConstants.SEEK_CUR);
|
|
} catch (ErrnoException e) {
|
|
throw rethrowAsIOException(e);
|
|
}
|
|
}
|
|
|
|
public static long length(ParcelFileDescriptor pfd) throws IOException {
|
|
try {
|
|
return android.system.Os.fstat(pfd.getFileDescriptor()).st_size; //android.system.Os.lseek(pfd.getFileDescriptor(), 0, OsConstants.SEEK_END);
|
|
} catch (ErrnoException e) {
|
|
throw rethrowAsIOException(e);
|
|
}
|
|
}
|
|
|
|
private static int readBytes(ParcelFileDescriptor pfd, byte[] b, int off, int len) throws IOException {
|
|
try {
|
|
return android.system.Os.read(pfd.getFileDescriptor(), b, off, len);
|
|
} catch (ErrnoException e) {
|
|
throw rethrowAsIOException(e);
|
|
}
|
|
}
|
|
|
|
public static int read(ParcelFileDescriptor pfd) throws IOException {
|
|
return (read(pfd, readBuffer, 0, 1) != -1) ? readBuffer[0] & 0xff : -1;
|
|
}
|
|
|
|
public static int read(ParcelFileDescriptor pfd, byte[] b, int off, int len) throws IOException {
|
|
return readBytes(pfd, b, off, len);
|
|
}
|
|
|
|
public static int read(ParcelFileDescriptor pfd, byte[] b) throws IOException {
|
|
return readBytes(pfd, b, 0, b.length);
|
|
}
|
|
|
|
public static void readFully(ParcelFileDescriptor pfd, byte[] b) throws IOException {
|
|
readFully(pfd, b, 0, b.length);
|
|
}
|
|
|
|
public static void readFully(ParcelFileDescriptor pfd, byte[] b, int off, int len) throws IOException {
|
|
int n = 0;
|
|
do {
|
|
int count = read(pfd, b, off + n, len - n);
|
|
if (count < 0)
|
|
throw new EOFException();
|
|
n += count;
|
|
} while (n < len);
|
|
}
|
|
|
|
|
|
public static int skipBytes(ParcelFileDescriptor pfd, int n) throws IOException {
|
|
long pos;
|
|
long len;
|
|
long newpos;
|
|
|
|
if (n <= 0) {
|
|
return 0;
|
|
}
|
|
pos = getFilePointer(pfd);
|
|
len = length(pfd);
|
|
newpos = pos + n;
|
|
if (newpos > len) {
|
|
newpos = len;
|
|
}
|
|
seek(pfd, newpos);
|
|
|
|
/* return the actual number of bytes skipped */
|
|
return (int) (newpos - pos);
|
|
}
|
|
}
|