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