Java(8)文件与流
在本章节中,使用的工具都在io包中
1.文件
1.1什么是文件
在计算机中可以被我们操作的东西,统称为文件
1.2 对文件整体的操作
1.创建文件或文件夹
2.删除文件或文件夹
3.获得文件的详细信息--获取文件大小、名字、路径
import java.io.File;
import java.io.IOException;
import java.util.Date;
public class FileDemo {
public static void main(String[] args) throws IOException {
//构造器参数表示指向文件或文件夹的位置
File f = new File("d:/haha/gaga/eiei");
if (f.exists()==false) {
f.mkdir(); //不存在则创建文件夹
f.mkdirs(); //创建[多层]文件夹
f.createNewFile();//创建文件
}
System.out.println("文件的名字:"+f.getName());
System.out.println("文件的路径:"+f.getPath());
System.out.println("文件的大小:"+f.length()+"字节");
Date d = new Date(f.lastModified());
System.out.println("文件最后的修改时间:"+d);
System.out.println("该文件是否被隐藏:"+f.isHidden());
//删除文件
f.delete();
}
}
1.3 对文件内容的操作
1.字符流
2.字节流
1.4 可被序列化
通过流传递对象。对象可以使用管道进行传输,
序列化实例
Book类,如何将对象存放到文件,并可以进行还原,称为可序列化。
1.定义 Book
类
Book 类实现了 Serializable 接口,这使得 Book 类的实例可以被序列化。
Serializable 是一个标记接口,不包含任何方法,
只是用来指示 Java 序列化机制这个类的对象可以被序列化。
import java.io.Serializable;
//Serializable为序列化接口,一个类实现该接口,即可以通过管道进行传输
public class Book implements Serializable {
int id;
String name;
public void display() {
System.out.println("我是"+name+"书籍");
}
}
2.序列化和反序列化 Book
对象
序列化对象:
-
使用
FileOutputStream
打开一个文件输出流,文件路径为d:/win.dll
。 -
使用
ObjectOutputStream
包装FileOutputStream
,将Book
对象序列化并写入文件。 -
关闭
ObjectOutputStream
和FileOutputStream
,确保资源被释放。
反序列化对象:
-
使用
FileInputStream
打开同一个文件。 -
使用
ObjectInputStream
包装FileInputStream
,从文件中读取对象。 -
使用
while
循环不断读取对象,直到文件末尾。每次读取到一个对象时,将其强制转换为Book
类型,并调用display
方法打印书籍信息。 -
捕获
Exception
,当文件读取完毕时,打印 "对象读取完毕"。 -
在
finally
块中关闭FileInputStream
和ObjectInputStream
,确保资源被释放。
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
Book book1 = new Book();
book1.id = 1;
book1.name = "葵发宝典";
Book book2 = new Book();
book2.id = 2;
book2.name = "九阴真经";
//将书的对象输出到文件中
FileOutputStream fileOutputStream = new FileOutputStream("d:/win.dll");
//用于输出对象的高级流
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(book1);
objectOutputStream.writeObject(book2);
objectOutputStream.close();
fileOutputStream.close();
//读取文件中的对象
FileInputStream fileInputStream = new FileInputStream("d:/win.dll");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
try {
while(true) {
Book b = (Book) objectInputStream.readObject();
System.out.println(b.id);
b.display();
}
}catch (Exception e) {
System.out.println("对象读取完毕");
}finally {
fileInputStream.close();
objectInputStream.close();
}
}
}
1.5 File类
通过该类,可以对硬盘中的文件进行整体的操作,该类中提供了大量的用于操作文件方法。
2.流
2.1 什么是流
通过Java程序操作文件工具,称为流,以内存作为参照物,向目标进行数据的输入输出。
输出的称为输出流,输入称为输入流。
2.2 流的种类
1. 根据方向分析
输入流、输出流
2. 根据传递的数据类型分析
- 字符流:传输的是,以字符(2个字节)为最小单位,可以传输中文,使用字符流可以操作的是txt文件。(注意:无法操作二进制文件内容)
- 字节流:传输的是以字节(二进制)为最小单位,不能传输中文,可以读写二进制的内容。
2.3 继承关系
字符流工具的继承关系
输入流:Reader类(父)---对文件操作的分支---FileReader基础流(低级流)---BufferReader缓冲流(高级流)
输出流:Writer类---对文件操作的分支---FileWriter基础流(低级流)---PrintWriter缓冲流(高级流)
字节流工具的继承关系
输入流:InputStream类---对文件操作的分支---FileInputStream基础流(低级流)---DataInputStream缓冲流(高级流)
输出流:OutputStream类---对文件操作的分支---FileOutputStream基础流(低级流)---DataOutputStream缓冲流(高级流)
2.4 字符流测试
2.4.1 输出
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class 字符流测试_输出 {
public static void main(String[] args) throws IOException {
//输出流测试
//如果文件存在则建立管道,如文件不存在则创建文件后建立管道
//构造器参数含义:
//1.指向文件位置 2.是否覆盖,true不覆盖(追加),false覆盖
FileWriter fileWriter = new FileWriter("d://haha.txt", true);
//将基础流的引用名放到高级流的构造器中,则自动进行管理
PrintWriter printWriter = new PrintWriter(fileWriter);
printWriter.println("我还以为齐夏不在家呢");
printWriter.flush();//刷新管道,将管道中的数据推送到目标文件中
printWriter.close();//关闭管道,管道使用完必须关闭,同时也可以实现刷新效果
}
}
2.4.2 输入
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class 字符流测试_输入 {
public static void main(String[] args) throws IOException {
FileReader fileReader = new FileReader("d://haha.txt");
BufferedReader bufferedReader = new BufferedReader(fileReader);
//获取数据
//readLine()读取一行数据
String s = bufferedReader.readLine();
while (s != null) {
System.out.println(s);
s = bufferedReader.readLine();
//数据都被读取完毕,再读取时返回空
}
bufferedReader.close();
fileReader.close();
}
}
2.4.3 删除
import java.io.File;
public class 字符流测试_删除 {
public static void main(String[] args) {
//删除
File file = new File("d://haha.txt");
file.delete();
}
}
2.5 字节流测试
2.5.1 图片测试
import java.io.*;
public class 字节流测试1 {
public static void main(String[] args) throws Exception {
//输出流测试
//参数1:输出的目标地址
FileOutputStream fileOutputStream = new FileOutputStream("D:/workspace/images/bbb.jpg");
DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream);
//输入流
FileInputStream fileInputStream = new FileInputStream("D:/workspace/images/aaa.jpg");
DataInputStream dataInputStream = new DataInputStream(fileInputStream);
//用来存放一个数组用来存放源文件内容
//available()获取二进制值的位数
byte[] b = new byte[dataInputStream.available()];
//读取文件内容,通过流,把文件的二进制值添加到数组中
dataInputStream.readFully(b);
//把数组中的二进制值输出到目标端
dataOutputStream.write(b,0,b.length);
dataOutputStream.close();
fileInputStream.close();
fileOutputStream.close();
dataInputStream.close();
}
}
2.5.2 视频测试
import java.io.*;
public class 字节流测试2 {
public static void main(String[] args) throws Exception {
//输出流
FileOutputStream fileOutputStream = new FileOutputStream("D:/workspace/images/ccc.rmvb");
DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream);
//输入流
FileInputStream fileInputStream = new FileInputStream("D:/workspace/images/当幸福来敲门CD1.rmvb");
DataInputStream dataInputStream = new DataInputStream(fileInputStream);
//传输大文件
//控制每次传输二进制的流量
byte[] b = new byte[2048];
//读取数组相同个数二进制位,并返回读取的多个数据的值,返回的是整型数字,并不是Boolean
int i = dataInputStream.read(b);
while (i != -1) {
//向目标输出数据
//参数1:数组中的数据 2.数组中起始的位置 3.数组中结束的位置
dataOutputStream.write(b, 0, i);
i = dataInputStream.read(b);
}
dataOutputStream.close();
fileInputStream.close();
fileOutputStream.close();
dataInputStream.close();
}
}
3.网络编程
涉及到通过网络传输数据的技术称为网络编程,使用的工具来自于.net包
3.1 IP地址(v4/v6)
v4: 0~255.0~255.0~255.0~255
w x y z
- A类IP:w的取值范围在0~126,w代表网络,xyz代表本机
- B类IP:w的取值范围在128~191,wx代表网络,yz代表本机
- C类IP:w的取值范围在192~223之间,wxy代表网络,z代表本机
- D类IP:保留IP
查询本机IP地址:CMD --- ipconfig
3.2 端口
计算机中程序或软件,如果需要与网络中的其他计算机传输数据,必须开通端口号。
常用的端口号:80-浏览器默认端口号 8080-tomcat. 3306-Mysql 1521-Orcale
可以使用测试端口:4000~4999,保留端口号
查询本机端口: CMD --- netstat -a -n
3.3 协议
TCP协议:长链接
可以知道对方什么时候上线的,什么时候下线的,可以监控客户端的状态
Java中提供了TCP的套接字【转接头】
- ServerSocket,打开一个端口号,并且监控该端口
- Socket类,接收数据--发送数据
UDP协议:端链接
3.4 测试
接收客户端的连接并进行双向通信:
先设置服务器监听指定端口(4001),用于接受客户端的连接请求,
并编写在控制台中显示客户端发送的消息的功能。
同时,服务器可以从控制台读取输入,并将输入发送回客户端。
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
public static void main(String[] args) {
try {
//开启端口
ServerSocket serverSocket = new ServerSocket(4001);
//监控该端口
Socket socket = serverSocket.accept();
System.out.println("有客到");
while (true) {
//接收客户端发来的数据
InputStreamReader i = new InputStreamReader(socket.getInputStream());
BufferedReader br = new BufferedReader(i);
String value = br.readLine();
System.out.println("客户端道" + value);
//从控制台获得发给客户端的数据
InputStreamReader isys = new InputStreamReader(System.in);
BufferedReader bsys = new BufferedReader(isys);
String response = bsys.readLine();
//向客户端发送数据
PrintStream p = new PrintStream(socket.getOutputStream());
p.println(response);
}
}catch (Exception e) {
System.out.println("客户端退出");
}
}
}
连接到服务器并进行双向通信:
另一边客户端连接到指定的 IP 地址和端口,从控制台读取输入并发送给服务器,
同时接收服务器的响应并显示在控制台上。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class ClientDemo {
public static void main(String[] args) {
try {
//连接服务端
//参数1:IP地址 参数2:端口号
Socket s = new Socket("10.0.102.103",4001);
System.out.println("与服务器连接成功");
while(true){
//从控制台获得发给客户端的数据
InputStreamReader isys = new InputStreamReader(System.in);
BufferedReader bsys = new BufferedReader(isys);
String value = bsys.readLine();
//向客户端发送数据
PrintStream p = new PrintStream(s.getOutputStream());
p.println(value);
//接收客户端发来的数据
InputStreamReader i = new InputStreamReader(s.getInputStream());
BufferedReader b = new BufferedReader(i);
String response = b.readLine();
System.out.println("服务端道" + response);
}
}catch (Exception e){
System.out.println("服务端未开启");
}
}
}
3.5 特殊代码总结
1.开启端口:
ServerSocket serverSocket = new ServerSocket(4001);
2.监控端口:若有访问者,则将访问者的socket传递:
Socket socket = serverSocket.accept();
3.根据IP地址及端口访问服务端,如果连接成功则创建客户端的socket对象,该对象中包含了客户端的信息,如ip地址等:
Socket s = new Socket("10.0.102.103",4001);
4.获得socket的输出流,使socket对象具备输出功能:
s.getOutputStream()
5.获得socket的输入流,使socket对象具备输入功能:
s.getInputStream()
6.字节流:配合socket使用
InputStreamReader
7.字符流:可以获取到InputStreamReader传递过来的二进制的文本内容
BufferedReader
8.读取数据:
readLine()
9.向socket所记录的目标输出:
PrintStream()
原文地址:https://blog.csdn.net/Tttian622/article/details/145159751
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!