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

浙公网安备 33010602011771号