Java 如何读取二进制文件?
我想读取一个大小为Java 如何读取二进制文件?,java,file,Java,File,我想读取一个大小为5.5 MB的二进制文件(mp3文件)。我用fileinputstream进行了尝试,但尝试了很多次。如果可能,我希望以最少的时间浪费来读取文件 试试这个: public static void main(String[] args) throws IOException { InputStream i = new FileInputStream("a.mp3"); byte[] contents = new byte[i.available()]; i
5.5 MB的二进制文件(mp3文件)。我用fileinputstream
进行了尝试,但尝试了很多次。如果可能,我希望以最少的时间浪费来读取文件 试试这个:
public static void main(String[] args) throws IOException
{
InputStream i = new FileInputStream("a.mp3");
byte[] contents = new byte[i.available()];
i.read(contents);
i.close();
}
一个更可靠的版本基于@Paul Cager&Liv对可用性和阅读的不可靠性的有益评论
public static void main(String[] args) throws IOException
{
File f = new File("c:\\msdia80.dll");
InputStream i = new FileInputStream(f);
byte[] contents = new byte[(int) f.length()];
int read;
int pos = 0;
while ((read = i.read(contents, pos, contents.length - pos)) >= 1)
{
pos += read;
}
i.close();
}
试试这个:
public static void main(String[] args) throws IOException
{
InputStream i = new FileInputStream("a.mp3");
byte[] contents = new byte[i.available()];
i.read(contents);
i.close();
}
一个更可靠的版本基于@Paul Cager&Liv对可用性和阅读的不可靠性的有益评论
public static void main(String[] args) throws IOException
{
File f = new File("c:\\msdia80.dll");
InputStream i = new FileInputStream(f);
byte[] contents = new byte[(int) f.length()];
int read;
int pos = 0;
while ((read = i.read(contents, pos, contents.length - pos)) >= 1)
{
pos += read;
}
i.close();
}
您应该尝试在FileInputStream周围使用BufferedInputStream。它将显著提高性能
new BufferedInputStream(fileInputStream, 8192 /* default buffer size */);
此外,我建议使用读取方法,该方法接受字节数组并填充它,而不是普通读取。您应该尝试在FileInputStream周围使用BufferedInputStream。它将显著提高性能
new BufferedInputStream(fileInputStream, 8192 /* default buffer size */);
此外,我建议使用读取方法,该方法接受字节数组并填充它,而不是普通读取。中有一些有用的实用程序可用于一次读取文件。对于高达100 MB的普通文件,这更简单、更高效
byte[] bytes = FileUtils.readFileToByteArray(file); // handles IOException/close() etc.
中有一些有用的实用程序可用于立即读取文件。对于高达100 MB的普通文件,这更简单、更高效
byte[] bytes = FileUtils.readFileToByteArray(file); // handles IOException/close() etc.
当然有可能。你的具体问题是什么?“需要很多次”是什么意思?例如,当我想读取该文件时,需要5分钟,这不好。我想用更少的时间读取该文件,所以导致读取速度慢的不是网络。我们能看看你现有的代码吗?我解决了。谢谢我的朋友,当然有可能。你的具体问题是什么?“需要很多次”是什么意思?例如,当我想读取该文件时,需要5分钟,这不好。我想用更少的时间读取该文件,所以导致读取速度慢的不是网络。我们可以看看你现有的代码吗?我解决了。谢谢我的朋友,这是不安全的代码。InputStream.available()“返回可以从此输入流读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。”这不一定与文件大小相同。我真的很好奇最初的方法是什么样子的。:)同意保罗·凯杰的观点。事实上,read(byte[]buffer)不会读取到buffer的极限——而是读取尽可能多的可用字节!因此,您可能只读取了几个字节,而不是整个文件。最后一条注释——上面的注释对大文件不起作用——其中f.length()返回的大小大于Integer.MAX_值——但我会让您放心,因为@mehdi只提到了几Mb的大小。@Liv,对于大于2GB的文件,无论如何,你可能对把它存储在内存中不感兴趣。这可以永远持续32位vs 64位a.s.o.多亏了指针思想,这是不安全的代码。InputStream.available()“返回可以从此输入流读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。”这不一定与文件大小相同。我真的很好奇最初的方法是什么样子的。:)同意保罗·凯杰的观点。事实上,read(byte[]buffer)不会读取到buffer的极限——而是读取尽可能多的可用字节!因此,您可能只读取了几个字节,而不是整个文件。最后一条注释——上面的注释对大文件不起作用——其中f.length()返回的大小大于Integer.MAX_值——但我会让您放心,因为@mehdi只提到了几Mb的大小。@Liv,对于大于2GB的文件,无论如何,你可能对把它存储在内存中不感兴趣。32位对64位a.s.o.这可以永远持续下去。感谢指针思想,u:)默认值是8192,也许你想到的是4096。默认值是8192,也许你想到的是4096。