Java while循环语句如何处理关键环节

开发 后端
Java while循环语句需要我们不断的学习,在细节方面我们会有很多需要注意的地方。下面我们就看看如何才能更好的学习。

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();  

 

我们对 RemoteFileServer 所做的大改动就体现在这个方法上。我们仍然在服务器接受一个连接之后调用 handleConnection() ,但现在我们把该 Socket 传递给 ConnectionHandler 的一个实例,它是 Runnable 的。我们用 ConnectionHandler 创建一个新 Thread 并启动它。ConnectionHandler 的 run() 方法包含Socket 读/写和读 File 的代码,这些代码原来在 RemoteFileServer 的 handleConnection() 中。

4. 处理连接:第 2 部分

这里是 ConnectionHandler 类的结构:

Java代码

  1. import java.io.*;   
  2. import java.net.*;   
  3. public class ConnectionHandler implements Runnable{   
  4. Socket socketToHandle;   
  5. public ConnectionHandler(Socket aSocketToHandle) {   
  6. socketToHandle = aSocketToHandle;   
  7. }   
  8. public void run() {   
  9. }   
  10. }   
  11. import java.io.*;  
  12. import java.net.*;  
  13. public class ConnectionHandler implements Runnable{  
  14. Socket socketToHandle;  
  15. public ConnectionHandler(Socket aSocketToHandle) {  
  16. socketToHandle = aSocketToHandle;  
  17. }  
  18. public void run() {  

这个助手类相当简单。跟我们到目前为止的其它类一样,我们导入 java.net 和 java.io 。该类只有一个实例变量 socketToHandle ,它保存由该实例处理的 Socket 。类的构造器用一个 Socket 实例作参数并将它赋给 socketToHandle 。

请注意该类实现了 Runnable 接口。实现这个接口的类都必须实现 run() 方法,我们的类就是这样做的。稍后我们将探究 run() 的细节。现在只需知道它将实际处理连接,所用的代码跟我们先前在 RemoteFileServer 类中看到的是一样的。

实现 run()

这里我们实现 run() 方法,它将攫取我们的连接的流,用它来读写该连接,并在任务完成之后关闭它:

Java代码

  1. public void run() {   
  2. try {   
  3. PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream());   
  4. BufferedReader streamReader =   
  5. new BufferedReader(new InputStreamReader(socketToHandle.getInputStream()));   
  6. String fileToRead = streamReader.readLine();   
  7. BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead));   
  8. String line = null;   
  9. while ((line = fileReader.readLine()) != null)   
  10. streamWriter.println(line);   
  11. fileReader.close();   
  12. streamWriter.close();   
  13. streamReader.close();   
  14. } catch (Exception e) {   
  15. System.out.println("Error handling a client: " + e);   
  16. }   
  17. }   
  18. public void run() {  
  19. try {  
  20. PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream());  
  21. BufferedReader streamReader =  
  22. new BufferedReader(new InputStreamReader(socketToHandle.getInputStream()));  
  23. String fileToRead = streamReader.readLine();  
  24. BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead));  
  25. String line = null;  
  26. while ((line = fileReader.readLine()) != null)  
  27. streamWriter.println(line);  
  28. fileReader.close();  
  29. streamWriter.close();  
  30. streamReader.close();  
  31. } catch (Exception e) {  
  32. System.out.println("Error handling a client: " + e);  
  33. }  

 

ConnectionHandler的 run() 方法所做的事情就是 RemoteFileServer 上的 handleConnection() 所做的事情。首先,我们把 InputStream 和 OutputStream 分别包装(用 Socket 的 getOutputStream() 和 getInputStream() )进 BufferedReader 和 PrintWriter 。然后我们用这些代码逐行地读目标文件:

Java代码

  1. FileReader fileReader = new FileReader(new File(streamReader.readLine()));   
  2. BufferedReader bufferedFileReader = new BufferedReader(fileReader);   
  3. String line = null;   
  4. while ((line = bufferedFileReader.readLine()) != null) {   
  5. streamWriter.println(line);   
  6. }   
  7. FileReader fileReader = new FileReader(new File(streamReader.readLine()));  
  8. BufferedReader bufferedFileReader = new BufferedReader(fileReader);  
  9. String line = null;  
  10. while ((line = bufferedFileReader.readLine()) != null) {  
  11. streamWriter.println(line);  
  12. }  

 

请记住我们应该从客户机获取一条有效的文件路径,这样用该路径名构造一个新 File ,把它包装进 FileReader 以处理读文件的操作,然后把它包装进 BufferedReader 以让我们逐行地读该文件。我们在 Java while循环语句中调用 BufferedReader 上的 readLine() 直到不再有要读的行。请记注,对 readLine() 的调用将造成阻塞,直到有字节来到为止。我们获取一些字节之后就把它们放到本地的 line 变量中,然后写出到客户机上。完成读写操作之后,我们关闭打开的流。

【编辑推荐】

  1. 用Java多线程实现无阻塞读取远程文件
  2. 使用Java多线程实现任务分发
  3. Java多线程初学者指南系列教程
  4. Java多线程优化之偏向锁原理分析
  5. Java多线程程序如何掌握基本语法
责任编辑:张浩 来源: 计算机世界
相关推荐

2014-11-10 10:05:58

综合布线

2009-01-19 14:29:06

ETL数据仓库本质

2023-06-06 15:47:26

人工智能ChatGPT

2010-03-17 09:33:30

Java多线程方案

2013-01-20 19:40:21

2022-09-26 07:11:12

数据堆栈视频模式

2010-09-09 16:34:19

SQL循环while

2020-12-11 05:57:01

Python循环语句代码

2010-03-19 14:18:07

Java Socket

2022-04-12 07:32:40

引擎模式Spring策略模式

2009-11-10 11:30:12

VB.NET循环语句

2019-08-15 10:20:19

云计算技术安全

2011-12-15 12:32:19

JavaNIO

2012-12-12 09:49:41

2020-12-29 09:11:33

LinuxLinux内核

2017-03-13 13:21:34

Git处理大仓库

2021-03-01 07:31:53

消息支付高可用

2017-10-26 08:43:18

JavaScript内存处理

2019-12-23 10:20:12

Web图片优化前端

2023-02-25 16:33:12

Luawhile
点赞
收藏

51CTO技术栈公众号