文件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中获得InputStreamOutputStream对象就可以与服务器通过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与网络通信相关推荐

  1. java 实现网络通信_利用Java怎么样实现网络通信功能

    利用Java怎么样实现网络通信功能 发布时间:2020-11-20 15:19:04 来源:亿速云 阅读:72 作者:Leah 利用Java怎么样实现网络通信功能?相信很多没有经验的人对此束手无策,为 ...

  2. java.io.file.sync_Java(25)IO流和File类

    IO流+File类 File类 讲IO流之前先来讲以下File类.Java的标准库Java.io提供了File类来操作文件和目录.操作可以有:新建.删除.重命名等,但是不能访问文件本身的内容,如果想要 ...

  3. java IO编程详解

    java IO编程详解 一.Socket 1. Sock概述 Socket,套接字就是两台主机之间逻辑连接的端点.TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP协议是应用层协议 ...

  4. 【Java IO模式】Java BIO NIO AIO总结

    一同步与异步阻塞与非阻塞 1同步与异步 2阻塞与非阻塞 3IO模式 二BIO 概念描述 特点 代码实现 三NIO 概念描述 特点 代码描述 四AIO 一.同步与异步.阻塞与非阻塞 1.同步与异步 同步 ...

  5. java IO、NIO、AIO详解

    概述 在我们学习Java的IO流之前,我们都要了解几个关键词 同步与异步(synchronous/asynchronous):同步是一种可靠的有序运行机制,当我们进行同步操作时,后续的任务是等待当前调 ...

  6. java.lang、java.io、java.net、java.util解释整理

    为应对近期单位认证:整理点Java知识 首先整理Java常见的类库: 1.Java.lang 这个 算是我们开发经常用到的基础类了,包含的类有object超类,8种类型的包装类,字符串类,线程类,异常 ...

  7. Java IO从入门到精通

    一.概览 二.磁盘操作 三.字节操作 实现文件复制 装饰者模式 四.字符操作 编码与解码 String 的编码方式 Reader 与 Writer 实现逐行输出文本文件的内容 五.对象操作 序列化 S ...

  8. Java IO(面试题)

    目录 1. IO 里面的常见类,字节流.字符流.接口.实现类.方法阻塞? 2.谈谈对 NIO 的认知? 3.字节流和字符流的区别? 4.NIO 和传统的 IO 有什么区别? 5.BIO 和 NIO 和 ...

  9. Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO

    Java基础知识第二讲(Java编程规范/JVM/集合框架/异常体系/Java反射/语法知识/Java IO/码出高效) 分享在java学习及工作中,常使用的一些基础知识,本文从JVM出发,讲解了JV ...

最新文章

  1. android中webview loadUrl(String url,Map header)方法和postUrl(String url,byte[] postData)方法同时使用问题;...
  2. java ee api_Java EE并发API教程
  3. linux构建主从域名服务器
  4. GitHub 热点速览 | 极客们都在玩这些 Terminal!
  5. 优秀程序员是怎样提高敲代码的效率?有这些工具就够了!
  6. UML设计(团队作业)
  7. 什么叫pmt测试分析_圆偏振发光光谱仪——南方科技大学分析测试中心设备介绍第51期...
  8. Chrome OS 开发者版现可备份和恢复 Linux 容器
  9. 智能服务器软件,无纸化智能会议系统服务器软件
  10. 闭关的日子 好无聊。偷了半日闲去书店shopping一下
  11. 基于等级保护梳理服务器安全合规基线
  12. hive sql报错:SQL 错误 [10004] [42000]: Error while compiling statement: FAILED: SemanticException [Error
  13. linux的tar命令之-N参数详解
  14. pdf合并成一个pdf工具,可以合并pdf的软件哪个好?
  15. CEO卡莉被驱逐,惠普何去何从?
  16. 18 linux mint 驱动_Linux Mint 18 迅捷FW150US无线网卡(RTL8188EUS芯片)驱动安装
  17. 杭州前端阿里线下聚会(下)
  18. 银行转账java代码事务实现_转账操作代码实现----事务
  19. 换手机了备忘录怎么转移?
  20. 学习游戏建模的话,还不清楚电脑配置需要什么样的吗?「部分」

热门文章

  1. Hinton最新访谈:GPT-3和人脑比参数量仍少1000倍
  2. ACL 2020 亮点摘要
  3. 「杂谈」为什么你学了AI,企业却不要你
  4. 网易在AI上更注重于落地应用
  5. “新一代人工智能”研究的三大重点方向
  6. 全图表征学习算法之无监督学习和基于卷积神经网络的监督学习
  7. Tensorflow—交叉熵
  8. 在CSDN中如何转载别人的博客
  9. 中科院计算所关于“木兰”语言问题处理情况说明
  10. 城市大脑与智慧城市前沿趋势 主题论坛 |未来科技大讲堂 第12期