Java笔记(数据流、File、对象流)

文章目录

  • 一、数据流
    • 1.概述
    • 2.使用
  • 二、File
    • 1.概述
    • 2.构造方法
    • 3.常用方法
    • 4.使用方式
    • 5.递归复制
  • 三、对象流
    • 1.概述
    • 2.注意
    • 3.序列化
    • 4.反序列化
    • 5.serialVersionUID
    • 6.Transient

一、数据流

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]

你可能感兴趣的:(java,笔记)