亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

詳細講解怎樣在Java中運行其它應用程序

2019-11-18 13:07:55
字體:
來源:轉載
供稿:網友

  import java.io.*;
  
  public class CommandWrapper
  {
  PRocess process;
  Thread in;
  Thread out;
  public CommandWrapper(Process process)
  {
  this.process = process;
  final InputStream inputStream =
  process.getInputStream();
  //final BufferedReader
  r=new BufferedReader
  (new InputStreamReader(inputStream));
  final byte[] buffer = new byte[1024];
  out = new Thread()
  {
  //String line;
  int lineNumber=0;
  public void run()
  {
  try {
  while (true)
  {
  int count = inputStream.read(buffer);
  System.out.println
  (lineNumber+":"+new String
  (buffer, 0, count-1));
  //line=r.readLine();
  //System.out.println
  (lineNumber+":"+line);
  lineNumber++;
  }
  }
  catch (Exception e)
  {
  
  }
  }
  };
  final BufferedReader reader =
  new BufferedReader
  (new InputStreamReader(System.in));
  final OutputStream
  outputStream = process.getOutputStream();
  in = new Thread()
  {
  String line;
  public void run()
  {
  try
  {
  while (true)
  {
  outputStream.write(
  (reader.readLine()+"/n").getBytes());
  outputStream.flush();
  }
  }
  catch (Exception e)
  {
  
  }
  }
  };
  }
  
  public void startIn()
  {
  in.start();
  }
  
  public void startOut()
  {
  out.start();
  }
  
  public void interruptIn()
  {
  in.interrupt();
  }
  
  public void interruptOut()
  {
  out.interrupt();
  }
  
  public static void main
  (String[] args)
  {
  try
  {
  CommandWrapper command
  = new CommandWrapper
  (Runtime.getRuntime().exec("native2ascii"));
  command.startIn();
  command.startOut();
  }
  catch (Exception e)
  {
  e.printStackTrace();
  }
  }
  
  }
  
  我以native2ascii為范例程序和網友給我的那個程序做了對比,發現如下幾個在處理這個問題時需要注重的地方:
  
  1、由于不知道目標程序的輸入輸出順序,因此只能建立兩個單獨的線程分別處理輸入和輸出,這樣輸入和輸出就不會阻塞了。但是有些目標程序要求有特定的輸入輸出順序,而經過這個類封裝的結果是在任何狀態下都可以輸入,程序的任何輸出也會被馬上反映出來。這是構造通用類的第一個問題。
  
  2、不能直接使用I/O重定向,在最開始的時候我是考慮直接使用I/O重定向的,但是實際的情況是Process的I/O的定義剛好和我的預想相反,我們從Process取得的InputStream實際上是它的輸出,而取得的OutputStream是它的輸入,這樣就無法進行I/O重定向了,必須我們進行編碼來讀取程序的輸出和寫入控制臺的輸入。(這里的I/O重定向是指想將它的I/O直接重定向到系統的I/O)
  
  3、寫入控制臺的輸入:
  
  outputStream.write(
  (reader.readLine()+"/n").getBytes());
  outputStream.flush();
  
  這里有兩個問題值得注重:第一個是我們在控制臺輸入一行數據以后按下回車,那么語句reader.readLine()可以正確的得到你的輸入,為什么要加那個換行符呢?這是在測試的時候發現的問題,在以native2ascii作為例子的時候發現不加這個的話它不能得到控制臺的輸入,但是我在替那位網友解決的問題的時候他的程序則沒有這個問題。
  
  因此猜想可能是因為有的程序要求讀取的一整行的數據(例如native2ascii),而大部分的命令行程序在編碼的時候讀取的是整數這樣的值或者其他類型的值,他們是以空格或者其他的字符分隔的,因此就不需要那個額外的換行符(例如那位網友的程序讀取的是一元二次方程的三個系數)。
  
  另外一個問題就是flush方法的使用,在最開始的時候沒有想到要這樣刷新進去,無論是否加換行符外部程序都無法讀取寫入的輸入,后來才想到要調用一下這個方法。這個也是在我們輸出的時候應該注重的一個問題,有些需要馬上反應出來的輸出一般都在寫入以后要調用它,否則輸出/輸入不能馬上反應出來。
  
  4、對于程序的輸出,最開始我是構造的一個BufferedReader想以行為單位輸出,對于那位網友的程序,結果證實不是很好用,但是以native2ascii作為例子運行又沒有問題。這個估計和外部程序的代碼也有關系,假如外部程序沒有輸出換行符可能使用BufferedReader就會有問題。但是通過直接讀取輸出就沒有問題了。另外需要注重的就是:
  
  System.out.println
  (lineNumber+":"+new String
  (buffer, 0, count-1));
  
  中嚴格來說應該是:
  
  System.out.println
  (lineNumber+":"+new String
  (buffer, 0, count));
  
  之所以減一是因為讀取輸入的時候人為的多加了一個換行符,假如這個地方不減一就會多輸出一個空行。
  
  基于以上的種種原因,要構造一個執行外部程序的包裝器類不太好辦,非凡是文章中提到的幾個問題。有時間和愛好的朋友可以做一下測試,看看以上的問題和猜測是否正確。
  
  另外附上一段源代碼,是一個fortran的程序:
  
  implicit none
  real a,b,c
  real d
  real root1,root2
  print*,'請輸入一元二次方程
  的系數a,b,c:'
  read(*,*) a,b,c
  d=b**2-4.0*a*c
  if(d>=0.0) then
  root1=(-b+sqrt(d))/(2.0*a)
  root2=(-b-sqrt(d))/(2.0*a)
  print*,'root1=',root1
  print*,'root2=',root2
  else
  print*,'一元二次方程沒有實根!'
  end if
  pause
  end

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情欧美狂野欧美精品| 日韩经典中文字幕在线观看| 午夜欧美不卡精品aaaaa| 69久久夜色精品国产69乱青草| 国产午夜精品一区二区三区| 久久福利视频网| 国产区亚洲区欧美区| 爽爽爽爽爽爽爽成人免费观看| 欧美男插女视频| 亚洲欧洲日产国产网站| 成人在线视频网| 成人性生交xxxxx网站| 欧美精品情趣视频| 九九久久国产精品| 欧美日韩第一页| 国产成+人+综合+亚洲欧洲| 狠狠躁夜夜躁人人爽超碰91| 欧美成人久久久| 国产91ⅴ在线精品免费观看| 8090成年在线看片午夜| 欧美综合在线第二页| 国产精品免费一区| 亚洲色图欧美制服丝袜另类第一页| 亚洲欧美国产精品专区久久| 亚洲国产成人一区| 在线观看视频99| 精品久久久久久亚洲国产300| 国产精品视频区1| 亚洲www视频| 午夜精品一区二区三区在线视频| 日韩欧美国产激情| 日韩暖暖在线视频| 国产精品欧美日韩久久| 欧美一级大片在线免费观看| 亚洲第一区在线观看| 亚洲欧洲在线看| 久久99精品久久久久久青青91| 国产色婷婷国产综合在线理论片a| 这里只有精品在线观看| 欧美日本在线视频中文字字幕| 精品中文字幕久久久久久| 亚洲free嫩bbb| 91精品国产高清久久久久久久久| 欧美电影在线观看完整版| 91sao在线观看国产| 亚州国产精品久久久| 91网站免费观看| 亚洲男女自偷自拍图片另类| 69av成年福利视频| 欧美日韩成人在线视频| 97在线看福利| 国模精品视频一区二区| 日韩免费精品视频| 日韩在线视频观看| 国产亚洲欧美aaaa| 国产欧美日韩精品专区| 日韩不卡在线观看| 精品久久久久久久久久久| 国产成人亚洲综合| 欧美日韩国产一区二区| 国产一区二区三区在线看| 国产亚洲精品美女久久久久| 九九热这里只有精品免费看| 国产情人节一区| 日韩欧美在线观看| 日韩电影免费在线观看中文字幕| 精品二区三区线观看| 久久天天躁夜夜躁狠狠躁2022| 精品成人国产在线观看男人呻吟| 亚洲午夜女主播在线直播| 一区二区欧美亚洲| 91精品视频专区| 国产伦精品免费视频| 亚洲九九九在线观看| 亚洲老司机av| 欧美男插女视频| 国产午夜一区二区| 国产精品久久一区| 久热在线中文字幕色999舞| 中文字幕国产亚洲| 欧美又大粗又爽又黄大片视频| 亚洲欧美在线一区| 亚洲国产精品va在线看黑人| 亚洲自拍偷拍福利| 国产精品入口免费视频一| 成人免费淫片视频软件| 狠狠躁夜夜躁人人躁婷婷91| 日韩视频免费在线观看| 一区二区三区www| 91免费在线视频| 国产精品美女无圣光视频| 国产精品高精视频免费| 国产欧美va欧美va香蕉在| 国产精品电影网站| 人人澡人人澡人人看欧美| 国产美女久久久| 国产在线播放不卡| 国产成人精品在线| 亚洲欧美色图片| 深夜精品寂寞黄网站在线观看| 欧美最猛性xxxxx(亚洲精品)| 一本一本久久a久久精品牛牛影视| 国产剧情日韩欧美| 色噜噜久久综合伊人一本| 久久久中精品2020中文| 久久精品成人欧美大片| 亚洲女在线观看| 久久精视频免费在线久久完整在线看| 亚洲一区二区日本| 最近2019中文字幕mv免费看| 亚洲人成免费电影| 久久精品在线播放| 国产成人福利视频| 国产日韩精品综合网站| 九九热99久久久国产盗摄| 91精品啪在线观看麻豆免费| 欧美色道久久88综合亚洲精品| 日韩一区二区三区xxxx| 亚洲丁香婷深爱综合| 欧美在线xxx| 国产成人精品免高潮费视频| 国产精品久久久久久久久免费看| 日韩av快播网址| 欧美第一黄色网| 欧美日韩国产在线播放| 日韩精品在线影院| 亚洲黄色有码视频| 国产剧情日韩欧美| 亚洲精品国精品久久99热一| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲欧美一区二区三区四区| 久久青草精品视频免费观看| 亚洲一级免费视频| 亚洲精品国精品久久99热一| 日韩经典第一页| 亚洲精品国精品久久99热一| 欧美精品videos性欧美| 国产91精品久久久久久久| 欧美国产第二页| 69国产精品成人在线播放| 国产一区二区三区视频在线观看| 91久久精品美女| 久久久久久久久久久亚洲| 热99精品里视频精品| 亚洲国产成人精品女人久久久| 97在线视频免费播放| 6080yy精品一区二区三区| 久久夜精品香蕉| 国产精品国模在线| 亚洲人a成www在线影院| 97精品国产97久久久久久| 日韩亚洲国产中文字幕| 国产精品视频成人| 国产欧美日韩精品专区| 在线播放精品一区二区三区| 成人性教育视频在线观看| 久久人体大胆视频| 国产免费亚洲高清| 国产精品黄页免费高清在线观看| 国产精品一区二区三区在线播放| 日韩中文在线中文网在线观看| 久久久久久午夜| 欧美一级在线亚洲天堂| 亚洲成人久久电影|