2015-07-27 1 views
1

Мне нужно вызвать скрипт python из приложения Java и вернуть большой текст (ответ json). Я успешно вызвал скрипт, и я могу вернуть некоторый текст в приложение Java. Но когда я попытался вернуть полный ответ json - мое приложение Java зависает, и ничего не происходит. Как я называю питон скрипт:Как вызвать скрипт python из java и вернуть длинный текст?

ProcessBuilder pb = new ProcessBuilder(
    "python", absolutePath, params 
); 
Process ps = pb.start(); 

BufferedReader reader = new BufferedReader(
    new InputStreamReader(ps.getInputStream()) 
); 

ps.waitFor(); 
int ec = ps.exitValue(); 
StringBuffer HTTPResponse = new StringBuffer(); 
String inputLine; 

while ((inputLine = reader.readLine()) != null) { 
     logger.debug(String.format("DEBUG!!!: input = %s", inputLine)); 
     HTTPResponse.append(inputLine); 
} 
+0

Как долго ваш JSON, String может содержать только символы '2^31 - 1'. –

+0

У моего JSON есть 20000-30000 символов –

+0

Не могли бы вы опубликовать фрагмент образца JSON, который вы возвращаете. –

ответ

0

Вы испытываете тупиковой ситуации между родительскими и дочерними процессами.

Это связано с тем, что ваше приложение Java ничего не читает от дочернего процесса до его прекращения. Python будет буферизовать его вывод (до 64k в моей системе), и как только буфер заполнит его, он будет блокироваться при следующей записи. Поскольку он заблокирован, он не будет завершен. Между тем, родитель java также заблокирован, ожидая, пока ребенок закончится, что не произойдет естественным образом.

Чтобы это исправить, нужно перестроить свой код Java таким образом, что это, а не ждать ребенка прекратить перед обработкой его выход, читает от ребенка, пока ребенок не заканчивается, что-то вроде этого:

import java.io.*; 

public class TestProcess { 
    public static void main(String[] args) 
     throws InterruptedException, IOException 
    { 
     ProcessBuilder pb = new ProcessBuilder(
      "python", absolutePath, params 
     ); 
     Process ps = pb.start(); 

     BufferedReader reader = new BufferedReader(
      new InputStreamReader(ps.getInputStream()) 
     ); 

     String inputLine; 
     while ((inputLine = reader.readLine()) != null) { 
       System.out.println(inputLine); 
     } 

     ps.waitFor(); 
     int ec = ps.exitValue(); 
     System.out.println("Child returned " + ec); 
    } 
} 

И ваш сценарий Python может быть:

print 'a' * (1024*1024) 

, который будет производить 1MiB данных.

+0

Большое спасибо !!! –

Смежные вопросы