Rumah >Java >javaTutorial >Bagaimana untuk Mengendalikan Strim Input/Output dengan Benar dalam Proses Java untuk Mengelakkan Penyekatan?
Proses Java dengan Strim Input/Output
Pertimbangkan coretan kod berikut:
Scanner scan = new Scanner(System.in); Process process = Runtime.getRuntime().exec("/bin/bash"); OutputStream stdin = process.getOutputStream(); InputStream stderr = process.getErrorStream(); InputStream stdout = process.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(stdout)); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin)); String input = scan.nextLine(); input += "\n"; writer.write(input); writer.flush(); input = scan.nextLine(); input += "\n"; writer.write(input); writer.flush(); while ((line = reader.readLine()) != null) { System.out.println("Stdout: " + line); } input = scan.nextLine(); input += "\n"; writer.write(input); writer.close(); while ((line = reader.readLine()) != null) { System.out.println("Stdout: " + line); }
Kod ini membenarkan anda untuk memasukkan arahan dalam shell bash dan menerima outputnya. Walau bagaimanapun, selepas input dan output awal, input seterusnya tidak menghasilkan output yang dijangkakan.
Mengapa Ini Berlaku
Isu timbul kerana kod tidak mengendalikan dengan betul keadaan akhir fail (EOF) untuk output standard proses bash. Gelung while ((line = reader.readLine()) != null) hanya akan keluar apabila proses keluar, yang bermaksud bahawa jika tiada output selanjutnya daripada proses, gelung akan menyekat selama-lamanya.
Penyelesaian Cadangan - ProcessBuilder dan --EOF-- Pengendalian
Untuk menangani isu ini, pertimbangkan perkara berikut pengubahsuaian:
ProcessBuilder builder = new ProcessBuilder("/bin/bash"); builder.redirectErrorStream(true); Process process = builder.start();
Dengan menggunakan ProcessBuilder dan bukannya Runtime.getRuntime().exec(), anda boleh mengubah hala ralat standard proses bash ke output standardnya, memastikan anda hanya memerlukan satu aliran input.
Selain itu, kod boleh diubah suai untuk menghantar pembatas khas, --EOF--, untuk menandakan tamatnya output daripada arahan. Ini membolehkan kod mengasingkan output daripada berbilang perintah dengan pasti.
while (scan.hasNext()) { String input = scan.nextLine(); if (input.trim().equals("exit")) { // Putting 'exit' amongst the echo --EOF--s below doesn't work. writer.write("exit\n"); } else { writer.write("((" + input + ") & echo --EOF-- || echo --EOF--)\n"); } writer.flush(); line = reader.readLine(); while (line != null && !line.trim().equals("--EOF--")) { System.out.println("Stdout: " + line); line = reader.readLine(); } }
Dengan perubahan ini, kod akan mengendalikan berbilang arahan dan outputnya dengan pasti, memberikan kefungsian yang diingini.
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Strim Input/Output dengan Benar dalam Proses Java untuk Mengelakkan Penyekatan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!