Java BufferedInputStream.read(字节[])导致问题。以前有人有这个问题吗?

Java BufferedInputStream.read(字节[])导致问题。以前有人有这个问题吗?,java,file-io,audio,Java,File Io,Audio,我已经编写了一个Java程序,可以为我下载音频文件,我正在使用BufferedInputStream。read()函数工作正常,但速度非常慢,因此我尝试使用byte[]使用重载版本 由于某些原因,音频在下载后变得有损且奇怪。我不完全确定我做错了什么,所以非常感谢您的帮助!下面是代码的简化版本 BufferedInputStream bin = new BufferedInputStream((new URL(url)).openConnection().getInputStream()); Fi

我已经编写了一个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();
}

请记住,以字节为单位读取时,read将返回实际接收的字节数。您需要传递该计数才能写入,因为您的字节数组中可能有无关数据。在最后一块数据中尤其如此。

请记住,以字节为单位读取时,读取将返回实际接收的字节数。您需要传递该计数才能写入,因为您的字节数组中可能有无关数据。在最后一个数据块中尤其如此。

您使用的read方法实际上返回它返回的int中的一个字节,这意味着变量“rd”中32位中只有8位被实际使用

方法write声明它接受int作为参数,但将“指定的字节写入此文件输出流”。这意味着您应该可以。。但我想你不是D:

尝试使用以字节数组作为参数的read方法,然后将该字节数组写入输出流


但是,请注意,另一个read方法(以字节数组为参数的方法)也会返回int。但与示例中使用的方法(从输入数据返回一个字节)不同,另一个read方法会返回读取的字节数。字节数组可以包含的字节数不需要这样做。在这种情况下,您必须确保向输出流中写入的字节数不会超过上次读取操作中实际读取的字节数。

您使用的读取方法实际返回的int中的一个字节,这意味着变量“rd”中的32位中只有8位被实际使用

方法write声明它接受int作为参数,但将“指定的字节写入此文件输出流”。这意味着您应该可以。。但我想你不是D:

尝试使用以字节数组作为参数的read方法,然后将该字节数组写入输出流


但是,请注意,另一个read方法(以字节数组为参数的方法)也会返回int。但与示例中使用的方法(从输入数据返回一个字节)不同,另一个read方法会返回读取的字节数。字节数组可以包含的字节数不需要这样做。在这种情况下,您必须确保向输出流写入的字节数不会超过上次读取操作实际读取的字节数。

哦,天哪……这是一个粗心的错误!非常感谢您向我指出这一点!:这件事发生在我们最好的人身上!我不止一次经历过这种事。。。通常使用图像文件,所以奇怪的工件会出现在复制的图像中。最大的症状是我所有的文件大小都是1024的倍数。那是死者的遗赠。哦,天哪……那是一个粗心的错误!非常感谢您向我指出这一点!:这件事发生在我们最好的人身上!我不止一次经历过这种事。。。通常使用图像文件,所以奇怪的工件会出现在复制的图像中。最大的症状是我所有的文件大小都是1024的倍数。那是死者的遗赠。