博客
关于我
java.io与网络通信
阅读量:396 次
发布时间:2019-03-05

本文共 6378 字,大约阅读时间需要 21 分钟。

Java IO 与网络通信

Java中的IO操作是开发中非常重要的内容之一, 让我们从文件操作开始, 再聊聊字符流、字节流以及网络通信。

文件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包中. 文本文件的读写通常使用FileReaderFileWriter:

读取文件:

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[]. 常见的字节流类包括FileInputStreamFileOutputStream:

读取文件:

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

网络IO涉及TCPUDP协议.

TCP客户端

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服务器

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客户端

UDP客户端使用DatagramSocketDatagramPacket:

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服务器

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/

你可能感兴趣的文章
multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
查看>>
mysql csv import meets charset
查看>>
multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
查看>>
MySQL DBA 数据库优化策略
查看>>
multi_index_container
查看>>
MySQL DBA 进阶知识详解
查看>>
Mura CMS processAsyncObject SQL注入漏洞复现(CVE-2024-32640)
查看>>
Mysql DBA 高级运维学习之路-DQL语句之select知识讲解
查看>>
mysql deadlock found when trying to get lock暴力解决
查看>>
MuseTalk如何生成高质量视频(使用技巧)
查看>>
mutiplemap 总结
查看>>
MySQL DELETE 表别名问题
查看>>
MySQL Error Handling in Stored Procedures---转载
查看>>
MVC 区域功能
查看>>
MySQL FEDERATED 提示
查看>>
mysql generic安装_MySQL 5.6 Generic Binary安装与配置_MySQL
查看>>
Mysql group by
查看>>
MySQL I 有福啦,窗口函数大大提高了取数的效率!
查看>>
mysql id自动增长 初始值 Mysql重置auto_increment初始值
查看>>
MySQL in 太多过慢的 3 种解决方案
查看>>