DataInputStream.readUTF Java и число прочитанных байтов - PullRequest
5 голосов
/ 24 июля 2010

Я пишу пользовательский формат архива на JAVA (если быть точным, J2ME).Архиватор работает нормально, однако у меня небольшие проблемы с деархивацией.

Как узнать, сколько байтов было прочитано при чтении строки UTF8 после метода readUTF?Я знаю, что первые два байта строки, сохраненной с использованием writeUTF, являются коротким значением длины строки, но я бы хотел более удачное решение.

Или есть ли способ узнать, сколько байтов осталось доконец DataInputStream (метод available, похоже, не возвращает значимых значений).Поток был открыт с помощью FileConnection, т.е. FileConnection.openDataInputStream.

Спасибо, ребята!

Ответы [ 4 ]

4 голосов
/ 24 июля 2010

Я не вижу способа добиться этого с помощью API CLDC напрямую. Простое решение, однако, состоит в том, чтобы развернуть свой собственный «CountingInputStream», который расширяет InputStream и считает количество прочитанных байтов. Вам просто нужно переопределить три метода чтения.

Размер файла доступен через FileConnection.

2 голосов
/ 05 апреля 2013

Это довольно старый вопрос, но я опубликую свое решение, поскольку оно может кому-то помочь:

На самом деле в Apache Commons IO имеется удобная оболочка CountingInputStream http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/input/CountingInputStream.html

Этопроисходит от java.io.FilterInputStream , так что вы можете обернуть его вокруг любого стандартного входного потока.

В вашем случае, предполагая, что переменная dataInputStream обозначает поток, с которым вы работаете:

CountingInputStream counter = new CountingInputStream( dataInputStream );
dataInputStream = new DataInputStream( counter );
...
counter.getByteCount() //this returns num of bytes read from dataInputStream
2 голосов
/ 16 мая 2012

Это может быть немного поздно, но я недавно работал над чем-то, где мне нужно было узнать количество байтов, которые были прочитаны , а не сколько осталось нужно прочитать, так как этот вопрос задает. Но вы можете получить это число из решения, которое я получил. Я хотел узнать количество прочитанных байтов, чтобы отслеживать ход загрузки (если это заняло какое-то время).

Сначала я просто использовал DataInputStream # readFully () для загрузки файлов.

buffer = new byte[length];
in.readFully(buffer);

Но иногда мне оставалось ждать от 50 до 60 секунд для завершения загрузки, в зависимости от размера. Я хотел получать обновления в реальном времени о том, как идут дела, поэтому я решил использовать обычное чтение DataInputStream # (byte [] b, int off, int len). Итак, в конце есть System.out, который сообщает мне, когда я прыгнул на процентное значение:

buffer = new byte[length];
int totalRead = 0;
int percentage = 0;

while (totalRead < length)
{
    int bytesRead = in.read(buffer, totalRead, (length - totalRead));

    if (bytesRead < 0)
        throw new IOException("Data stream ended prematurely");

    totalRead += bytesRead;
    double progress = ((totalRead*1.0) / length) * 100;
    if ((int)progress > percentage)
    {
        percentage = (int)progress;
        System.out.println("Downloading: " + percentage + "%");
    }
}

Чтобы узнать, сколько байтов осталось прочитать, можно внести некоторые незначительные изменения в последний пример. Наличие переменной трекера вместо моего процента, например:

buffer = new byte[length];
int totalRead = 0;
int bytesLeft= 0;

while (totalRead < length)
{
    bytesLeft = length - totalRead;
    int bytesRead = in.read(buffer, totalRead, bytesLeft);

    if (bytesRead < 0)
        throw new IOException("Data stream ended prematurely");

    totalRead += bytesRead;
    System.out.println("Bytes left to read: " + bytesLeft);
}
1 голос
/ 24 июля 2010

Метод available () возвращает то, что задокументировано для возврата, но это не то, для чего вы пытаетесь его использовать.См. Javadoc.

Вы можете написать свой собственный подсчет байтов FilterInputStream и поместить его между потоком ввода данных и базовым потоком.Но вам нужно получить общее количество байтов источника из источника, эта информация недоступна для любого входного потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...