Java - (андроид) Повторное использование процесса после промывки его OutputStream

голоса
47

им пытаются сделать это на Android:

Process p = Runtime.getRuntime().exec(sh);

   DataOutputStream out = new DataOutputStream(p.getOutputStream());

   out.writeBytes(something useful\n);

   out.close();

   p.waitFor();

   out = new DataOutputStream(p.getOutputStream());

   out.writeBytes(something useful\n);

   out.close();

   p.waitFor();

Во второй раз я исполняю out.writeBytes (); , Я получаю Java IOException: «Плохой номер файла». Мое приложение должно выполнить несколько местных программ, но всегда использует один и тот же процесс. Кто-нибудь знает, почему это не работает?

Задан 28/08/2010 в 13:01
пользователем
На других языках...                            


2 ответов

голоса
0

Когда вы звоните out.close(), он будет автоматически вызывать close()на ouputstream вашего процесса.

Каждый раз , когда вы вызываете p.getOutputStream()вы получаете то же самое OutputStream, на втором использовании из, p.getOutputStream()возвращает уже закрыт OutputStream.

В основном с кодом, вы на самом деле не нужно , чтобы закрыть первый DataOutputStream.

Источники:

Ответил 28/08/2010 в 13:12
источник пользователем

голоса
1

Обратите внимание, что оболочка не является частью общественного SDK (обратите внимание, это нигде не документировано в документации SDK), так что этот код действует, опираясь на частные API.

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

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

Поэтому в основном ... на 99,99% приложений, пожалуйста, не делайте этого. Если вы пишете терминальное приложение ... ну, ладно, только вундеркинды будут заботиться о том, что в любом случае, и это не будет много пользы, так как он работает в качестве UID, но все в порядке. Но в противном случае, пожалуйста, нет. :)

Ответил 28/08/2010 в 19:23
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more