如何从Java中的文件创建ByteArrayInputStream?

itr*_*tro 26 java arrays bytebuffer bytearrayinputstream

我有一个文件,可以是任何东西,如ZIP,RAR,TXT,CSV,doc等.我想从它创建一个ByteArrayInputStream.
我正在使用它通过FTPClient从Apache Commons Net 上传文件到FTP .

有谁知道怎么做?

例如:

String data = "hdfhdfhdfhd";
ByteArrayInputStream in = new ByteArrayInputStream(data.getBytes());
Run Code Online (Sandbox Code Playgroud)

我的代码:

public static ByteArrayInputStream retrieveByteArrayInputStream(File file) {
    ByteArrayInputStream in;

    return in;     
}
Run Code Online (Sandbox Code Playgroud)

npe*_*npe 39

使用FileUtils#readFileToByteArray(File)来自Apache Commons IO,然后ByteArrayInputStream使用ByteArrayInputStream(byte[])构造函数创建.

public static ByteArrayInputStream retrieveByteArrayInputStream(File file) {
    return new ByteArrayInputStream(FileUtils.readFileToByteArray(file));
}
Run Code Online (Sandbox Code Playgroud)

  • 正如我的回答所述,Java 7已经在Files类中包含了readFileToByteArray,不需要额外的库. (17认同)
  • 实际上,在Java 7中,它是`Files.readAllBytes` (9认同)
  • 我的意思是 [Files.readAllBytes](http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#readAllBytes%28java.nio.file.Path%29)之前的评论。抱歉,让我们为您节省一些搜索时间。 (2认同)

Maa*_*wes 17

一般的想法是文件会产生a FileInputStreambyte[]a ByteArrayInputStream.两者都实现,InputStream因此它们应该与任何InputStream用作参数的方法兼容.

将所有文件内容放入a ByteArrayInputStream中当然可以完成:

  1. 在完整的文件中读入byte[]; Java版本> = 7包含一个调用readAllBytes来读取文件中所有数据的便捷方法 ;
  2. 创建一个ByteArrayInputStream文件内容,现在在内存中.

请注意,这可能不是非常大的文件的最佳解决方案 - 所有文件将在同一时间点存储在内存中.使用正确的流来完成工作非常重要.


Qwe*_*rky 5

A ByteArrayInputStreamInputStream字节数组的包装器.这意味着您必须将文件完全读入a byte[],然后使用其中一个ByteArrayInputStream构造函数.

你能否详细说明你在做什么ByteArrayInputStream?它可能有更好的方法来解决你想要实现的目标.

编辑:
如果您使用Apache FTPClient上传,您只需要一个InputStream.你可以这样做;

String remote = "whatever";
InputStream is = new FileInputStream(new File("your file"));
ftpClient.storeFile(remote, is);
Run Code Online (Sandbox Code Playgroud)

您当然应该记得在完成输入流后关闭输入流.

  • 我建议 [try-with-resources 语句](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) 而不是“记住关闭输入流”。 (2认同)