程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java while循環語句如何處理關鍵環節

Java while循環語句如何處理關鍵環節

編輯:關於JAVA

Java while循環語句會有很多重要的環節都使用到。下面我們就來看看相關的問題解決方案和相關的代碼。希望大家在之後的學習和生活中能更好的使用Java while循環語句。

  這裡我們將討論 handleConnection() 方法的結構,這個方法生成一個新的 Thread 來處理每個連接。我們將分兩部分討論這個問題。這一屏我們將著重該方法本身,然後在下一屏研究該方法所使用的 ConnectionHandler 助手類的結構。

  Java代碼

  1.public void handleConnection(Socket connectionToHandle) {

  2.new Thread(new ConnectionHandler(connectionToHandle)).

  start();

  3.}

  4.public void handleConnection(Socket connectionToHandle) {

  5.new Thread(new ConnectionHandler(connectionToHandle)).

  start();

  6.}

  我們對 RemoteFileServer 所做的大改動就體現在這個方法上。我們仍然在服務器接受一個連接之後調用 handleConnection() ,但現在我們把該 Socket 傳遞給 ConnectionHandler 的一個實例,它是 Runnable 的。我們用 ConnectionHandler 創建一個新 Thread 並啟動它。ConnectionHandler 的 run() 方法包含Socket 讀/寫和讀 File 的代碼,這些代碼原來在 RemoteFileServer 的 handleConnection() 中。

  4. 處理連接:第 2 部分

  這裡是 ConnectionHandler 類的結構:

  Java代碼

  7.import Java.io.*;

  8.import Java.Net.*;

  9.public class ConnectionHandler implements Runnable{

  10.Socket socketToHandle;

  11.public ConnectionHandler(Socket aSocketToHandle) {

  12.socketToHandle = aSocketToHandle;

  13.}

  14.public void run() {

  15.}

  16.}

  17.import Java.io.*;

  18.import Java.Net.*;

  19.public class ConnectionHandler implements Runnable{

  20.Socket socketToHandle;

  21.public ConnectionHandler(Socket aSocketToHandle) {

  22.socketToHandle = aSocketToHandle;

  23.}

  24.public void run() {

  25.}

  這個助手類相當簡單。跟我們到目前為止的其它類一樣,我們導入 Java.Net 和 Java.io 。該類只有一個實例變量 socketToHandle ,它保存由該實例處理的 Socket 。類的構造器用一個 Socket 實例作參數並將它賦給 socketToHandle 。

  請注意該類實現了 Runnable 接口。實現這個接口的類都必須實現 run() 方法,我們的類就是這樣做的。稍後我們將探究 run() 的細節。現在只需知道它將實際處理連接,所用的代碼跟我們先前在 RemoteFileServer 類中看到的是一樣的。

  實現 run()

  這裡我們實現 run() 方法,它將攫取我們的連接的流,用它來讀寫該連接,並在任務完成之後關閉它:

  Java代碼

  26.public void run() {

  27.try {

  28.PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream());

  29.BufferedReader streamReader =

  30.new BufferedReader(new InputStreamReader(socketToHandle.getInputStream()));

  31.String fileToRead = streamReader.readLine();

  32.BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead));

  33.String line = null;

  34.while ((line = fileReader.readLine()) != null)

  35.streamWriter.println(line);

  36.fileReader.close();

  37.streamWriter.close();

  38.streamReader.close();

  39.} catch (Exception e) {

  40.System.out.println("Error handling a clIEnt: " + e);

  41.}

  42.}

  43.public void run() {

  44.try {

  45.PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream());

  46.BufferedReader streamReader =

  47.new BufferedReader(new InputStreamReader(socketToHandle.getInputStream()));

  48.String fileToRead = streamReader.readLine();

  49.BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead));

  50.String line = null;

  51.while ((line = fileReader.readLine()) != null)

  52.streamWriter.println(line);

  53.fileReader.close();

  54.streamWriter.close();

  55.streamReader.close();

  56.} catch (Exception e) {

  57.System.out.println("Error handling a clIEnt: " + e);

  58.}

  59.}

  ConnectionHandler的 run() 方法所做的事情就是 RemoteFileServer 上的 handleConnection() 所做的事情。首先,我們把 InputStream 和 OutputStream 分別包裝(用 Socket 的 getOutputStream() 和 getInputStream() )進 BufferedReader 和 PrintWriter 。然後我們用這些代碼逐行地讀目標文件:

  Java代碼

  60.FileReader fileReader = new FileReader(new File(streamReader.readLine()));

  61.BufferedReader bufferedFileReader = new BufferedReader(fileReader);

  62.String line = null;

  63.while ((line = bufferedFileReader.readLine()) != null) {

  64.streamWriter.println(line);

  65.}

  66.FileReader fileReader = new FileReader(new File(streamReader.readLine()));

  67.BufferedReader bufferedFileReader = new BufferedReader(fileReader);

  68.String line = null;

  69.while ((line = bufferedFileReader.readLine()) != null) {

  70.streamWriter.println(line);

  71.}

  請記住我們應該從客戶機獲取一條有效的文件路徑,這樣用該路徑名構造一個新 File ,把它包裝進 FileReader 以處理讀文件的操作,然後把它包裝進 BufferedReader 以讓我們逐行地讀該文件。我們在 Java while循環語句中調用 BufferedReader 上的 readLine() 直到不再有要讀的行。請記注,對 readLine() 的調用將造成阻塞,直到有字節來到為止。我們獲取一些字節之後就把它們放到本地的 line 變量中,然後寫出到客戶機上。完成讀寫操作之後,我們關閉打開的流。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved