Java中如何利用while迴圈語句處理關鍵環節
Java程式碼
<ol class=" list-paddingleft-2"> <li><p>public void handleConnection(Socket connectionToHandle) { </p></li> <li><p>new Thread(new ConnectionHandler(connectionToHandle)).<br>start(); </p></li> <li><p>} </p></li> <li><p>public void handleConnection(Socket connectionToHandle) { </p></li> <li><p>new Thread(new ConnectionHandler(connectionToHandle)).<br>start(); </p></li> <li><p>} </p></li> </ol>
我們對 RemoteFileServer 所做的大幅改變就體現在這個方法上。我們仍然在伺服器接受一個連線之後呼叫 handleConnection() ,但現在我們把該 Socket 傳遞給 ConnectionHandler 的一個實例,它是 Runnable 的。我們用 ConnectionHandler 創建一個新 Thread 並啟動它。 ConnectionHandler 的 run() 方法包含Socket 讀取/寫入和讀取 File 的程式碼,這些程式碼原來在 RemoteFileServer 的 handleConnection() 中。
4. 處理連線:第 2 部分
這裡是 ConnectionHandler 類別的結構:
Java程式碼
import java.io.*; import java.net.*; public class ConnectionHandler implements Runnable{ Socket socketToHandle; public ConnectionHandler(Socket aSocketToHandle) { socketToHandle = aSocketToHandle; } public void run() { } } import java.io.*; import java.net.*; public class ConnectionHandler implements Runnable{ Socket socketToHandle; public ConnectionHandler(Socket aSocketToHandle) { socketToHandle = aSocketToHandle; } public void run() { }
這個助手類別相當簡單。跟我們到目前為止的其它類別一樣,我們導入 java.net 和 java.io 。這個類別只有一個實例變數 socketToHandle ,它保存由該實例處理的 Socket 。類別的建構器用一個 Socket 實例作參數並將它賦給 socketToHandle 。
請注意該類別實作了 Runnable 介面。實作這個介面的類別都必須實作 run() 方法,我們的類別就是這樣做的。稍後我們將探討 run() 的細節。現在只需知道它將實際處理連接,所使用的程式碼跟我們先前在 RemoteFileServer 類別中看到的是一樣的。
實作run()
這裡我們實作run() 方法,它將攫取我們的連接的流,用它來讀寫該連接,並在任務完成之後關閉它:
Java程式碼
public void run() { try { PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream()); BufferedReader streamReader = new BufferedReader(new InputStreamReader(socketToHandle.getInputStream())); String fileToRead = streamReader.readLine(); BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead)); String line = null; while ((line = fileReader.readLine()) != null) streamWriter.println(line); fileReader.close(); streamWriter.close(); streamReader.close(); } catch (Exception e) { System.out.println("Error handling a client: " + e); } } public void run() { try { PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream()); BufferedReader streamReader = new BufferedReader(new InputStreamReader(socketToHandle.getInputStream())); String fileToRead = streamReader.readLine(); BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead)); String line = null; while ((line = fileReader.readLine()) != null) streamWriter.println(line); fileReader.close(); streamWriter.close(); streamReader.close(); } catch (Exception e) { System.out.println("Error handling a client: " + e); } }
ConnectionHandler的run() 方法所做的事情就是RemoteFileServer 上的handleConnection() 所做的事情。首先,我們把 InputStream 和 OutputStream 分別包裝(用 Socket 的 getOutputStream() 和 getInputStream() )進 BufferedReader 和 PrintWriter 。然後我們用這些程式碼逐行地讀取目標檔:
Java程式碼
FileReader fileReader = new FileReader(new File(streamReader.readLine())); BufferedReader bufferedFileReader = new BufferedReader(fileReader); String line = null; while ((line = bufferedFileReader.readLine()) != null) { streamWriter.println(line); } FileReader fileReader = new FileReader(new File(streamReader.readLine())); BufferedReader bufferedFileReader = new BufferedReader(fileReader); String line = null; while ((line = bufferedFileReader.readLine()) != null) { streamWriter.println(line); }
請記住我們應該從客戶機取得一個有效的檔案路徑,這樣用該路徑名建構一個新File ,把它包裝進FileReader 以處理讀取文件的操作,然後把它包裝進BufferedReader 以讓我們逐行地讀該文件。我們在 Java while迴圈語句中呼叫 BufferedReader 上的 readLine() 直到不再有要讀的行。請記注,對 readLine() 的呼叫將造成阻塞,直到有位元組來到為止。我們取得一些位元組之後就把它們放到本地的 line 變數中,然後寫出到客戶機上。
以上是Java中如何利用while迴圈語句處理關鍵環節的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4
