Как передать некоторый контент в файл с помощью команды Linux / Unix? - PullRequest
0 голосов
/ 05 мая 2020

Фон

Я пытаюсь извлечь какой-то файл из zip-архива в новое место, даже если для этого нет разрешения (используя «su», если необходимо).

Проблема

Для этого, скажем, мне не разрешено создавать файл, используя обычный фреймворк, а только с помощью команд Linux / Unix Android. У меня есть доступ к содержимому, которое должно быть отправлено в файл.

То, что я пробовал

Я пробовал команду «tee», и она почти работает.

Почему-то отправил только часть файла (68К вместо 656К). Входные данные - это zip-файл, внутри которого находится файл PNG.

fun InputStream.copyToAndClose(out: OutputStream, bufferSize: Int = DEFAULT_BUFFER_SIZE): Long = this.copyTo(out, bufferSize).also { this.close() }


...
        val inputFile = File(Environment.getExternalStorageDirectory(), "1.zip")
        thread {
            ZipFile(inputFile).use {
                for (entry in it.entries()) {
                    val outputFile = File(Environment.getExternalStorageDirectory(), "check.apk")
                    val command = arrayOf("tee", "${outputFile.absolutePath}") // I plan to add here "su" as first parameter, but let's use this for now
                    val process: Process = Runtime.getRuntime().exec(command)
                    try {
                        process.outputStream.use { outputStream -> it.getInputStream(entry).copyToAndClose(outputStream) }
                    } catch (e: Exception) {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) process.destroyForcibly() else process.destroy()
                        throw e
                    }
                    process.waitFor()
                    val inputStr = process.inputStream.reader(Charset.defaultCharset()).readLines()
                    val errStr = process.errorStream.reader(Charset.defaultCharset()).readLines()
                    val isSucceeded = process.exitValue() == 0
                }
            }
        }

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

Я также пробовал несколько вариантов команды «cat», но, похоже, она тоже не работает, или я просто не знаю, как ее использовать для этой цели.

Вопрос

Почему мой код работает только частично? Как это исправить (без создания файла с помощью фреймворка)?

Какой должна быть правильная команда Linux / Unix для копирования из inputStream прямо в новый файл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...