文章目录
一、数据流
1.概述
- 数据流 :为了方便操作 java 中的基本类型和字符串类型数据,可以使用数据流来进行操作
- 以二进制形式进行数据传递,并且读写顺序及类型必须一致,常用于网络数据传递
2.使用
写入
try (
FileOutputStream fos=new FileOutputStream("./src/test.txt");
DataOutputStream dos=new DataOutputStream(fos);
){
//写出数值类型
dos.writeByte(6);
dos.writeShort(66);
dos.writeInt(666);
dos.writeLong(6666);
dos.writeDouble(66.6);
//写出字符串
dos.writeUTF("嗨害嗨");
//清缓存
dos.flush();
} catch (Exception e) {
e.printStackTrace();
}
读取
try (
FileInputStream fis=new FileInputStream("./src/test.txt");
DataInputStream dis=new DataInputStream(fis);
){
// 读的时候必须和写的顺序以及类型一致,否则无法正确读取
System.out.println(dis.readByte());
System.out.println(dis.readShort());
System.out.println(dis.readInt());
System.out.println(dis.readLong());
System.out.println(dis.readDouble());
System.out.println(dis.readUTF());
} catch (Exception e) {
e.printStackTrace();
}
二、File
1.概述
- File类 提供了文件和目录相关的操作(增删改查)
- File对象需要传入文件路径,但是该路径是可以不存在的
2.构造方法
-
public File(String pathname)以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。
-
- 绝对路径:是一个固定的路径,从盘符开始
- 相对路径:是相对于某个位置开始
-
public File(String parent,String child)以parent为父路径,child为子路径创建File对象。
public File(File parent,String child)根据一个父File对象和子文件路径创建File对象
3.常用方法
*获取功能*:
//获取绝对路径
public String getAbsolutePath()
//获取路径
public String getPath()
//获取名称
public String getName()
//获取上层文件目录路径。若无,返回null
public String getParent()
//获取文件长度(即:字节数)。不能获取目录的长度。
public long length()
//获取最后一次的修改时间,毫秒值
public long lastModified()
//获取指定目录下的所有文件或者文件目录的名称数组
public String[] list()
//获取指定目录下的所有文件或者文件目录的File数组
public File[] listFiles()
*重命名功能*:
//把文件重命名为指定的文件路径
public boolean renameTo(File dest)
*判断功能*:
//判断是否是文件目录
public boolean isDirectory()
//判断是否是文件
public boolean isFile()
//判断是否存在
public boolean exists()
//判断是否可读
* public boolean canRead()
//判断是否可写
* public boolean canWrite()
//判断是否隐藏
* public boolean isHidden()
*创建删除功能*:
//创建文件。若文件存在,则不创建,返回false
public boolean createNewFile()
//创建文件目录。如果此文件目录存在,就不创建了。 如果此文件目录的上层目录不存在,也不创建。
public boolean mkdir()
//创建文件目录。如果上层文件目录不存在,一并创建
public boolean mkdirs()
*注意事项*:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目 路径下。
//删除文件或者文件夹
public boolean delete()
- 删除注意事项:
-
- Java中的删除不走回收站。
- 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录
4.使用方式
//创建文件对象
File file=new File("D:\\test\\test");
// 获取全路径
System.out.println(file.getAbsolutePath());
// 获取文件名/ 文件夹名
System.out.println(file.getName());
// 如果是Windows就是 \ 如果是Linux就是 /
System.out.println(File.separator);
// 获取父路径字符串
System.out.println(file.getParent());
// 获取父路径文件对象
File supFile=file.getParentFile();
System.out.println(supFile);
// 判断是否是文件
System.out.println(file.isFile());
// 判断是否是目录
System.out.println(file.isDirectory());
// lastModified()获取最后一次的修改时间,返回对应毫秒数
SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
String strTime=sdf.format(file.lastModified());
System.out.println(strTime);
File file2=new File("D:\\test\\test\\test.txt");
// 判断是否存在
System.out.println(file2.exists());
// 创建对应文件,但是不会创建文件夹
// 如果该文件已存在,就不再创建,返回false,否则就创建该文件,并返回true
System.out.println(file2.createNewFile());
// 删除,删除成功返回true
System.out.println(file2.delete());
// 执行结束后,JVM要退出时再删除
//file2.deleteOnExit();
file=new File("D:\\test\\a\\b\\c\\test.txt");
File file4=new File("D:\\test\\a\\b\\d\\test.txt");
supFile=file.getParentFile();
File supFile2=file4.getParentFile();
if (!supFile.exists()) {
// 创建文件夹路径,只能创建c,如果ab不存在,会报错
// supFile.mkdir();
// 递归创建所有文件夹abc
supFile.mkdirs();
}
if (!supFile2.exists()) {
supFile2.mkdirs();
}
file.createNewFile();
file=new File("E:\\eclipse\\tlfile\\Test02");
// 获取所有子文件对象
File[] files=file.listFiles();
for (File file3 : files) {
System.out.println(file3.getAbsolutePath());
}
5.递归复制
public class IO_04_Copy {
public static void main(String[] args) {
File newFile=new File("E:\\test");//要复制的源文件
Print(newFile);
System.out.println("复制完成!");
}
// 递归操作
public static void Print(File file){
if(file.isFile()){
// 如果是文件就递归创建文件夹
String filePath=file.getAbsolutePath();//获取该文件绝对路径
String filePath2='D'+filePath.substring(1);//新路径
File newFlieFile=new File(filePath2);//创建新路径对象
File supFile=newFlieFile.getParentFile();//获取上层文件目录
if (!supFile.exists()) {//如果目录不存在
supFile.mkdirs();//递归创建目录
}
try (
FileInputStream fis=new FileInputStream(filePath);//输入流
BufferedInputStream bis=new BufferedInputStream(fis);//输入流缓存
FileOutputStream fos =new FileOutputStream(filePath2);//输出流
BufferedOutputStream bos =new BufferedOutputStream(fos); //输出流缓存
){
byte[] bytes=new byte[102400];
int temp=0;//temp存储读到的字节数
while ((temp=bis.read(bytes))!=-1) {
bos.write(bytes,0,temp);
}
bos.flush();//清缓存
} catch (Exception e) {
e.printStackTrace();
}
}else{
//是文件夹就遍历所有子文件,进行递归调用
File[] files=file.listFiles();
for (File file2 : files) {
Print(file2);
}
}
}
}
三、对象流
1.概述
- 创建对象:1. new ,2. 反射机制,3. clone(已被淘汰),4. 反序列化
- 序列化:把堆内存对象进行持久化 并保存在硬盘中,就是将数据持久化,写出到文件中
- 反序列化:把硬盘中的对象载入内存
2.注意
//错误:
java.io.NotSerializableException: Day21.User
//要序列话的类必须实现Serializable接口
public class User implements Serializable
3.序列化
个人理解:就是将数据持久化
public static void main(String[] args) {
User user=new User("张三", 66);
try (
FileOutputStream fos=new FileOutputStream("./src/Day21/temp");
ObjectOutputStream oos=new ObjectOutputStream(fos);
){
oos.writeObject(user);
oos.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
4.反序列化
个人理解:就是将持久化的数据取出来
public static void main(String[] args) {
try (
FileInputStream fis =new FileInputStream("./src/Day21/temp");
ObjectInputStream ois =new ObjectInputStream(fis);
){
User user=(User) ois.readObject();
System.out.println(user);
user.m1();
user.m2();
} catch (Exception e) {
e.printStackTrace();
}
}
5.serialVersionUID
- 作用: serialVersionUID 差不多相当于class的版本控制
- 每次修改class的时候,UID都会自动修改,所以一般都会手动设置一个固定的值
private static final long serialVersionUID = 1L;
注意:
java.io.InvalidClassException: Day21.User; local class incompatible: stream classdesc serialVersionUID = 5918693715788954166, local class serialVersionUID = 64646
如果不手动设置 UID ,系统随机生成的可能会与流中的UID不同,所以需要手动设置一个UID
6.Transient
- 作用: transient 修饰符 可以让修饰的属性不能再被序列化,不再序列化( 持久化 )对应的值
- 可以用 transient 修饰不想被序列化的属性,反序列化后读取到的属性值就是默认值了
transient int age;//User [name=张三, age=0]