Java网络编程与文件处理全解析
立即解锁
发布时间: 2025-08-17 02:29:08 阅读量: 3 订阅数: 5 

### Java网络编程与文件处理全解析
#### 1. Java NIO 进一步细节
在实现基本的非阻塞服务器时,除了之前介绍的内容,还有一些方法在更复杂的实现中经常会用到。下面将介绍一些相关方法,这些方法对于许多 NIO 应用来说是很有用的。
##### 1.1 字节级 I/O 操作
虽然 `read` 和 `write` 方法是常用的数据传输方法,但有时需要在字节级别进行 I/O 操作。例如,当需要将特定值放入缓冲区或从缓冲区中移除部分数据进行进一步处理时。`ByteBuffer` 类提供了 `get` 和 `put` 方法来读写单个字节。
```java
byte oneByte = buffer.get();
buffer.put(anotherByte);
```
##### 1.2 访问 ByteBuffer 内部数组
每个 `ByteBuffer` 内部都有一个数组用于存储数据。可以使用 `array` 方法直接访问这个数组。
```java
byte[] bufferArray = buffer.array();
```
##### 1.3 字节数组与字符串的转换
如果传输的数据是字符串类型,可以使用 `String` 类的构造函数将字节数组转换为字符串。
```java
int numBytes = buffer.position();
byte[] bufferArray = buffer.array();
String dataString = new String(bufferArray, 0, numBytes);
```
同时,`String` 类的 `getBytes` 方法可以将字符串转换为字节数组。
```java
String myStringData = "Just an example";
byte[] byteData = myStringData.getBytes();
buffer.put(byteData);
```
#### 2. 练习
以下是一些相关的练习,通过这些练习可以更好地掌握所学知识。
| 练习编号 | 练习内容 |
| ---- | ---- |
| 3.1 | 复制 `ThreadHelloCount` 示例代码,检查代码,编译并运行程序,观察结果。 |
| 3.2 | 修改上述代码,使用实现 `Runnable` 接口的方法进行多线程编程。主类命名为 `RunnableHelloBye`,附属类分别命名为 `Hello` 和 `Goodbye`。`Hello` 类应显示 10 次 "Hello!" 消息,每次显示之间有 0 - 2 秒的随机延迟;`Goodbye` 类做相同操作,显示 "Goodbye!" 消息。 |
| 3.3 | 复制 `ResourceServer` 代码,检查并运行程序。 |
| 3.4 | 复制 `MultiEchoClient` 代码,重命名为 `ConsumerClient`。修改代码,使程序作为 `ResourceServer` 的客户端,确保用户只能向服务器传递 0 或 1。使用两个客户端测试服务器的操作。 |
| 3.5 | 实现一个基于多线程服务器的基本电子聊天室应用程序。服务器需要将接收到的每条消息广播给所有连接的客户端,并维护一个与客户端关联的 `Socket` 引用的动态列表。客户端应实现为一个 GUI,能够发送和接收消息,直到发送 "Bye" 字符串。需要一个单独的线程来接收服务器的消息,并将其累积添加到文本区域。 |
| 3.6 | 实现与练习 3.5 相同的电子聊天室应用程序,但这次服务器使用 Java 的非阻塞 I/O。可以使用原有的客户端程序,但客户端应在收到并显示从服务器返回的 "Bye" 消息后关闭套接字。服务器端可以维护两个 `Vector`,分别存储新连接客户端的 `SocketChannel` 引用和 `ChatUser` 实例。 |
下面是处理普通消息的方法示例:
```java
public static void broadcastMessage(String chatName, ByteBuffer buffer)
{
String messagePrefix = chatName + ": ";
byte[] messagePrefixBytes = messagePrefix.getBytes();
final byte[] CR = "\n".getBytes();//Carriage return.
try
{
int messageSize = buffer.position();
byte[] messageBytes = buffer.array();
byte[] messageBytesCopy = new byte[messageSize];
for (int i=0; i<messageSize; i++)
{
messageBytesCopy[i] = messageBytes[i];
}
buffer.clear();
//Concatenate message text onto message prefix...
buffer.put(messagePrefixBytes);
for (int i=0; i<messageSize; i++)
{
buffer.put(messageBytesCopy[i]);
}
buffer.put(CR);
SocketChannel chatSocketChannel;
for (ChatUser chatUser:allUsers)
{
chatSocketChannel = chatUser.getSocketChannel();
buffer.flip();
//Write full message (with user's name)...
chatSocketChannel.write(buffer);
}
}
catch (IOException ioEx)
{
ioEx.printStackTrace();
}
}
```
#### 3. 文件处理学习目标
文件处理在 Java 编程中非常重要,学习文件处理后,应该掌握以下技能:
- 知道如何在 Java 中创建和处理串行文件。
- 知道如何在 Java 中创建和处理随机访问文件。
- 知道如何将控制台输入和输出重定向到磁盘文件。
- 知道如何构建基于 GUI 的文件处理程序。
- 知道如何在 Java 程序中使用命令行参数。
- 理解 Java 序列化机制的概念和重要性,并知道如何实现它。
- 知道如何使用 `Vector` 方便地打包序列化对象。
#### 4. 串行访问文件
串行访问文件是指数据存储在物理相邻位置的文件,新数据通常添加到文件末尾,数据可能没有特定的逻辑顺序。
##### 4.1 串行文件与顺序文件的区别
串行文件常被误称为顺序文件,但顺序文件是串行文件的一种,其中的数据按特定顺序存储,如按账号顺序。串行文件不一定是顺序文件。
##### 4.2 串行文件的优缺点
串行文件有一些明显的缺点,但由于其处理简单,常用于存储相对少量的数据或临时存储。其内部结构可以是二进制或文本格式,这里主要介绍文本文件。
##### 4.3 文本文件的操作
在 J2SE 5.0 之前,文本文件的输入需要 `FileReader` 对象,输出需要 `FileWriter` 对象。从 5.0 开始,可以使用 `File` 对象进行输入或输出。
```java
// 创建输入文件对象
File inputFile = new File("accounts.txt");
// 创建输出文件对象
String fileName = "dataFile.txt";
File outputFile = new File(fileName);
```
如果使用字符串字面量指定文件名,需要注意路径中的反斜杠需要使用双反斜杠。
```java
File resultsFile = new File("c:\\data\\results.txt");
```
可以使用 `Scanner` 对象进行文件输入,`PrintWriter` 对象进行文件输出。
```java
// 输入示例
Scanner input = new Scanner(new File("inFile.txt"));
// 输出示例
PrintWriter output = new PrintWriter(new File("outFile.txt"));
```
使用示例:
```java
String item = input.next();
output.println("Test output");
int number = input.nextInt();
```
在处理完文件后,应该使用 `close` 方法关闭文件,特别是对于输出文件,这可以确保缓冲区的数据被写入文件。
```java
input.close();
```
如果需要向现有文件追加数据,可以使用 `FileWriter` 的构造函数,并将第二个参数设置为 `true`。
```java
FileWriter addFile = new FileWriter("data.txt", true);
PrintWriter output = new PrintWriter(addFile);
```
下面是一个简单的文件输出示例:
```java
import java.io.*;
public class FileTest1
{
public static void main(String[] args) throws IOException
{
PrintWriter output = new PrintWriter(new File("test1.txt"));
output.println("Single line of text!");
output.close();
```
0
0
复制全文
相关推荐










