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

如何从Java中的文件创建ByteArrayInputStream?,java,arrays,bytebuffer,bytearrayinputstream,Java,Arrays,Bytebuffer,Bytearrayinputstream,我有一个文件,可以是任何东西,如ZIP、RAR、txt、CSV、doc等。我想从中创建ByteArrayInputStream。 我用它从ApacheCommonsNet通过FTPClient将一个文件上传到FTP 有人知道怎么做吗? 例如: String data = "hdfhdfhdfhd"; ByteArrayInputStream in = new ByteArrayInputStream(data.getBytes()); 我的代码: public static ByteArray

我有一个文件,可以是任何东西,如ZIP、RAR、txt、CSV、doc等。我想从中创建ByteArrayInputStream。
我用它从ApacheCommonsNet通过FTPClient将一个文件上传到FTP

有人知道怎么做吗?

例如:

String data = "hdfhdfhdfhd";
ByteArrayInputStream in = new ByteArrayInputStream(data.getBytes());
我的代码:

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

    return in;     
}
使用from,然后使用构造函数创建
ByteArrayInputStream

public static ByteArrayInputStream retrieveByteArrayInputStream(File file) {
    return new ByteArrayInputStream(FileUtils.readFileToByteArray(file));
}

一般的想法是,一个文件将产生一个
FileInputStream
和一个
byte[]
a
ByteArrayInputStream
。两者都实现了
InputStream
,因此它们应该与使用
InputStream
作为参数的任何方法兼容

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

  • 将完整文件读入
    字节[]
    ;Java版本>=7包含从文件读取所有数据的命令
  • 围绕文件内容创建一个
    ByteArrayInputStream
    ,文件内容现在位于内存中

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

    这并不是您想要的,而是一种快速读取字节文件的方法

    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();
    }
    
    //Then iterate through b
    

    ByteArrayInputStream
    是围绕字节数组的
    InputStream
    包装器。这意味着您必须将文件完全读入
    字节[]
    ,然后使用
    ByteArrayInputStream
    构造函数之一

    您能否提供更多关于您正在使用
    ByteArrayInputStream
    执行的操作的详细信息?很可能有更好的方法来实现你的目标

    编辑:
    如果您使用ApacheFTPClient进行上传,您只需要一个
    InputStream
    。你可以这样做

    String remote = "whatever";
    InputStream is = new FileInputStream(new File("your file"));
    ftpClient.storeFile(remote, is);
    

    当然,您应该记住在完成输入流后关闭它。

    这段代码非常方便:

    private static byte[] readContentIntoByteArray(File file)
    {
      FileInputStream fileInputStream = null;
      byte[] bFile = new byte[(int) file.length()];
      try
      {
         //convert file into array of bytes
         fileInputStream = new FileInputStream(file);
         fileInputStream.read(bFile);
         fileInputStream.close();
      }
      catch (Exception e)
      {
         e.printStackTrace();
      }
      return bFile;
    }
    

    参考:

    对于以字节为单位的文件读取,我使用RandomAccessFile并首先将整个文件字节传输到字节数组中。我发现这是一种非常快速的读取字节文件的方法。你为什么要这样做?您可以通过将文件输入流复制到ByteArrayInputStream,然后从中创建ByteArrayInputStream来实现这一点。这当然是毫无意义的。请解释一下你的用例。您可能只需要一个FileInputStream。一旦你有了它,你打算如何使用它?我承认这有点不必要,但我发现它是阅读文件最快的方式之一,如果你喜欢速度的话。然后我又知道了使用C…这似乎比从
    文件输入流
    读取要慢得多,不是吗?我用它通过FTPClient commons Apache将文件上传到ftp。我建议不要“记住关闭输入流”。正如我在回答中指出的,Java 7在Files类中已经包含了readFileToByteArray,不需要额外的库。小注:Java还包含内存映射文件的方法,如果需要执行随机读写,这可能会更有益。从文件流式传输数据不是唯一的选择,也不总是最好的选择。