سؤال

ولدي الطبقة التي تدير إنشاء مستندات RTF وأسلوب في تلك الفئة التي تدعو محرر RTF مع ملف XML للعرض.

ولكن كل مستخدم واحد يمكن الوصول إلى هذا المحرر دون أية مشاكل. هذا مستخدم واحد يعمل باستمرار إلى قضية حيث توقف تطبيقها فقط. لا توجد أية أخطاء في أي السجلات. عادة يتم التعرف على هذا النوع من المشاكل بسهولة واستنساخه وتصحيحها، ولكن لا أستطيع لحياة لي التكاثر بحيث تفشل محاولاتي في التصحيح.

والأساس هو رمز كما يلي:

int exitVal = CUBSRTFEditor.runRTFEditor("c:\\tmp\\control"+ap_doc_id+".xml", xml,"I:\\AppealsLetters.exe /process \"c:\\tmp\\control"+ap_doc_id+".xml\"");

public static int runRTFEditor(String xmlLocation, String xmlContent, String executePath)
{
    int exitVal = 0;
    createLocalFile(xmlLocation, xmlContent);

    try
    {
        System.out.println("executePath must = "+executePath);
        Runtime rt = Runtime.getRuntime();
        Process proc = rt.exec(executePath);
        System.out.println("after executePath runs");

        //exhaust that stream before waiting for the process to exit
        InputStream inputstream = proc.getInputStream();
        InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
        BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
        // read the ls output
        String line;
        while ((line = bufferedreader.readLine())!= null)
        {
            System.out.println(line);
        }
        exitVal = proc.waitFor();
    }
    catch (Throwable t)
    {
        t.printStackTrace();
    }

    CUBSRTFEditor.deleteTempFile(xmlLocation);

    return exitVal;
}

وإخراج الأخير هو أول System.out. عندما أخذ ملف xml وتنفيذ هذا على أي كمبيوتر آخر ينفذ دون قضية. لا أرى أي معلومات مفيدة في proc.getErrorStream () أو proc.getOutputStream ().

وثائق جافادوك وJDK على هذه المشكلة (شنقا إكسيك): لأن بعض المنابر المحلية لا توفر سوى محدود حجم المخزن المؤقت لالمدخلات والمخرجات تيارات القياسية، وعدم إرسال الفور تيار الإدخال أو قراءة دفق إخراج فرعي أو جانبي قد يتسبب فرعي أو جانبي لمنع، وحتى طريق مسدود.

وأنا أحاول استنفاد هذا الدفق قبل الانتظار لعملية للخروج، وأنه لا يبدو للمساعدة كما لا يبدو للوصول الى هذه النقطة (لم يتم عرض System.out الثاني)

هل لديك I تنفيذ هذا غير صحيح؟ أنا في عداد المفقودين شيء مهم؟ ومن شأن أي أفكار عن كيفية الحصول على المزيد من المعلومات عن عملية تكون كبيرة.

وأنا عالقة ....

هل كانت مفيدة؟

المحلول

وRuntime.exec () هو بطاطا سيئة قليلا مخادعة للعمل مع. لقد وجدت هذه المقالة (القديم، ولكن ذات الصلة لا يزال) أن تكون مفيدة جدا. يمكنك تخطي دائما إلى صفحة 4 لبعض نموذج التعليمات البرمجية gankable للغاية. : -)

وفي لمحة، يحتاج التعليمات البرمجية للتعامل مع كل من proc.getOutputStream () وproc.getErrorStream ()، والذي هو سبب وجيه للتعامل مع هذه الجداول في المواضيع منفصلة.

نصائح أخرى

وأردت أن تحديث هذا لأن التغيير ذهب إلى إنتاج اليوم وعملت. القائم قبالة من الاقتراحات BlairHippo وحصلت عليه للعمل مع فئة الداخلية مجهولة لخلق موضوع مستقل لاستنفاد كل من خطأ وإدخال تيارات.

new Thread(new Runnable(){
    public void run()
    {
        try
        {
            BufferedReader br = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
            String line;
            while ((line = br.readLine())!= null)
            {
                System.out.println(line);
            }
        }
        catch (Throwable t)
        {
            t.printStackTrace();
        }
    }
}).start();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top