1.File类的使用
- File类的一个实例就对应着磁盘上的一个文件或着文件目录 ---->
万事万物皆对象
- File的方法:
获取文件和目录基本信息1
- public String getName() :获取名称
- public String getPath() :获取路径
- `public String getAbsolutePath()`:获取绝对路径
- public File getAbsoluteFile():获取绝对路径表示的文件
- `public String getParent()`:获取上层文件目录路径。若无,返回null
- public long length() :获取文件长度(即:字节数)。不能获取目录的长度。
- public long lastModified() :获取最后一次的修改时间,毫秒值
列出目录的下一级
- public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
- public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
File类的重命名功能
- public boolean renameTo(File dest):把文件重命名为指定的文件路径。
判断功能的方法
- `public boolean exists()` :此File表示的文件或目录是否实际存在。
- `public boolean isDirectory()` :此File表示的是否为目录。
- `public boolean isFile()` :此File表示的是否为文件。
- public boolean canRead() :判断是否可读
- public boolean canWrite() :判断是否可写
- public boolean isHidden() :判断是否隐藏
创建、删除功能
- `public boolean createNewFile()` :创建文件。若文件存在,则不创建,返回false。
- `public boolean mkdir()` :创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
- `public boolean mkdirs()` :创建文件目录。如果上层文件目录不存在,一并创建。
- `public boolean delete()` :删除文件或者文件夹
删除注意事项:① Java中的删除不走回收站。② 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录。
- File类中声明了新建、删除、获取名称、重命名等方法,并没有涉及到文件内容的读写操作
要想实现文件内容的读写,我们就需要使用io流 - 关于路径的理解
绝对路径:以windows操作系统为例,包括盘符在内的文件或文件目录的完整路径
相对路径:相对于某一个文件目录来讲的相对路径的位置
在idea中,如果使用单元测试方法:相当于当前的module来讲
如果使用main()方法:相对于当前的project来讲
2.IO流的概述
- IO流的分类
- 流向:输入流、输出流
- 处理数据的单位:字节流、字符流
- 流的角色:节点流、处理流
- IO的4个抽象基类:InputStream、OutputStream、Reader、Write
3.节点流之:文件流
- FileInputStream、FileOutputStream、FileReader、FileWrite
- (掌握)读写数据的过程
- 步骤1:创建File类的对象,作为读取或写出数据的端点
- 步骤2:创建相关流的对象(FileReader、FileWrite)表示字符流,( FileInputStream、 FileOutputStream)表示字节流
- 步骤3:读取、写出数据的过程
- 关闭流资源
具体实现步骤
3. FileReader \ FileWriter 的使用
3.1 执行步骤:
第一步:创建读取或写出的File类的对象
第二步:创建输入流或输出流
第三步:具体的读入或写出的过程
读入:read(char[] cbuffer)
写出:write(String str) / write(cher[] cbuffer,0,len)
第四步:关闭流资源,避免内存泄露
3.2 注意点:
①因为涉及到流资源的关闭操作,所以出现异常的话,需要使用try-catch-finally的方式来处理异常
②对于输入流来讲,要求File类的对象对应物理磁盘上的文件必须存在,否则,会报FileNotFoundException
对于输出流来讲,File类的对象对应的物理磁盘上的文件可以不存在
>如果此文件不存在,则在输出的过程中,会自动创建此文件,并写出数据到此文件中
>如果此文件存在,使用 FileWriter(File file) 或 FileWriter(File file,false):输出数据过程中,
会新建重名的文件对现有的文件进行覆盖
FileWriter(File file,true):输出数据的过程中,会在现有的文件末尾追加写入内容
4. FileInputStream \ FileOutputStream 的使用
4.1 执行步骤:
第1步:创建读取或写入的File类的对象
第2步:创建输入流和输出流
第3步:具体的读入或写出的过程
读入:read(byte [] buffer)
写出:write(byte [] buffer,0,len)
第4步:关闭流资源,避免内存泄漏
4.2 注意点:
①因为涉及到流资源的关闭操作,所以出现异常的话,需要使用try-catch-finally的方式来处理异常
②对于输入流来讲,要求File类的对象对应物理磁盘上的文件必须存在,否则,会报FileNotFoundException
对于输出流来讲,File类的对象对应的物理磁盘上的文件可以不存在
>如果此文件不存在,则在输出的过程中,会自动创建此文件,并写出数据到此文件中
>如果此文件存在,使用 FileInputStream(File file) 或 FileInputStream(File file,false):输出数据过程中,
会新建重名的文件对现有的文件进行覆盖
FileOutputStream(File file,true):输出数据的过程中,会在现有的文件末尾追加写入内容
---附加其他的注意点
>对于字符流,只能用来操作文本文件,不能用来处理非文本文件的
对于字节流,通常是用来处理非文本文件的,但是,如果涉及到文本文件的复制操作,也可以使用字节流操作
说明:
文本文件:.txt 、.java、.c 、.cpp 、.py等
非文本文件:.doc、.xls、.jpg 、.pdf、.mp4、.avi 等
4.处理流之一:缓冲流
- BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWrite
- 作用:提升文件读写的效率
- 操作方法
4个缓冲流 使用的方法
处理非文本文件的字节流:
BufferedInputStream read(byte[] buffer)
BufferedOutputStream write(byte[] buffer,0,len) / flush()
处理文本文件的字符流:
BufferedReader read(char[] cBuffer) / readLine()
BufferedWriter write(char [] cBuffer,0,len) / write(String ) / flush()
实现的步骤
第1步:创建File的对象、流的对象(包括文件流、缓冲流)
第2步:使用缓冲流实现 读取数据 或 写出数据的过程(重点)
读取:int read(char[] cbuf/byte[] buffer) : 每次将数据读入到cbuf/buffer数组中,并返回读入到数组中的字符的个数
写出:void write(String str)/write(char[] cbuf):将str或cbuf写出到文件中
void write(byte[] buffer) 将byte[]写出到文件中
第3步:关闭资源
5.处理流之二:转换流
- 作用:实现字节与字符之间的转换
- 层次1:熟悉转换流的使用
- InputStreamReader:将一个输入型的字节流转换为输入性的字符流
- OutputStreamWriter:将一个输出型的字符流转换为一个输出型的字节流
- 层次2:(掌握)字符的编码和解码的过程、常用的字符集
- 解决相关的问题:读写字符的过程中出现乱码!本质的问题:使用的解码集和编码集不一致导致乱码
6.处理流之三:对象流
- 层次1:熟悉对象流的使用
- ObjectInputStream:反序列化时需要的API
- ObjectOutputStream:序列化时需要使用的API
两个过程使用的流:
序列化过程:使用ObjectOutputStream流实现,将内存中的java对象保存在文件中或通过网络传输出去
反序列化过程:使用ObjectInputStream流实现,将文件中的数据或网络传输过来的数据还原为内存
中java中的对象
- 层次2:对象的序列化机制
- 使用的场景:不同的进程之间通信、客户端(或浏览器端)与服务器端传输数据
- 自定义类要想实现序列化机制需要满足的要求即注意点
自定义类要想实现序列化机制,需要满足:
①自定义类需要实现接口:Serializable
②要求自定义类声明一个全局常量: static final long serialVersionUID = 42122333243L;
用来唯一的标识当前的类
③要求自定义类的各个属性也必须是可序列化的
>对于基本数据类型的属性:默认就是可以序列化的
>对于引用数据类型的属性:要求实现Serializable接口~
注意点:
①如果不声明全局常量serialVersionUID,系统会自动生成一个针对于当前类的serialVersionUID
如果修改此类的话,会导致serialVersionUID变化,进而导致反序列化时,出现InvalidClassException异常
②类中的属性如果声明transient或static,则不会实现序列化
7.其他流的使用
- 了解:数据流:DataInputStream、DataOutputStream
- 了解:标准的输入流、标准的输出流:System.in、System.out
- 了解:打印流:PrintStream、PrintWriter