本文共 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/