Поиск InputStream в Android - Java - PullRequest
1 голос
/ 04 августа 2020

У меня есть приложение для передачи файлов, которое отправляет большие файлы (размером несколько ГБ) от Android до Windows через соединение через сокет. Я использую преобразователь содержимого для получения экземпляра входного потока в файл, хранящийся в телефоне, но я хочу иметь возможность выполнять поиск вперед и назад во входном потоке, чтобы сделать передачу файлов более эффективной по каналу дейтаграмм. Есть ли способ сделать это?

int ack, len;

Context context = getApplicationContext();
ContentResolver cr = context.getContentResolver();
InputStream is = cr.openInputStream(fileUri);

while ((len = is.read(bufr, 0, BUFFER_SIZE)) > 0) {
        ack = sendDatagramPacket(bufr, 0, len);
}

1 Ответ

0 голосов
/ 06 августа 2020

Вот один подход, который стоит попробовать, который у меня сработал. Идея состоит в том, чтобы преобразовать InputStream в FileInputStream, получив AssetFileDescriptor, а затем получив экземпляр FileChannel, который позволяет выполнять поиск вперед и назад.

long position = 0, bytesRead = 0, currentRead = 0;

Context context = getApplicationContext();
ContentResolver cr = context.getContentResolver();
InputStream is = cr.openInputStream(fileUri);
AssetFileDescriptor assetFileDescriptor = null;
FileInputStream fis = null;
FileChannel fc = null;

        try {
            assetFileDescriptor = getContentResolver().openAssetFileDescriptor(fileUri[0], "r");
            is = cr.openInputStream(fileUri[0]);
            Utility.sendFileInfo(is, out, fileName);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        fis = new FileInputStream(assetFileDescriptor.getFileDescriptor());;
        fc = fis.getChannel();
        ByteBuffer buffer = ByteBuffer.allocate(Utility.BUFFER_SIZE);

        while(position < filesize){
            try {
                fc.position(position);
                currentRead = fc.read(buffer);

                //Use the populated buffer to send data out
                SendDatagramPacket(buffer, 0, currentRead)
                bytesRead += currentRead;
                position = bytesRead;
                buffer = ByteBuffer.allocate(Utility.BUFFER_SIZE);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
...