Запустить команду cat в Android

#android #command-line #terminal #exec

#Android #командная строка #терминал #exec

Вопрос:

Я хочу объединить два файла в Android. Я сделал это из приложения эмулятора терминала, используя команду cat file1 file2 > output_file . Но она не работает, когда я пытаюсь выполнить ее из своего кода.

Это код, который я использовал для выполнения команды.

     public String exec() {
    try {

        // Executes the command.
        String CAT_COMMAND = "/system/bin/cat /sdcard/file1 /sdcard/file2 > /sdcard/output_file";
        Process process = Runtime.getRuntime().exec(CAT_COMMAND);

        // Reads stdout.
        // NOTE: You can write to stdin of the command using
        //       process.getOutputStream().
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        int read;
        char[] buffer = new char[4096];
        StringBuffer output = new StringBuffer();
        while ((read = reader.read(buffer)) > 0) {
            output.append(buffer, 0, read);
        }
        reader.close();

        // Waits for the command to finish.
        process.waitFor();

        return output.toString();
    } catch (IOException e) {

        throw new RuntimeException(e);

    } catch (InterruptedException e) {

        throw new RuntimeException(e);
    }
}
  

Я дал разрешение на запись во внешнее хранилище в манифесте. Чего мне не хватает?

Комментарии:

1. Для запуска процесса вам нужна оболочка, верно ?!?

2. На самом деле вам не нужна оболочка для запуска внешнего процесса. Однако вам нужна оболочка для выполнения перенаправления вывода процесса ( > ).

3. О! какой другой способ выполнить конкатенацию тогда?

4. Просто сделайте это с помощью простого кода Java — см. Мой ответ.

5. Я не понимаю. Разве эмулятор терминала не просто еще одно обычное приложение?

Ответ №1:

Как отмечено в комментарии, вам нужна оболочка для перенаправления вывода процесса (через > ).

Вы можете просто добавлять файлы с помощью этого кода:

 void append(File src, File dst) throws IOException {
    InputStream in = new FileInputStream(src);
    OutputStream out = new FileOutputStream(dst, true);  // `true` means append 

    // Transfer bytes from in to out
    byte[] buf = new byte[1024];
    int len;
    while ((len = in.read(buf)) > 0) {
       out.write(buf, 0, len);
    }
    in.close();
    out.close();
}
  

В вашем случае вызовите ее дважды для file1 и file2 .

Комментарии:

1. Спасибо. Я делал это слишком сложным: D Кроме того, есть ли какой-нибудь способ объединить два видеофайла?

2. Объединение видеофайлов — это совершенно другая проблема. Сначала их нужно распаковать из контейнера (.avi или .mp4), затем видеопотоки необходимо декодировать, затем добавить в один, затем закодировать, а затем упаковать в контейнер. Это задание для библиотеки кодирования / декодирования видео (например, ffmpeg). Android не поставляется с такой функциональностью.

3. Кстати, если ответ достаточно отвечает на ваш вопрос, вы можете принять его, верно?

4. это не сработало для видеофайлов, он просто воспроизвел первый фрагмент видеофайла

5. есть небольшая ошибка, вы вводите true FileInputStream конструктор, но он должен перейти туда FileOutputStream , куда вы на самом деле хотите добавить