io流知识点

File

构造方法

1、new File(目录地址)
2、new File(父路径,文件名)
3、new File(File file,文件名)

一等优先级方法

方法名 描述
exists() 判断改文件或者文件夹是否存在
isFile() 判断是否是一个文件,判断是否是文件夹可取非:!file.isFile()
isDirectory() 判断是否是一个文件夹,判断是否是文件取非!file.isDirectory()
length() 文件:得到文件的字节个数 目录:得到目录硬盘空间占用
getName() 得到文件\文件夹的名字
getParents() 获取该文件夹的父目录名字,通常是在File文件传入的字符串地址中找,如果传入的是相对路径,获取的是空
getAbsolute() 得到文件\文件夹的绝对路径
lastModified() 得到文件的最后一次修改时间
delete() 删除文件:删除的文件不经过回收站。如果删除的是目录,保证目录是空的
renamTo(File) 重命名文件\文件夹 ,a.renameTo(b),a必须存在,b必须不存在``a和c可以是不同目录,可实现跨目录改名,但不能跨物理硬盘
mkdirs() 创建多级目录
setLastModified(时间戳) 设置最后一次修改时间
/*关于lastModified的操作:拿到时间戳(从1970年1月1日0时0分0秒至今的毫秒数)如何解析
	1、Date(太复杂)
		getYear()+1900
		getMonth()+1(从0到11月)
		getDate()
		getHours()
		getMinutes()
		getSeconds()
	2、Calendar(太复杂)
		get(x) `1`年`2+1`月`5`日`11`时`12`分`13`秒
	3、SimpleDateFormat
		自定义格式: new SimpleDateFormat("yyyy-MM-dd HH-mm-ss")
		(1)、从long转String
			format()
		(2)、从String转long
			parse()->getTime()
*/
File f=new File("All2.txt");
		Date date=new Date(f.lastModified());
		System.out.println(date.getYear()+1900);
		System.out.println(date.getMonth()+1);
		System.out.println(date.getMonth()+1);
		System.out.println(date.getDate());
		System.out.println(date.getHours());
		System.out.println(date.getMinutes());
		System.out.println(date.getSeconds());

		Calendar cal=Calendar.getInstance();
		cal.setTimeInMillis(f.lastModified());
		System.out.println(cal.get(1));
		System.out.println(cal.get(2)+1);
        System.out.println(cal.get(3));
		System.out.println(cal.get(5));
		System.out.println(cal.get(11));
        System.out.println(cal.get(12));
        System.out.println(cal.get(13));
//最简洁
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
		System.out.println(sdf.format(f.lastModified()));

特等优先级

方法 描述
listRoots() 得到计算的所有根目录
list() 列出目录中所有文件的文件名
listFiles() 列出目录中所有的文件对象 用处:和过滤器一起使用 包含子目录的递归查找
//listRoots应用:监听是否有设备接入
File[] old=File.listRoots();
while(true){
	Thread.sleep(2000);
	File[] now=List.listRoots();
	if(old.length!=now.length){//有设备接入
        //处理代码
    }
    
} 
//listFiles和过滤器一起使用
File[] fs=file.listFiles((x)-> x.isFile() && x.getName().toLowerCase().endsWith(".jpg"));//过滤目录中jpg文件

io流

定义:I:Input=输入、O:Output=输出 流:数据从源点传输到汇点的管道

分类:

	按方向分: 输入流	输出流
	按单位分: 字节流	字符流
	按功能分: 节点流	过滤流

字节流

FileInputStream(输入流 字节流 节点流)和 FileOutputStream(输出流 字节流 节点流)

  • 构造方法

    • 它们都是节点流、构造方法传File和String

    • 它们都是节点流,但只能连接文件,不能连接目录,否则报FileNotFoundException

      • 拒绝访问(连接的是空目录)
      • 路径找不到: FileOutputStream连接的目录不存在
      • 找不到文件:FileInputStream连接的文件不存在
    • FileOutputStream在创建对象那一刻,即便文件不存在,也会自动创建

    • FileOutputSream杀伤力大,连接的文件存在,也会在创建那一刻用空文件覆盖,若需求是在原有内容的基础上追加,打开追加模式
      new FileOutputStream("a.txt",true);

  • 常用方法

    • FileInputStream和FileOutputStream最常用的方法是 read(byte[]) 和write(byte[])
    • FileInputStream使用read方法读取,返回-1说明读完
  • 注意

    • 用完流第一时间关闭,解除对文件的占用
    • 学会使用try-catch-finally(连环try)和TWR

BufferedInputStream(出入流 字节流 节点流) 和 BufferedOutputStream(输出流 字节流 节点)

  • 存在目的:为了给节点流提供巨大的缓冲空间,提升每次读取的吞吐量,进而提高效率

  • 构造方法:

    • 不能连接文件,需要连接其他流(相当于针管,能增加吞吐量,但需要连接”针头“)

    • 构造方法的第二个参数,支持自定义缓冲空间大小,默认8k(8192个字节)

  • 常用方法:

    • 缓冲输出流常用write(int data)
    • 缓冲输入流常用read(),返回值是-1时表示读取完
  • 注意

    • 带缓冲的输出流需要及时清空缓存,否则会导致数据滞留而丢失(因为每次只有到缓冲大小才会自动清,若忘记关流,那么没有到缓冲大小的数据还没写入硬盘,导致数据丢失)
    • 什么时候会清空缓存
      • 满了自动关闭
      • 关闭流,会触发清空缓冲
      • 用flush方法

DataInputStream和DataOutputStream(字节流 输入/输出流 过滤流)

  • 目的:给原本的字节流添加操作基本数据类型的能力

  • 构造方法:不能直接连接文件、需要连接其他流

  • 常用方法:

    • readXXX()

    • writeXXX(参数)

  • 注意:

    • readXXX()不是根据返回值判断读取是否结束

ObjectInputStream和ObjectOutputStream()(字节流 输入\输出流 过滤流)

  • 目的:为字节流提供读写对象的功能
  • 构造方法:不能直接连接文件,只能连接其他流
  • 常用方法
    • readObect()
    • writeObject(对象)
  • 注意
    • readObject()的返回值-1不能当做读取结束 的标志,到结束继续读取触发EOFException(end of file exception)异常
    • 需要持久化,需要先序列化->实现implements serializable接口
      • 一个类中有其他引用类型的属性,这个属性也好实现序列化
      • 无关紧要的引用类型的属性,用transient修饰(不参与持久化)
      • 集合中存放的元素,需要实现序列化接口
      • 持久化的如果是TreeSet和TreeMap,那么它的比较器也要实现序列化(比较器是他俩的一个属性)

字符流

FileReader 和 FileWriter(字符流、输入\输出流、节点流)

  • 目的:读取文本文件,用字节流读取文本文件是按每个字节进行读取,但汉字是两个字节,用字节流读取会截取造成乱码

BufferedReader 和BufferWriter

  • 目的:作为过滤流,是为了给节点流增加变长的缓冲空间,从而提供以行为单位的读写

  • 构造方法:不能直接连文件,需要连接其他的字符流

  • 常用方法:

    • BufferReader String readLine()

    • BufferedWriter write(String)+newLine()

  • 注意

    • reader以null作为读取结束的标志
    • writer是带缓冲的输出流,需要及时清缓存

PrintStream 和 PrintWriter

  • 目的:更方便,既能当做节点流,又可以当做过滤流

  • 构造方法:允许传入 String 路径、File对象、其他的流

  • 优点:

    • 既能连接字节流、又能连接字符流

    • 当做节点流使用:构造方法第二个参数指定字符编码

      • new PrintStream(“a.txt”,"utf-8")
    • 作为过滤流使用:

      • new PrintWriter(new FileWriter("a.txt",true),true)

!: 综上所述 在以行为单位读取文本文件的时候
我们会选择:BufferedReader
但是在以行为单位写出文本文件的时候
我们必然会选择:PrintWriter

posted @ 2021-03-11 22:30  平流层  阅读(28)  评论(0)    收藏  举报