Memahami Isu Pembacaan Output Perintah JSch
Dalam kod Java yang anda sediakan menggunakan JSch, anda menghadapi situasi di mana atur cara digantung semasa cuba membaca daripada aliran pembaca yang digunakan untuk menangkap output arahan. Artikel ini menerangkan punca isu ini dan menyediakan penyelesaian.
Analisis Masalah
Isu asas timbul daripada tidak menggunakan output yang dihasilkan secara berterusan oleh arahan yang dilaksanakan. Perintah JSch mengumpul output dalam penimbal dalaman, dan jika penimbal terisi sebelum digunakan, ia boleh menyebabkan kebuntuan, di mana perintah itu tergantung menunggu penimbal dikosongkan.
Penyelesaian
Untuk menyelesaikan masalah ini, anda mesti terus membaca kedua-dua output standard dan aliran ralat standard arahan, walaupun semasa menunggu arahan selesai. Ini memastikan penimbal keluaran tidak pernah terisi dan arahan tidak digantung.
Kod Contoh
Berikut ialah versi lanjutan kod anda yang menggabungkan penyelesaian ini:
<code class="java">ChannelExec channel = (ChannelExec)session.openChannel("exec"); channel.setCommand(...); // Set the command to execute ByteArrayOutputStream outputBuffer = new ByteArrayOutputStream(); ByteArrayOutputStream errorBuffer = new ByteArrayOutputStream(); InputStream in = channel.getInputStream(); InputStream err = channel.getExtInputStream(); channel.connect(); byte[] tmp = new byte[1024]; while (true) { while (in.available() > 0) { int i = in.read(tmp, 0, 1024); if (i < 0) break; outputBuffer.write(tmp, 0, i); } while (err.available() > 0) { int i = err.read(tmp, 0, 1024); if (i < 0) break; errorBuffer.write(tmp, 0, i); } if (channel.isClosed()) { if ((in.available() > 0) || (err.available() > 0)) continue; System.out.println("exit-status: " + channel.getExitStatus()); break; } try { Thread.sleep(1000); } catch (Exception ee) { } } System.out.println("output: " + outputBuffer.toString("UTF-8")); System.out.println("error: " + errorBuffer.toString("UTF-8")); channel.disconnect();</code>
Dalam contoh ini, gelung while membaca aliran keluaran (dalam dan err) secara berterusan sambil memantau status arahan (channel.isClosed()). Ini memastikan semua output ditangkap, walaupun arahan itu menghasilkan sejumlah besar data.
Atas ialah kandungan terperinci Mengapa arahan JSch saya tergantung semasa membaca output?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!