Java IO一些理解和demo
来源:互联网 发布:上海汇纳网络信息科技 编辑:程序博客网 时间:2024/05/15 11:28
IO常见可以分为磁盘和网络读写,因此在这就讲讲file和socket,仅作为自己复习总结
File
1.数据在磁盘的唯一最小描述就是文件,也就是说上层应用程序只能通过文件来操作磁盘上的数据,文件也是操作系统和磁盘驱动器交互的一个最小单元。
2.值得注意的是 Java 中通常的 File 并不代表一个真实存在的文件对象,当你通过指定一个路径描述符时,它就会返回一个代表这个路径相关联的一个虚拟对象,这个可能是一个真实存在的文件或者是一个包含多个文件的目录。
3.设计的原因:因为大部分情况下,我们并不关心这个文件是否真的存在,而是关心这个文件到底如何操作。例如我们手机里通常存了几百个朋友的电话号码,但是我们通常关心的是我有没有这个朋友的电话号码,或者这个电话号码是什么,但是这个电话号码到底能不能打通,我们并不是时时刻刻都去检查,而只有在真正要给他打电话时才会看这个电话能不能用。也就是使用这个电话记录要比打这个电话的次数多很多。
4.何时真正会要检查一个文件存不存?就是在真正要读取这个文件时,例如 FileInputStream 类都是操作一个文件的接口,注意到在创建一个 FileInputStream 对象时,会创建一个 FileDescriptor 对象,其实这个对象就是真正代表一个存在的文件对象的描述,当我们在操作一个文件对象时可以通过 getFD() 方法获取真正操作的与底层操作系统关联的文件描述。例如可以调用 FileDescriptor.sync() 方法将操作系统缓存中的数据强制刷新到物理磁盘中。
Socket
1.Socket 这个概念没有对应到一个具体的实体,它是描述计算机之间完成相互通信一种抽象功能。打个比方,可以把 Socket 比作为两个城市之间的交通工具,有了它,就可以在城市之间来回穿梭了。
2.交通工具有多种,每种交通工具也有相应的交通规则。Socket 也一样,也有多种。大部分情况下我们使用的都是基于 TCP/IP 的流套接字,它是一种稳定的通信协议。
3.Java为TCP协议提供了两个类:Socket类和ServerSocket类。一个Socket实例代表了TCP连接的一个客户端,而一个ServerSocket实例代表了TCP连接的一个服务器端。
3.每个 Socket 实例都有一个 InputStream 和 OutputStream,正是通过这两个对象来交换数据。
阻塞IO:不管是磁盘 I/O 还是网络 I/O,数据在写入 OutputStream 或者从 InputStream 读取时都有可能会阻塞,一旦有线程阻塞将会失去 CPU 的使用权。
例子:
1.文件读写
/**简单一个demo**/
public class NormalIO {
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("fan.txt");//fos在有fan.txt,则不创建。否则会创建
fos.write("你好".getBytes());
fos.close();
FileInputStream fis = new FileInputStream("huang.txt");//事先建好huang.txt
byte[] bytes = new byte[100];
while (fis.read(bytes) != -1) {
System.out.println(new String(bytes));
}
fis.close();
}
}
FileOutputStream fos = new FileOutputStream("fan.txt");//fos在有fan.txt,则不创建。否则会创建
fos.write("你好".getBytes());
fos.close();
FileInputStream fis = new FileInputStream("huang.txt");//事先建好huang.txt
byte[] bytes = new byte[100];
while (fis.read(bytes) != -1) {
System.out.println(new String(bytes));
}
fis.close();
}
}
2.socket
/**客户端发送请求**/
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 8096);
socket.setSoTimeout(10000);//read的超时时间
BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); //获取键盘输入
//获取Socket的输出流和输入流---发送数据到服务端,接收从服务端发送过来的数据
PrintStream out = new PrintStream(socket.getOutputStream());
BufferedReader buf = new BufferedReader(new InputStreamReader(socket.getInputStream()));
boolean flag = true;
while (flag) {
System.out.print("输入信息:");
String str = input.readLine();
out.println(str); //发送数据到服务端
if ("bye".equals(str)) {
flag = false;
} else {
try {
String echo = buf.readLine();
System.out.println(echo);
} catch (SocketTimeoutException e) {
System.out.println("Time out, No response");
}
}
}
input.close();
if (socket != null) {
//如果构造函数建立起了连接,则关闭套接字,如果没有建立起连接,自然不用关闭
socket.close(); //只关闭socket,其关联的输入输出流也会被关闭
}
}
}
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 8096);
socket.setSoTimeout(10000);//read的超时时间
BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); //获取键盘输入
//获取Socket的输出流和输入流---发送数据到服务端,接收从服务端发送过来的数据
PrintStream out = new PrintStream(socket.getOutputStream());
BufferedReader buf = new BufferedReader(new InputStreamReader(socket.getInputStream()));
boolean flag = true;
while (flag) {
System.out.print("输入信息:");
String str = input.readLine();
out.println(str); //发送数据到服务端
if ("bye".equals(str)) {
flag = false;
} else {
try {
String echo = buf.readLine();
System.out.println(echo);
} catch (SocketTimeoutException e) {
System.out.println("Time out, No response");
}
}
}
input.close();
if (socket != null) {
//如果构造函数建立起了连接,则关闭套接字,如果没有建立起连接,自然不用关闭
socket.close(); //只关闭socket,其关联的输入输出流也会被关闭
}
}
}
/**服务端处理请求线程**/
public class ServerThread implements Runnable {
private Socket client = null;
public ServerThread(Socket client) {
this.client = client;
}
@Override
public void run() {
try {
//获取Socket的输出流,用来向客户端发送数据
PrintStream out = new PrintStream(client.getOutputStream());
//获取Socket的输入流,用来接收从客户端发送过来的数据
BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
boolean flag = true;
while (flag) {
//接收从客户端发送过来的数据
String str = buf.readLine();
if (str == null || "".equals(str)) {
flag = false;
} else {
if ("bye".equals(str)) {
flag = false;
} else {
//将接收到的字符串前面加上echo,发送到对应的客户端
out.println("输出信息:" + str);
}
}
}
out.close();
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
private Socket client = null;
public ServerThread(Socket client) {
this.client = client;
}
@Override
public void run() {
try {
//获取Socket的输出流,用来向客户端发送数据
PrintStream out = new PrintStream(client.getOutputStream());
//获取Socket的输入流,用来接收从客户端发送过来的数据
BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
boolean flag = true;
while (flag) {
//接收从客户端发送过来的数据
String str = buf.readLine();
if (str == null || "".equals(str)) {
flag = false;
} else {
if ("bye".equals(str)) {
flag = false;
} else {
//将接收到的字符串前面加上echo,发送到对应的客户端
out.println("输出信息:" + str);
}
}
}
out.close();
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**测试程序**/
public class TestSocket {
public static void main(String[] args) throws Exception {
//服务端在8096端口监听客户端请求的TCP连接
ServerSocket server = new ServerSocket(8096);
Socket client = null;
boolean f = true;
while (f) {
client = server.accept();
System.out.println("与客户端连接成功!");
new Thread(new ServerThread(client)).start();
}
server.close();
}
}
public static void main(String[] args) throws Exception {
//服务端在8096端口监听客户端请求的TCP连接
ServerSocket server = new ServerSocket(8096);
Socket client = null;
boolean f = true;
while (f) {
client = server.accept();
System.out.println("与客户端连接成功!");
new Thread(new ServerThread(client)).start();
}
server.close();
}
}
0 0
- Java IO一些理解和demo
- Java的IO流的操作和一些理解
- 关于JAVA语言IO流的一些理解
- 黑马程序员-关于Java IO流的一些理解
- java io 详解与DEMO
- IO流的一些小Demo
- 异步IO的一些理解
- 【Java学习】Java IO-File类的理解和总结
- 【Java学习】Java IO-流概念理解和知识点总结
- java io的理解
- Java中IO理解
- java io理解
- 理解Java中的IO
- Java IO深入理解
- 理解Java中的IO
- Java IO的理解
- Java IO 深入理解
- java io 一些总结
- Linux git版本管理的使用/git教程
- linux 离线源制作(基本适用所有离线包安装)
- ModBus/TCP协议分析
- 用原生javascript封装ajax技术
- 浅析JavaScript数组逆序
- Java IO一些理解和demo
- sql statement:批量插入
- 深入探索透视投影变换
- ios开发-- URL Schemes 使用详解
- vs2010添加lib库的方法
- 教你在APP中嵌入翻译功能,不借助第三方软件
- SlidingPaneLayout的基本使用
- BlockCanary — 轻松找出Android App界面卡顿元凶
- 游戏设计之我见 —— 关卡设计中的固有印象