Java I/O 与 NIO:深入文件和网络编程

发布于:2024-06-04 ⋅ 阅读:(153) ⋅ 点赞:(0)

Java I/O 与 NIO:深入文件和网络编程

引言

在现代应用程序中,I/O操作(输入/输出)是必不可少的部分,无论是文件读写还是网络通信。在本篇文章中,我们将深入探讨Java的I/O系统,包括传统的I/O(java.io包)和新I/O(NIO,java.nio包)。通过理解和掌握这些技术,你将能够编写高效的文件操作和网络通信程序。

Java I/O

Java I/O API 提供了丰富的类和接口,用于处理文件、流和其他I/O操作。以下是一些常用的I/O类和其使用方法。

文件操作

文件创建与删除
import java.io.File;
import java.io.IOException;

public class FileExample {
    public static void main(String[] args) {
        File file = new File("example.txt");

        try {
            // 创建新文件
            if (file.createNewFile()) {
                System.out.println("File created: " + file.getName());
            } else {
                System.out.println("File already exists.");
            }

            // 删除文件
            if (file.delete()) {
                System.out.println("Deleted the file: " + file.getName());
            } else {
                System.out.println("Failed to delete the file.");
            }
        } catch (IOException e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
        }
    }
}

文件读写

使用 FileReader 和 FileWriter
import java.io.FileWriter;
import java.io.FileReader;
import java.io.IOException;

public class FileReadWriteExample {
    public static void main(String[] args) {
        try {
            // 写入文件
            FileWriter writer = new FileWriter("example.txt");
            writer.write("Hello, World!");
            writer.close();
            System.out.println("Successfully wrote to the file.");

            // 读取文件
            FileReader reader = new FileReader("example.txt");
            int character;
            while ((character = reader.read()) != -1) {
                System.out.print((char) character);
            }
            reader.close();
        } catch (IOException e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
        }
    }
}

使用 BufferedReader 和 BufferedWriter

import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReadWriteExample {
    public static void main(String[] args) {
        try {
            // 使用 BufferedWriter 写入文件
            BufferedWriter writer = new BufferedWriter(new FileWriter("example.txt"));
            writer.write("Hello, Buffered World!");
            writer.newLine();
            writer.write("This is another line.");
            writer.close();

            // 使用 BufferedReader 读取文件
            BufferedReader reader = new BufferedReader(new FileReader("example.txt"));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        } catch (IOException e) {
            System.out.println("An error occurred.");
            e.printStackTrace();
        }
    }
}

Java NIO

Java NIO(New I/O)引入了非阻塞I/O操作,提供了更高效的文件和网络操作。以下是一些NIO的核心概念和使用示例。

Buffer

Buffer 是NIO中的一个重要概念,用于读写数据。ByteBuffer是最常用的Buffer类型。

import java.nio.ByteBuffer;

public class BufferExample {
    public static void main(String[] args) {
        // 分配一个容量为 48 字节的 ByteBuffer
        ByteBuffer buffer = ByteBuffer.allocate(48);

        // 写入数据到 Buffer
        for (int i = 0; i < buffer.capacity(); i++) {
            buffer.put((byte) i);
        }

        // 翻转 Buffer,准备读取数据
        buffer.flip();

        // 从 Buffer 读取数据
        while (buffer.hasRemaining()) {
            System.out.print(buffer.get() + " ");
        }
    }
}

Channel

Channel 是一种新的数据传输方式,FileChannel 是用于文件操作的常用Channel。

import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.io.IOException;

public class ChannelExample {
    public static void main(String[] args) {
        try {
            RandomAccessFile file = new RandomAccessFile("example.txt", "rw");
            FileChannel channel = file.getChannel();

            // 创建一个 ByteBuffer
            ByteBuffer buffer = ByteBuffer.allocate(48);

            // 从 Channel 读取数据到 Buffer
            int bytesRead = channel.read(buffer);
            while (bytesRead != -1) {
                buffer.flip(); // 切换 Buffer 为读模式

                while (buffer.hasRemaining()) {
                    System.out.print((char) buffer.get());
                }

                buffer.clear(); // 清空 Buffer
                bytesRead = channel.read(buffer);
            }
            file.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Selector

Selector 允许一个线程管理多个 Channel,用于非阻塞I/O操作。

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

public class SelectorExample {
    public static void main(String[] args) {
        try {
            // 打开 ServerSocketChannel
            ServerSocketChannel serverChannel = ServerSocketChannel.open();
            serverChannel.socket().bind(new InetSocketAddress(8080));
            serverChannel.configureBlocking(false);

            // 打开 Selector
            Selector selector = Selector.open();
            serverChannel.register(selector, SelectionKey.OP_ACCEPT);

            while (true) {
                selector.select();

                Set<SelectionKey> selectedKeys = selector.selectedKeys();
                Iterator<SelectionKey> iterator = selectedKeys.iterator();

                while (iterator.hasNext()) {
                    SelectionKey key = iterator.next();

                    if (key.isAcceptable()) {
                        // 接受新连接
                        SocketChannel client = serverChannel.accept();
                        client.configureBlocking(false);
                        client.register(selector, SelectionKey.OP_READ);
                    } else if (key.isReadable()) {
                        // 读取数据
                        SocketChannel client = (SocketChannel) key.channel();
                        ByteBuffer buffer = ByteBuffer.allocate(256);
                        client.read(buffer);
                        String output = new String(buffer.array()).trim();
                        System.out.println("Message received: " + output);
                        client.close();
                    }
                    iterator.remove();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

文件操作与NIO 2.0

Java 7引入了NIO 2.0,增强了文件操作功能,简化了文件的读写、复制、移动和删除等操作。

文件读取和写入

使用Files类可以轻松读取和写入文件。

import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.List;

public class NIO2FileReadWriteExample {
    public static void main(String[] args) {
        try {
            // 写入文件
            String content = "Hello, NIO 2.0!";
            Files.write(Paths.get("example.txt"), content.getBytes());

            // 读取文件
            List<String> lines = Files.readAllLines(Paths.get("example.txt"));
            for (String line : lines) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

文件复制、移动和删除

import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;

public class NIO2FileOperationsExample {
    public static void main(String[] args) {
        try {
            // 复制文件
            Files.copy(Paths.get("example.txt"), Paths.get("example_copy.txt"));

            // 移动文件
            Files.move(Paths.get("example_copy.txt"), Paths.get("example_moved.txt"));

            // 删除文件
            Files.delete(Paths.get("example_moved.txt"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

总结

在本篇文章中,我们详细探讨了Java的I/O系统,包括传统的I/O(java.io包)和新I/O(java.nio包)。通过学习文件读写、使用Buffer和Channel、以及非阻塞I/O操作,你可以编写高效的文件操作和网络通信程序。掌握这些技术将使你能够应对各种I/O需求,提高程序的性能和可靠性。

在接下来的文章中,我们将继续深入探索Java的其他高级特性和实际应用,希望你能继续关注并享受学习的过程!

如果你有任何问题或需要进一步的解释,请在评论区留言。我们将尽快回复。感谢阅读!


网站公告

今日签到

点亮在社区的每一天
去签到