Как сохранить байты файла, а затем снова создать этот файл?

Итак, в основном я создаю приложение для Android, в котором я храню содержимое файла на узле сервера. Используя ByteArrayOutputStream, чтобы получить байтовое содержимое выбранного файла следующим образом:

static byte[] convertToBytes(Object object) {
    try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
         ObjectOutput out = new ObjectOutputStream(bos)) {
        out.writeObject(object);
        return bos.toByteArray();
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

Параметр объекта — это место, куда будет передаваться файл. Получение файла — это простой процесс, который заключается в создании намерения и получении данных из функции onActivityResult().

Теперь, например, это (сжатый, истинная длина более 15 000) байтовый массив файла:

[120, -100, 91, -13, -106, -127, -75, -72, -120, -127, 39, 43, -79, 44, 81, 47, 51, 95, -49, 45, 51, 39, -107, 69, 119, -119, 43, 31, -17, -109, -1, -52, 12, -116, 62, 12, 44, 5, -119, 37, 25, 37, 12, 66, 62, 32, 21, -6, 57, -119, 121, -23, -6, -63, 37, 69, -103, 121, -23, -42, 21, 5, 37, 12, -22, -6, 41, -7, -55, -91, -71, -87, 121, 37, -6, 46, -82, 78, 70, -70, -122, 46, 6, -82, 86, 5, -119, -107, 32, 17, -35, -94, -44, -28, -44, -52, -126, 18, -67, -126, -108, -76, 114, 38, 6, -3, 10, 0, 122, -76, 35, 82]

У меня даже есть функция для преобразования этого набора байтов в файловый объект, например:

static Object convertFromBytes(byte[] bytes) {
    try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
         ObjectInput in = new ObjectInputStream(bis)) {
        return in.readObject();
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        return null;
    }
}

My question is how to open that file in the android device. Will I have to download the file, store it in the device internally and then open it? Or can I open it just like that from my app memory or my server. If not, is there a better way to get the raw contents of a file, and then have a method to create a new file in another phone device by using only those raw contents?

Если кому-то нужны какие-либо разъяснения, они могут сказать мне, и я сделаю все возможное, чтобы опубликовать как можно больше информации. Заранее спасибо!

Уточнение: Мои функции сжатия файла в байт и сжатия байта в файл работают правильно, и проблема не в этом. Проблема заключается в использовании этих байтов и возможности использовать их для создания таких же файлов на других устройствах.

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

Dominik Wuttke 25.07.2019 18:33

Я хочу открыть файл с помощью стандартного приложения устройства, а не просто показать их. Вот как я вас понял :) Но как я могу показать файл внутри своего приложения, так как я хочу не показывать данные, а открывать файл (уже замеченный)?

Gaurav Mall 25.07.2019 18:35

@DominikWuttke Кстати, у меня уже есть данные. И даже преобразовали его в объект java.io.file.

Gaurav Mall 25.07.2019 18:38

Когда у вас есть файловый объект, вы можете сохранить его на своем устройстве с помощью файлового потока и использовать намерение, чтобы позволить Android решить, какое приложение может открыть этот тип файла.

Dominik Wuttke 25.07.2019 18:42

Не могли бы вы опубликовать код или дать мне ссылку, где я могу найти такую ​​​​функцию? Будет большим подспорьем.

Gaurav Mall 25.07.2019 18:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По этой ссылке вы можете прочитать все о доступе к файлам, чтении и записи.

https://developer.android.com/training/data-storage/files#java

это пример из ссылки о том, как записать в файл

String filename = "myfile";
String fileContents = "Hello world!";
FileOutputStream outputStream;

try {
    outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
    outputStream.write(fileContents.getBytes());
    outputStream.close();
} catch (Exception e) {
    e.printStackTrace();
}

Файл хранится там, где вы его сохраняете, вам нужно определить путь, но вы можете сохранить его во внутреннем хранилище, доступном только вашему приложению.

Dominik Wuttke 25.07.2019 20:37

Это больше не работает, или почему вы не принимаете это?

Dominik Wuttke 26.07.2019 15:33

То, что вы ищете, это Files.readAllBytes(), чтобы получить массив байтов из файла.

Dominik Wuttke 26.07.2019 16:54

Пункт 2 в этой ссылке должен решить вашу проблему Howtodoinjava.com/java/io/…

Dominik Wuttke 26.07.2019 17:11

Эй, посмотри на меня. Я только что создал проект из-за этого. Большое тебе спасибо :)

Gaurav Mall 15.08.2019 14:11

Другие вопросы по теме