本文共 6378 字,大约阅读时间需要 21 分钟。
Java中的IO操作是开发中非常重要的内容之一, 让我们从文件操作开始, 再聊聊字符流、字节流以及网络通信。
文件IO是操作文件和目录的核心功能, Java提供了java.io.File
类来实现这一点. 文件类可以操作文件和目录, 以下是常用的方法:
isFile()
: 判断是否是文件createNewFile()
: 创建空文件exists()
: 判断文件是否存在delete()
: 删除文件或目录length()
: 获取文件长度isDirectory()
: 判断是否是目录mkdir()
: 创建目录,父目录必须存在mkdirs()
: 创建目录,自动创建父目录list()
: 获取目录中的文件名(字符串数组)listFiles()
: 获取目录中的文件(File数组)例如, 创建并检查一个文件:
File file = new File("hello.txt");if (!file.exists()) { file.createNewFile();}
字符流用于读写文本文件, 所有字符流都在java.io
包中. 文本文件的读写通常使用FileReader
和FileWriter
:
读取文件:
File file = new File("a.txt");FileReader reader = new FileReader(file);BufferedReader br = new BufferedReader(reader);try { String str = br.readLine(); System.out.println(str);} catch (IOException e) { e.printStackTrace();} finally { reader.close(); br.close();}
写入文件时, 第二个参数append
控制是否追加:
FileWriter writer = new FileWriter("a.txt", true);BufferedWriter bw = new BufferedWriter(writer);try { String str = "Hello World"; bw.write(str);} catch (IOException e) { e.printStackTrace();} finally { writer.close(); bw.close();}
字节流用于读写二进制文件, 类型为byte[]
. 常见的字节流类包括FileInputStream
和FileOutputStream
:
读取文件:
File file = new File("a.in");FileInputStream fin = new FileInputStream(file);byte[] buf = new byte[512];try { fin.read(buf);} catch (IOException e) { e.printStackTrace();} finally { fin.close();}
写入文件:
File file = new File("a.in");FileOutputStream fout = new FileOutputStream(file);byte[] buf = new byte[512];try { // 写入数据} catch (IOException e) { e.printStackTrace();} finally { fout.close();}
标准输入输出通过java.lang.System
对象进行管理:
System.out
: 标准输出System.err
: 标准错误输出System.in
: 标准输入重定向输出到文件:
File file = new File("a.out");FileOutputStream fout = new FileOutputStream(file);PrintStream pout = new PrintStream(fout);System.setOut(System.out); // 恢复标准输出System.setOut(pout); // 重定向到文件// 写入数据System.out.println("Hello World");pout.close();
读取输入时, 需要将字节转换为字符串:
int n;byte[] buf = new byte[1024];n = System.in.read(buf);String s = new String(buf, 0, n);System.out.println(s);
使用Scanner
简化读取:
Scanner scanner = new Scanner(System.in);while (scanner.hasNext()) { String input = scanner.nextLine(); System.out.println("您输入了: " + input);}
网络IO涉及TCP
和UDP
协议.
TCP客户端使用Socket
类:
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.Socket;public class TcpClient { public static void main(String[] args) throws IOException { Socket client = new Socket("127.0.0.1", 5000); client.setSoTimeout(10000); // 设置超时 BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream())); String[] msgs = {"你好", "世界"}; for (String msg : msgs) { System.out.println("发送消息: " + msg); buf.readline(); } }}
TCP服务器使用ServerSocket
:
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket;public class TcpServer implements Runnable { private Socket client = null; public TcpServer(Socket client) { this.client = client; } @Override public void run() { try { BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream())); while (true) { String str = buf.readline(); if (str != null) { System.out.println("接收到消息: " + str); } } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) throws IOException { ServerSocket socket = new ServerSocket(5000); while (true) { Socket client = socket.accept(); Thread thread = new Thread(new TcpServer(client)); thread.start(); } }}
UDP客户端使用DatagramSocket
和DatagramPacket
:
import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class UdpClient { public static void main(String[] args) throws IOException { DatagramSocket socket = new DatagramSocket(); String[] msgs = {"1", "2.3", "520"}; for (String msg : msgs) { byte[] buf = msg.getBytes(); InetAddress addr = InetAddress.getByName("127.0.0.1"); DatagramPacket packet = new DatagramPacket(buf, buf.length, addr, 5000); socket.send(packet); while (true) { byte[] recvBuf = new byte[256]; DatagramPacket recvPacket = new DatagramPacket(recvBuf, recvBuf.length); socket.receive(recvPacket); String echo = new String(recvPacket.getData(), 0, recvPacket.getLength()); if (echo != null) { System.out.println(echo); break; } } } }}
UDP服务器也是使用DatagramSocket
:
import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class UdpServer implements Runnable { private DatagramSocket socket = null; private DatagramPacket packet = null; public UdpServer(DatagramSocket socket, DatagramPacket packet) { this.socket = socket; this.packet = packet; } @Override public void run() { try { String msg = new String(packet.getData()); // 处理逻辑 byte[] response = msg.getBytes(); int port = packet.getPort(); InetAddress address = packet.getAddress(); System.out.println("接收到消息: " + msg); DatagramPacket sendPacket = new DatagramPacket(response, response.length, address, port); socket.send(sendPacket); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { try { DatagramSocket socket = new DatagramSocket(5000); while (true) { byte[] buf = new byte[100]; DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); Thread thread = new Thread(new UdpServer(socket, packet)); thread.start(); } } catch (IOException e) { e.printStackTrace(); } }}
通过以上内容, 我们可以看到文件IO、字符流、字节流以及网络通信的实现方式, 适用于不同场景的IO操作.
转载地址:http://xmqzz.baihongyu.com/