BufferedInputStream.read (byte []) Вызывает проблемы.У кого-нибудь была эта проблема раньше? - PullRequest
1 голос
/ 06 января 2011

Я написал программу на Java, которая загружает аудио файлы для меня, и я использую BufferedInputStream.Функция read () работает нормально, но очень медленно, поэтому я попытался использовать перегруженную версию, используя byte [].

По какой-то причине звук становится потерянным и странным после загрузки.Я не совсем уверен, что я делаю неправильно, поэтому любая помощь приветствуется!Вот упрощенная, небрежная версия кода.

BufferedInputStream bin = new BufferedInputStream((new URL(url)).openConnection().getInputStream());
File file = new File(fileName);
FileOutputStream fop = new FileOutputStream(file);
int rd = bin.read();
while(rd != -1)
{
     fop.write(rd);
     rd = bin.read();
}

Ответы [ 2 ]

6 голосов
/ 06 января 2011

Помните, что когда вы читаете в байтах, read вернет количество байтов, которые были фактически получены.Вам нужно передать это число для записи, потому что в вашем байтовом массиве могут быть посторонние данные.Это особенно верно в последнем блоке данных.

1 голос
/ 06 января 2011

метод чтения, который вы используете, фактически возвращает байт внутри, который он возвращает, что означает, что на самом деле используются только 8 бит из 32 битов в вашей переменной "rd".

метод write утверждает, что он принимает в качестве аргумента int, но записывает «указанный байт в этот выходной поток файла». а это значит, что ты должен быть в порядке ... но я думаю, что ты не D:

попробуйте использовать метод read, который вместо этого принимает байтовый массив в качестве аргумента, а затем запишите этот байтовый массив в ваш выходной поток.

однако, имейте в виду, что этот другой метод чтения, тот, который принимает байтовый массив в качестве аргумента, он также возвращает int. но в отличие от метода, который вы используете в своем примере (который возвращает один из байтов из входных данных), этот другой метод чтения возвращает количество прочитанных байтов. это не обязательно количество байтов, которое может содержать ваш байтовый массив. в этом случае вы должны убедиться, что вы не записали в выходной поток больше байтов, чем было фактически прочитано из последней операции чтения.

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