- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
以下是在处理文件之前将整个文件读入内存的三种方法:
方法一:
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
dis = new DataInputStream(bis);
方法 B:
ByteArrayInputStream bi =
new ByteArrayInputStream(
org.apache.commons.io.FileUtils.readFileToByteArray(file))
方法 C:
File file = new File(yourFileName);
RandomAccessFile ra = new RandomAccessFile(yourFileName, "rw"):
byte[] b = new byte[(int)file.length()];
try {
ra.read(b);
} catch (Exception e) {
e.printStackTrace();
}
为什么我更喜欢一种方法而不是另一种方法?
是否有任何特定的用例要求一种方法优于另一种方法?
为什么不改用固定长度的 byte[]
?
最佳答案
除非您需要任何特殊的功能(例如随机访问),否则包装到 BufferedInputStream 中的 InputStream 是从提供流式传输功能的任何类型的数据源中顺序读取的通用选择。
这将提供合理的性能(通过缓冲),代码是通用的,因为它可以处理任何流,而且非常重要 - 可处理流的大小不受可用堆内存的限制。
因此,除非您有非常令人信服的理由针对特殊情况 API 进行编码,否则请使用标准 InputStream 并根据需要对其进行包装。
编辑:回应@IUnknown 在评论中提出的问题:
- What is the approach in the case of a random access - I thought BufferedInputStream is the preferred solution even in that case?
没有用于随机访问的通用接口(interface)。你想错了。您至少可以如此礼貌地研究基础知识的基础知识:http://docs.oracle.com/javase/tutorial/essential/io/
- the size of processable streams isn't limited by the available heap memory - the buffer must be having a limit.Are you saying that the internal array automatically re-sizes if its filled up while reading?
同样,这已包含在基础知识中(见上文)。使用 ByteArrayInputStream 你需要一个 byte[] 来保存整个流。那怎么不受内存限制? (更糟糕的是,它也受到最大数组大小的限制)。
- Is there any difference in the buffer behavior between a Buffered stream and a ByteArray stream - I thought they are backed up by similar buffer behaviour
我不知道该说什么。你想错了。撇开基本事实不谈,它们都扩展了 InputStream 并以某种方式在内部使用字节数组(从技术上讲,两者都可以在不使用任何数组的情况下实现,这是最自然的实现方式)。他们没有共同点。 BufferedStream 包含另一个 流的一小部分动态。 ByteArrayInputStream 在 2.
建议:这里的人们很乐意就使用哪种工具来完成哪些工作向您提供建议。但不要指望被喂食。显示一些 努力,stackoverflow 不是辅导网站。停止“思考”并开始“学习”- 教程就在那里,并且自语言诞生以来就一直存在。
关于java - BufferedInputStream 与 ByteArrayInputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18291074/
1. 概述 在这个例子中,我们将使用一个BufferedInputStream类来读取一个文件。BufferedInputStream类是用来从流中读取信息的。它在内部使用了一个缓冲机制来使性能快速提
如果文件大小 > 8k,为什么读取的最后一个字节 = 0? private static final int GAP_SIZE = 8 * 1024; public static void main(
使用缓冲输入流读取批量文件时,如何确定缓冲区的大小?它基于文件大小吗?我正在使用, byte[] buf = new byte[4096]; 如果我增加缓冲区大小,它会读取得很快吗? 最佳答案 默认值
我正在尝试用java编写服务器端和客户端。因此,客户端发送请求,如 GET/HTTP/1.0,服务器端响应(如果文件存在),如 HTTP/1.0 200 OK,放入 header 内容类型和内容长度,
我的文件写入过程如下(我称之为非集群模式) Write an object to the current position of the file. Note the position of writ
我的 BufferedInputStream 没有正确标记。这是我的代码: public static void main(String[] args) throws Exception {
对于我的 jvm,BufferedinputStream 默认缓冲区大小是 8k。这是硬编码值,还是可以通过更改某些系统参数来更改? 我希望它在不修改 java 代码的情况下使用 128k。这可能吗?
我正在使用 BufferedInputStream 从套接字中读取数据。 BufferedInputStream 内容如下: socketInput.read(replyBuffer, 0, 7);
我知道将 BufferedInpurStream 包装在 FileInputStream 周围可以使读取操作更快但尝试 弄清楚如何。我查看了 BufferedInpurStream 的源代码并得到了一
让我在这篇文章的开头谨慎一点。当谈到 Java 时,我是一个完全的初学者。我一直在断断续续地编写 PHP,但我已经准备好做一个桌面应用程序,所以出于各种原因我决定使用 Java。 我正在处理的应用程序
这个问题在这里已经有了答案: 关闭11年前。 Possible Duplicate: In Java how do a read/convert an InputStream in to a stri
BufferedInputStream 介绍 BufferedInputStream 是缓冲输入流。它继承于FilterInputStream。 BufferedInputStream 的作用是为
是 available()在 Java 中的套接字编程中使用可靠吗? 我只关心它告诉我什么时候有可用的字节读取,这样当我调用读取方法时它们不会阻塞。 BufferedInputStream.avail
这是我的代码。 while ((count = in.read(data, 0, 16384)) != -1) // while there is still data from link to be
我通过 javax.sound.sampled.AudioSystem.getAudioInputStream() 从 URLConnection 获取 AudioInputStream。当将 URL
我需要使 java BufferedInputStream 可序列化。是否有任何替代方案或任何其他方式来实现它? 您是否发现此实现中存在任何问题 import java.io.BufferedInpu
我有 Java SSL/TLS 服务器和客户端套接字。我的客户端只需将文件发送到服务器,服务器就会接收它。这是我的代码: 我的客户端方法: static boolean writeData(Buffe
我正在从 Oracle 数据库读取 BLOB 列,然后将其写入文件,如下所示: public static int execute(String filename, BLOB blob)
有人可以向我解释为什么这在 in.available()>0 注释掉的情况下工作得很好,但是当我把它放回去时它就崩溃了? mySocket = new Socket("blahblah", 12345
有一个常见的模式,当应用程序的每一层处理来自流的数据时,倾向于将其包装到 BufferedInputStream 中,因此总的来说,有很多缓冲区,从缓冲区填充,从缓冲区填充等等。 我认为这是不好的做法
我是一名优秀的程序员,十分优秀!