Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何读取二进制文件?_Java_File - Fatal编程技术网

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。