此页面:http://blog.ostermiller.org/convert-java-outputstream-inputstream 描述了如何从OutputStream创建InputStream:
new ByteArrayInputStream(out.toByteArray())
Run Code Online (Sandbox Code Playgroud)
其他替代方案是使用PipedStreams和新线程,这很麻烦.
我不喜欢将许多兆字节复制到内存字节数组中的新内容.有没有一个库可以更有效地完成这项工作?
编辑:
根据Laurence Gonsalves的建议,我尝试了PipedStreams,事实证明它们并不难以应对.这是clojure中的示例代码:
(defn #^PipedInputStream create-pdf-stream [pdf-info]
(let [in-stream (new PipedInputStream)
out-stream (PipedOutputStream. in-stream)]
(.start (Thread. #(;Here you write into out-stream)))
in-stream))
Run Code Online (Sandbox Code Playgroud) 如果我只有一个,有人可以解释我如何获取文件对象ByteArrayOutputStream.如何从ByteArrayOutputStream?创建文件?
我需要将一个字节数组转换为ByteArrayOutputStream,以便我可以在屏幕上显示它.
在ByteArrayOutputStream周围包装BufferedOutputStream是否有任何优势,而不是仅仅使用ByteArrrayOutputStream?
我在磁盘中有一个40MB的文件,我需要使用字节数组将其"映射"到内存中.
起初,我认为将文件写入ByteArrayOutputStream是最好的方法,但我发现在复制操作期间的某个时刻需要大约160MB的堆空间.
如果不使用RAM文件大小的三倍,有人知道更好的方法吗?
更新:感谢您的回答.我注意到我可以减少内存消耗,稍微告诉ByteArrayOutputStream的初始大小要比原始文件大小稍大一些(使用我的代码强制重新分配的确切大小,得到检查原因).
还有另一个高内存点:当我用ByteArrayOutputStream.toByteArray返回byte []时.看看它的源代码,我可以看到它正在克隆数组:
public synchronized byte toByteArray()[] {
return Arrays.copyOf(buf, count);
}
Run Code Online (Sandbox Code Playgroud)
我想我可以扩展ByteArrayOutputStream并重写此方法,以便直接返回原始数组.这里有没有潜在的危险,因为流和字节数组不会被多次使用?
我正在尝试将其转换OutputStream为ByteArrayOutput流.我无法找到关于如何做到这一点的任何明确的简单答案.这个问题是在StackOverflow问题的标题中提出的,但问题的主体是如何将a更改ByteArrayStream为OuputStream.我OutputStream已经创建了一个,答案中给出的这个例子将无法编译!
我有一个已经构造的OutputStream,其长度为44字节,称为waveHeader.我想将其转换为ByteArrayOutputStream,因为我希望能够使用waveHeader.ToByteArray()将其更改为byte [],以便在以后的过程中使用;
是否有简单的铸造类型或允许这样的东西?
如果没有那么:
有没有办法在原始OutputStream中构造指向数据的指针,如果无法转换它的话?
如何访问OutputStream中包含的数据?
我是JAVA的新手.这对我来说只是一个爱好.在VisualBasic .net中的流更容易!
我如何正确地将字节压缩到a ByteArrayOutputStream然后使用ByteArrayInputStream?读取?我有以下方法:
private byte[] getZippedBytes(final String fileName, final byte[] input) throws Exception {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ZipOutputStream zipOut = new ZipOutputStream(bos);
ZipEntry entry = new ZipEntry(fileName);
entry.setSize(input.length);
zipOut.putNextEntry(entry);
zipOut.write(input, 0, input.length);
zipOut.closeEntry();
zipOut.close();
//Turn right around and unzip what we just zipped
ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(bos.toByteArray()));
while((entry = zipIn.getNextEntry()) != null) {
assert entry.getSize() >= 0;
}
return bos.toByteArray();
}
Run Code Online (Sandbox Code Playgroud)
当我执行此代码时,底部的断言失败,因为entry.size是-1.我不明白为什么提取的实体与压缩的实体不匹配.
java zip bytearrayoutputstream bytearrayinputstream zipoutputstream
在Android应用程序中,我正在发送从中获取的图片,Camera Intent因此我需要将a Bitmap转换为字节数组.要做到这一点,我使用ByteArrayOutputStream如下:
private byte[] getRawImageData(Bitmap source) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] rawImageData = null;
try {
source.compress(CompressFormat.JPEG, DEFAULT_COMRESSION, baos);
rawImageData = baos.toByteArray();
} finally {
try {
baos.close();
} catch (IOException e) {
// handle exception here
}
}
return rawImageData;
}
Run Code Online (Sandbox Code Playgroud)
一切都运行正常,真正的问题是ByteArrayOutputStreamjavadoc与Android 文档之间的差异.
该Javadoc中读取
关闭ByteArrayOutputStream无效.
在Android的文档读取:
关闭此流.这将释放用于此流的系统资源.
我正在关闭流不管什么,但我想知道哪些文档是正确的以及为什么它们是不同的.
我在这里遇到了很多问题,我认为这是因为我不太了解如何使用Java提供的API.
我需要写一个int和byte[]一个byte[]
我想用a DataOutputStream来解决数据写入writeInt(int i)和write(byte[] b),并且能够把它放到一个字节数组中,我应该使用ByteArrayOutputStream方法toByteArray().
我知道这个类使用Wrapper模式,所以我有两个选择:
DataOutputStream w = new DataOutputStream(new ByteArrayOutputStream());
Run Code Online (Sandbox Code Playgroud)
要么
ByteArrayOutputStream w = new ByteArrayOutputStream(new DataOutputStream());
Run Code Online (Sandbox Code Playgroud)
但在这两种情况下,我都"松散"了一种方法.在第一种情况下,我无法访问该toByteArray()方法,而在第二种情况下,我无法访问该writeInt()方法.
我应该如何一起使用这些课程?