Java IO操作
I/O操作
文件和目录的抽象表示
File类在java.io.File中
file类与操作系统无关
路径分隔符:windows中就是分号(;),Linux是冒号(:)
默认名称分隔符:也称之为文件名称分隔符,windows是反斜杠(),Linux是正斜杠(/)
这里使用这些标识符,就是为了实现跨平台性!所以应该积极使用这些标识符而不是直接将这些符号写死:
绝对路径和相对路径:
?
划重点:相对路径是相对于当前项目的根目录的!
注意事项:
- 路径不区分大小写
- 路径中使用一个转义字符+一个普通字符的方式来表示一个普通字符
File类中的构造方法
划重点:
- 路径可以是文件,也可以是文件夹
- 这里只是把路径封装为File对象,并不获取路径的内容,所以不需要考虑路径的真假情况,路径本身不存在也没事
File f1=new File(pathname);
File类有四种创建方法:
第三种将父路径和子路径拆开的好处:
第一种相比第三种的区别:
父路径是File类型,可以使用File的方法对路径进行一些操作,再用路径创建新的对象
File类中的常用方法
第一种方法和第二种方法的区别:
第二种方法只会返回当初创建对象时传入的路径,是相对就传相对,是绝对就传绝对,而第一种只传递绝对路径
length()返回的不是文件名的长度,而是文件的长度,也就是文件的大小,它的单位是字节(注意,文件夹是没有大小概念的,所以不能用来获取文件夹的大小,要是获取了也是0)
如果给出的路径是不存在的,调用length()并不会报错,只会返回0
文件过滤器
在File类中有两个和ListFiles重载的方法,方法的参数就是过滤器
java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器
? 作用:用来过滤文件
第一个方法的参数:File pathname:其实就是使用Listfiles方法遍历目录,得到的每一个文件对象
? 作用:用于过滤文件名称
? 参数:File dir:构造方法中传递的被遍历的目录 String name:遍历目睹获得的每一个文件的名称
注意,两个过滤器接口没有实现类,需要自己写实现类,重写过滤方法accept,在方法中自己定义过滤的规则具体流程如下:
- 创建过滤器的实现类,重写过滤方法,定义过滤规则
可以优化为匿名内部类:
字节输出流OutputStream
是所有字节输出流的父类,定义了一些共性的成员方法
这些已知子类中对应着输出的不同场景
FilterOutputStream:带过滤器的输出流
ObjectOutputStream:写对象
重点学习FileOutputStream:
写入数据的原理:
java程序-》JVM-》OS-》调用OS中写数据的方法-》写入文件
写入步骤:
- 创建FileOutputStream对象,构造方法中传递写入数据的目的地
- 调用write方法写入
- 释放资源(流的使用会占用内存)
一次写入多个字节的方法
追加写:
InputStream
常用方法:
FileInputStream:文件字节输入流
读取多个字节:
返回的int是读取的有效字符数
字节数组转换为字符串:
字符流
对于像中文符号这样的需要使用多个字节来表示的符号,使用字节读入会造成显示上的问题,所以这里我们采用字符流,以字符而不是字节为单位进行。字符流对于文本的处理能力要比字节流好。
实际使用上,对字符的操作还是比对字节的操作要多的
Reader是一个父类,其有和字节流完全类似的子类和用法,这里就不再赘述了
Flush和Close方法的区别
write是写入到内存缓存区中,只有调用Flush或者Close才会写入到硬盘
其他写出数据的方法
常用API
Random,ArrayList,Scanner
API简介
下面这张图的表达有问题,“Java API文档是程序员的字典”而不是API本身
Scanner
Scanner可以做到键盘输入数据
import java.util.Scanner
包的导入要在package之后,类的定义之前
Scanner sc=new Scanner(System.in);
System.in是从键盘输入
- 获取键盘输入的一个int数字: int num=sc.nextInt();
- 获取键盘输入的一个字符串: String str=sc.next();
ArrayList
和C++STL中的vector类似