java.io与网络通信
文件IO
java.io.File
是用于操作文件或目录的类:
File file = new File("hello.txt");
实例化File时不关心路径的目标并不会去读取文件或目录. File类提供了一些有用的方法:
isFile()
: 判断路径指向的是否为文件createNewFile()
: 当路径指向的文件不存在时创建一个空文件exists()
: 判断路径指向的文件是否存在delete()
: 删除路径指向的文件或目录length()
: 返回文件的长度isDirectory()
: 判断路径指向的是否为目录mkdir()
: 根据路径创建空目录, 父目录必须存在mkdirs()
: 根据路径创建空目录, 会创建必要的父目录list()
: 以String[]
类型返回目录中所有文件名listFiles()
: 以File[]
类型返回目录中所有文件
字符流
Java使用流来读写文件, 字符流用来读写文本文件. 所有的字符流类都在java.io
包中.
读取文本文件:
File file = new File("a.txt");
FileReader fin = new FileReader(file);
BufferedReader reader = new BufferedReader(fin);
try {String str = reader.readLine();System.out.println(str);
}
catch (IOException e) {e.printStackTrace();
}
finally {reader.close();fin.close();
}
FileReader也可以直接用文件名创建. new FileReader("a.txt")
.
写入文本文件:
FileWriter fout = new FileWriter("a.txt", true);
BufferedWriter writer = new BufferedWriter(fout);
try {String str = "Hello World";writer.write(str);
}
catch (IOException e) {e.printStackTrace();
}
finally {writer.close();fout.close();
}
FileWriter的第二个参数为append, true代表在文件尾追加, 默认false代表清空文件重写.
字节流
字节流用于读写二进制文件, 其读写的数据以byte[]
类型存储.
所有字节流类都在java.io
包中.
读取文件:
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 {// write sth in buf fin.write(buf);
}
catch {IOException e} {e.printStackTrace();
}
finally {fout.close();
}
标准输入输出
java.lang.System
对象中维护了3个标准流, 用于终端输入输出:
System.out
, 标准输出流,PrintStream
对象System.err
: 标准错误流,PrintStream
对象System.in
: 标准输入流,FileInputStream
对象
在需要的时候我们可以将它们重定向到文件.
重定向标准输出:
File file = new File("a.out");
FileOutputStream fout = new FileOutputStream(file);
PrintStream pout = new PrintStream(fout);
PrintStream stdout = System.out; // saveSystem.setOut(pout);
System.setOut(stdout); // recover
因为标准输入是字节流, 我们需要把它们转换成需要的类型才能使用:
int n;
byte[] buf = new byte[1024];
n = System.in.read(buf);
String s = new String(buf, 0, n);
System.out.println(s);
java.util.Scanner
允许用迭代器的方式读取输入:
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {// scanner.next(); // return Objectscanner.nextInt(); // return int
}
scanner可以直接将输入转换为内置类型使用很方便.
网络IO
TCP客户端
java.net.Socket
是一个用作Tcp客户端的Socket. 从Socket中获得InputStream
和OutputStream
对象就可以与服务器通过Tcp连接通信了.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
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);PrintStream out = new PrintStream(client.getOutputStream());BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream()));String[] msgs = {"你好", "世界"};for (String msg : msgs) {out.println(msg);while (true) {String echo = buf.readLine();if (echo != null) {System.out.println(echo);break;}}}}
}
上述示例中发送完一条消息则进入轮询, 查看是否有服务端消息.
java.net.ServerSocket
则是一个用作Tcp服务端的socket.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;public class TcpServer implements Runnable {private Socket client = null;private String address;public TcpServer(Socket client) {this.client = client;}@Overridepublic void run() {try {String host = client.getInetAddress().toString();String port = Integer.toString(client.getPort());PrintStream out = new PrintStream(client.getOutputStream());System.out.println("Get Connection");BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream()));address = host + ":" + port;System.out.println("get connection from" + address);while (true) {String str = buf.readLine();if (str != null) {out.println(str);}}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {ArrayList<Thread> list = new ArrayList<Thread>();try {ServerSocket socket = new ServerSocket(5000);while (true) {// accept a new connectionSocket client = socket.accept();Thread thread = new Thread(new TcpServer(client));list.add(thread);thread.start();}}catch (IOException ioe) {ioe.printStackTrace();}}}
上述示例是一个多线程服务器, ServerSocket
监听5000端口. 当有客户端连接该端口时, socket.accept()
将返回一个java.net.Socket
对象.
创建一个线程持有Socket对象, 并与客户端进行通信.
UDP客户端
java.net.Datagram
可以用作UDP客户端, 其接收到的数据报被封装为java.net.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;}}}}}
DatagramSocket
的send方法用于发送数据报, receive
用于接收数据报.
UDP服务器
import java.io.IOException;
import java.net.DatagramSocket;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicInteger;public class UdpServer implements Runnable {private DatagramSocket socket = null;private DatagramPacket packet = null;private String address;public UdpServer(DatagramSocket socket, DatagramPacket packet) {this.socket = socket;this.packet = packet;}@Overridepublic void run() {try {String msg = new String(packet.getData());UdpServer.sum += Double.parseDouble(msg);UdpServer.count += 1;int port = packet.getPort();InetAddress address = packet.getAddress();System.out.println("get msg from" + address);String response = new String(recvPacket.getData(), 0, recvPacket.getLength());DatagramPacket sendPacket = new DatagramPacket(response.getBytes(), response.getBytes().length, address, port);socket.send(sendPacket);}catch (IOException ioe) {ioe.printStackTrace();}}public static void main(String[] args) {AtomicInteger numThreads = new AtomicInteger(0);ArrayList<Thread> list = new ArrayList<Thread>();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));list.add(thread);thread.start();numThreads.incrementAndGet();}}catch (IOException ioe) {ioe.printStackTrace();}}}
因为UDP不需要维护连接, 服务端和客户端的socket是同样的.
上文是一个多线程UDP服务器, 不过所有线程持有同一个socket对象和要处理的数据报. 为了保证线程安全最好给socket加锁.
java.io与网络通信相关推荐
- java 实现网络通信_利用Java怎么样实现网络通信功能
利用Java怎么样实现网络通信功能 发布时间:2020-11-20 15:19:04 来源:亿速云 阅读:72 作者:Leah 利用Java怎么样实现网络通信功能?相信很多没有经验的人对此束手无策,为 ...
- java.io.file.sync_Java(25)IO流和File类
IO流+File类 File类 讲IO流之前先来讲以下File类.Java的标准库Java.io提供了File类来操作文件和目录.操作可以有:新建.删除.重命名等,但是不能访问文件本身的内容,如果想要 ...
- java IO编程详解
java IO编程详解 一.Socket 1. Sock概述 Socket,套接字就是两台主机之间逻辑连接的端点.TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP协议是应用层协议 ...
- 【Java IO模式】Java BIO NIO AIO总结
一同步与异步阻塞与非阻塞 1同步与异步 2阻塞与非阻塞 3IO模式 二BIO 概念描述 特点 代码实现 三NIO 概念描述 特点 代码描述 四AIO 一.同步与异步.阻塞与非阻塞 1.同步与异步 同步 ...
- java IO、NIO、AIO详解
概述 在我们学习Java的IO流之前,我们都要了解几个关键词 同步与异步(synchronous/asynchronous):同步是一种可靠的有序运行机制,当我们进行同步操作时,后续的任务是等待当前调 ...
- java.lang、java.io、java.net、java.util解释整理
为应对近期单位认证:整理点Java知识 首先整理Java常见的类库: 1.Java.lang 这个 算是我们开发经常用到的基础类了,包含的类有object超类,8种类型的包装类,字符串类,线程类,异常 ...
- Java IO从入门到精通
一.概览 二.磁盘操作 三.字节操作 实现文件复制 装饰者模式 四.字符操作 编码与解码 String 的编码方式 Reader 与 Writer 实现逐行输出文本文件的内容 五.对象操作 序列化 S ...
- Java IO(面试题)
目录 1. IO 里面的常见类,字节流.字符流.接口.实现类.方法阻塞? 2.谈谈对 NIO 的认知? 3.字节流和字符流的区别? 4.NIO 和传统的 IO 有什么区别? 5.BIO 和 NIO 和 ...
- Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO
Java基础知识第二讲(Java编程规范/JVM/集合框架/异常体系/Java反射/语法知识/Java IO/码出高效) 分享在java学习及工作中,常使用的一些基础知识,本文从JVM出发,讲解了JV ...
最新文章
- android中webview loadUrl(String url,Map header)方法和postUrl(String url,byte[] postData)方法同时使用问题;...
- java ee api_Java EE并发API教程
- linux构建主从域名服务器
- GitHub 热点速览 | 极客们都在玩这些 Terminal!
- 优秀程序员是怎样提高敲代码的效率?有这些工具就够了!
- UML设计(团队作业)
- 什么叫pmt测试分析_圆偏振发光光谱仪——南方科技大学分析测试中心设备介绍第51期...
- Chrome OS 开发者版现可备份和恢复 Linux 容器
- 智能服务器软件,无纸化智能会议系统服务器软件
- 闭关的日子 好无聊。偷了半日闲去书店shopping一下
- 基于等级保护梳理服务器安全合规基线
- hive sql报错:SQL 错误 [10004] [42000]: Error while compiling statement: FAILED: SemanticException [Error
- linux的tar命令之-N参数详解
- pdf合并成一个pdf工具,可以合并pdf的软件哪个好?
- CEO卡莉被驱逐,惠普何去何从?
- 18 linux mint 驱动_Linux Mint 18 迅捷FW150US无线网卡(RTL8188EUS芯片)驱动安装
- 杭州前端阿里线下聚会(下)
- 银行转账java代码事务实现_转账操作代码实现----事务
- 换手机了备忘录怎么转移?
- 学习游戏建模的话,还不清楚电脑配置需要什么样的吗?「部分」