2

重複の可能性:
BufferedReader.readLine() が読み取られず、システムがハングアップする (待機)

MYSQL データベースをインポートしようとしていますが、BufferedReader.readLine() Methode で問題に直面しているため、システムが何かを待機しています。コードはしばらくしてからデータベースのバックアップをインポートしますが、システムは常に実行され、readLine メソッドはシステムが前進することを許可しません。このコードでは出力が得られます。1 2 3 4 4a そしてシステムは何かを待ち始めます。事前に感謝します

public static boolean restoreDB(String dbName, String dbUserName, String dbPassword, String source) {
    String[] executeCmd = new String[]{"C:\\Program Files\\MySQL\\MySQL Server 5.5\\bin\\mysql", "--user=" + dbUserName, "--password=" + dbPassword, "-e", "source \"D:/khokher/medmax.sql\""};

    System.out.println("1 Processing Start");
    Process runtimeProcess = null;
    try {
        String line = "";
        System.out.println("2");

        runtimeProcess = new ProcessBuilder(executeCmd).start();
        System.out.println("3");

        InputStream istrm = runtimeProcess.getInputStream();
        InputStreamReader istrmrdr = new InputStreamReader(istrm);
        BufferedReader buffrdr = new BufferedReader(istrmrdr);
        System.out.println("4");
        String data;
        String st;
        System.out.println("4a");
        while (!(st=buffrdr.readLine()).isEmpty()) { // actual problem is in readLine Method it block system
        System.out.println("5 in loop");
        }

        int ev = 0 ;
        System.out.println("7 .waitFor()");
        if (runtimeProcess.waitFor() != 0) {
        ev = runtimeProcess.exitValue();
        System.out.println("8 process exitValue()");
        }else{
            System.out.println("9 Backup restored successfully");
            return true;
        }



    } catch(InterruptedException e){
        e.printStackTrace();
        System.out.println("10");
         Thread.currentThread().interrupt();
        return false;
    } catch (Exception ex) {
        ex.printStackTrace();
        System.out.println("11");
        Thread.currentThread().interrupt();
        return false;
    } finally { 
        System.out.println("processing stoped");
    }

    return false;
}
4

2 に答える 2

3

buffrdr.readLine()EOF の場合は null を返します

while (!(st=buffrdr.readLine()).isEmpty())NPEを投げます

最初の空行の後で読むのをやめたい場合は、次のようにする必要があります。

while ((( st = buffrdr.readLine()) != null)  && ( ! st.trim().isEmpty()))

runtimeProcess例外がスローされない場合、プロセスが終了せず、空の行が出力されることもないため、プログラムは停止しません。

のエラー ストリームを読み取る必要がありますruntimeProcess。これは、ストリームを飽和させてプロセスをハングさせる可能性があるためです (EJP で示されているように)。

于 2012-11-12T07:18:45.950 に答える
1

@Aubin は NPE を指摘するのは完全に正しいですが、readLine() がブロックされた場合、利用可能なデータはありません。つまり、送信者は送信していません。これは、実行中のプロセスの stdin を閉じていないことが原因である可能性があります。また、エラー ストリームを読み取っていないことが原因である可能性もあります。自分のスレッドを中断することも無意味です。

于 2012-11-12T07:24:03.700 に答える