Как создать ByteArrayInputStream из файла на Java?

у меня есть файл, который может быть любым, как ZIP, RAR, txt, CSV, doc и т. д. Я хотел бы создать ByteArrayInputStream от него.
Я использую его для загрузки файла на FTP через FTPClient из сети Apache Commons.

кто-нибудь знает, как это сделать?

например:

String data = "hdfhdfhdfhd";
ByteArrayInputStream in = new ByteArrayInputStream(data.getBytes());

мой код:

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

    return in;     
}

5 ответов


использовать FileUtils#readFileToByteArray(File) С Apache Commons IO, а затем создать ByteArrayInputStream С помощью ByteArrayInputStream(byte[]) конструктор.

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

общая идея заключается в том, что файл будет уступать FileInputStream и byte[] a ByteArrayInputStream. Оба реализуют InputStream поэтому они должны быть совместимы с любым методом, который использует InputStream в качестве параметра.

положить все содержимое файла в ByteArrayInputStream можно сделать конечно:

  1. читать в полном файле в byte[]; версия Java >= 7 содержит удобный метод называется readAllBytes для чтения всех данных из файла;
  2. создать ByteArrayInputStream вокруг содержимого файла, которое теперь находится в памяти.

обратите внимание, что это не может быть оптимальным решением для очень больших файлов - все файлы будут храниться в памяти в тот же момент времени. Важно использовать правильный поток для работы.


A ByteArrayInputStream это InputStream обертка вокруг массива байтов. Это означает, что вам придется полностью прочитать файл в byte[], а затем использовать ByteArrayInputStream конструкторы.

можете ли вы дать более подробную информацию о том, что вы делаете с ByteArrayInputStream? Вероятно, есть лучшие способы обойти то, что вы пытаетесь достичь.

Edit:
Если вы используете Apache FTPClient для загрузки, вам просто нужно 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;
}

ссылка: http://howtodoinjava.com/2014/11/04/how-to-read-file-content-into-byte-array-in-java/


Это не совсем то, что вы просите, но это быстрый способ чтения файлов в байтах.

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