Преобразовать InputStream в байтовый массив в Java

При использовании Set-Content вместо Out-File вы можете указать кодировку Byte, которая может использоваться для записи массива байтов в файл. Это в сочетании с пользовательской кодировкой UTF8, которая не испускает спецификацию, дает желаемый результат:

# This variable can be reused
$utf8 = New-Object System.Text.UTF8Encoding $false

$MyFile = Get-Content $MyPath -Raw
Set-Content -Value $utf8.GetBytes($MyFile) -Encoding Byte -Path $MyPath

. Разница в использовании [IO.File]::WriteAllLines() или аналогичной заключается в том, что она должна работать нормально с любым типом элемента и путь, а не только фактические пути к файлам.

786
задан Duncan Jones 10 September 2014 в 10:09
поделиться

9 ответов

Вы можете использовать Apache Commons IO для решения этой и подобных задач.

Тип IOUtils имеет статический метод для чтения ] InputStream и вернуть байт [] .

InputStream is;
byte[] bytes = IOUtils.toByteArray(is);

Внутренне это создает ByteArrayOutputStream и копирует байты в вывод, затем вызывает toByteArray () . Он обрабатывает большие файлы, копируя байты блоками по 4 КиБ.

1093
ответ дан 22 November 2019 в 21:17
поделиться
public static byte[] getBytesFromInputStream(InputStream is) throws IOException {
    ByteArrayOutputStream os = new ByteArrayOutputStream(); 
    byte[] buffer = new byte[0xFFFF];
    for (int len = is.read(buffer); len != -1; len = is.read(buffer)) { 
        os.write(buffer, 0, len);
    }
    return os.toByteArray();
}
37
ответ дан Ivan Gammel 10 September 2014 в 10:09
поделиться

Если вы используете Google Guava , это будет так же просто, как:

byte[] bytes = ByteStreams.toByteArray(inputStream);
114
ответ дан Antonio 10 September 2014 в 10:09
поделиться

Наконец, через двадцать лет, существует простое решение без необходимости использования сторонней библиотеки, благодаря Java 9 :

InputStream is;
…
byte[] array = is.readAllBytes();

Обратите внимание также на удобные методы readNBytes(byte[] b, int off, int len) и transferTo(OutputStream) для удовлетворения повторяющихся потребностей.

255
ответ дан Holger 10 September 2014 в 10:09
поделиться

Острота Kotlin без сторонних зависимостей:

var arr: ByteArray = stream.bufferedReader().use(BufferedReader::readText).toByteArray()

(я понимаю, вопрос о Java, но многие люди смешивают и соответствуют ему Kotlin в эти дни.)

0
ответ дан Gabor 28 July 2019 в 16:47
поделиться
  • 1
    @lukas: Пожалуйста, вставьте его в " answer" или на pastebin/ideone/whatever, таким образом, я вижу то, что Вы имеете? – Ben Voigt 2 May 2012 в 03:54

Вам необходимо прочитать каждый байт из вашего InputStream и записать его в ByteArrayOutputStream . Затем вы можете получить базовый массив байтов, вызвав toByteArray () ; например,

InputStream is = ...
ByteArrayOutputStream buffer = new ByteArrayOutputStream();

int nRead;
byte[] data = new byte[16384];

while ((nRead = is.read(data, 0, data.length)) != -1) {
  buffer.write(data, 0, nRead);
}

return buffer.toByteArray();
438
ответ дан 22 November 2019 в 21:17
поделиться

You ' Вам нужно будет вернуть несколько частей информации для вашего ответа. К счастью, вы можете легко сделать это с помощью JSON, и jQuery автоматически обработает его за вас, если вы укажете тип ответа json. Объект, который вы добавляете в свою функцию обратного вызова ajax, будет содержать все необходимые вам фрагменты данных в виде различных свойств.

Я бы посоветовал выработать привычку возвращать код состояния «успех» или «сбой» при каждом вызове ajax. , и набор ошибок с ним. См. Эту замечательную запись в блоге для получения дополнительной информации о том, что я имею в виду.

Причина этого в том, что вызов ajax всегда в основном "успешен", если только сервер действительно не может обработать запрос и не вернет код состояния HTTP сбоя. Если результат запроса похож на ошибку проверки, этот объект, чтобы получить рекомендованный прямоугольники рамки для вашего который вы можете найти в пакете javax.imageio . Вы можете прочитать изображение из файла, используя всего одну строку кода:

BufferedImage image = ImageIO.read(new File("image.jpg"));

Это даст вам BufferedImage , а не байт [] . Чтобы получить данные изображения, вы можете вызвать getRaster () в BufferedImage . Это даст вам объект Raster , у которого есть методы для доступа к данным пикселей (у него есть несколько методов getPixel () / getPixels () ).

Найдите в документации API для javax.imageio.ImageIO , java.awt.image.BufferedImage , java.awt.image.Raster и т. Д.

ImageIO по умолчанию поддерживает ряд форматов изображений: JPEG, PNG, BMP, WBMP и GIF. Можно добавить поддержку большего количества форматов (вы d требуется подключаемый модуль, реализующий интерфейс поставщика услуг ImageIO).

См. также следующий учебник: Работа с изображениями

19
ответ дан 22 November 2019 в 21:17
поделиться
Input Stream is ...
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int next = in.read();
while (next > -1) {
    bos.write(next);
    next = in.read();
}
bos.flush();
byte[] result = bos.toByteArray();
bos.close();
8
ответ дан 22 November 2019 в 21:17
поделиться

Коды ниже

public static byte[] serializeObj(Object obj) throws IOException {
  ByteArrayOutputStream baOStream = new ByteArrayOutputStream();
  ObjectOutputStream objOStream = new ObjectOutputStream(baOStream);

  objOStream.writeObject(obj); 
  objOStream.flush();
  objOStream.close();
  return baOStream.toByteArray(); 
} 

ИЛИ

BufferedImage img = ...
ByteArrayOutputStream baos = new ByteArrayOutputStream(1000);
ImageIO.write(img, "jpeg", baos);
baos.flush();
byte[] result = baos.toByteArray();
baos.close();
-2
ответ дан 22 November 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: