File类
File类用来描述一个文件或者文件夹。
构造方法:
File(String pathname) 通过给定路径名字来创建一个File对象。
File(URI uri) 通过给定URI来创建一个File对象。
File(File parent, String child) 根据File父路径和String子路径创建一个File对象。
File(String parent, String child) 根据String父路径和String子路径创建一个File对象。
File.separator目录分割符
与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符.
常用方法:
boolean createNewFile() 在指定位置创建一个新文件,成功返回true,已存在就不创建返回false
boolean mkdir() 在指定位置创建一个单级文件夹,成功返回true,存在就不创建返回false,上级目录不存在返回false。
boolean mkdirs() 在指定位置遍历创建多级文件夹,成功返回true,存在就不创建返回false
boolean renameTo(String dest) 同一目录下重命名指定文件或文件夹,不同目录下为剪切文件(此时不可操作文件夹)。
boolean delete() 立即删除文件或者空文件夹。
boolean deleteOnExit() 发出删除指令,当jvm退出的时候执行删除行为,一般用于删除临时文件。
boolean exists() 指定文件或文件夹是否存在。
boolean isFile() 判断是否是一个文件。
boolean isDirectory() 判断是否是一个文件夹。
boolean isHidden() 是否是一个文件或文件夹
boolean isAbsolute() 是否为绝对路径
String getName() 获取为文件或文件名,不包含上级路径。
String getPath() 返回绝对路径
String getAbsolute() 获取绝对路径,与文件存在与否无关
Long length() 获取文件大小(以字节为单位)
String getParent() 返回父目录路径
Long lastModified() 获取最后一次被修改的时间
static File[] listRoots() 列出所有根目录
String[] list() 返回目录下的所有文件名(包含隐藏文件)
String[] list(fileNameFilter filter) 返回指定目录中符合过滤条件的子文件或子目录.
File[] listFiles() 返回目录下的所有文件
File[] listFiles(FilenameFilter filter) 返回指定目录中符合过滤条件的子文件或子目录.
FilenameFilter:这是一个过滤器接口
IO流分类:
如果是按照数据的流向划分:
输入流
输出流
如果按照处理的单位划分:
字节流: 字节流读取得都是文件中二进制数据,读取到二进制数据不会经过任何的处理。
字符流:字符流读取的数据是以字符为单位的,字符流也是读取文件中的二进制数据,不过会把这些二进制数据转换成我们能识别的字符。(字符流 = 字节流 + 解码)
I0流体系
字节流:
---| InputStream 输入流:所有输入字节流的基类 (抽象类)
------| FileInputStream 字节输入流: 读取文件数据的输入字节流.
------| BufferedInputStream 缓冲输入字节流:内部维护了一个8kb的数组,提高读取文件数据的效率。
------| ObjectInputStream 对象输入流:
------| SequenceInputStream 序列输入流:
---| OutputStream 输出流:是所有输出字节流的父类(抽象类)
------| FileOutStream 字节输出流:向文件输出数据的输出字节流。
------| BufferedOutputStream 缓冲输出字节流:内部维护了一个8kb的数组,提高写文件数据的效率
------| ObjectInputStream 对象输出流:
------| PrintStream 打印流: 打印流可以打印任意类型的数据,而且打印数据之前都会先把数据转换成字符串再进行打印。
字符流:
---| Reader 输入流:输入字符流的基类(抽象类)
------| FileReader 字符输入流:读取文件的输入字符流
------| BufferedReader 缓冲输入字符流:缓冲输入字符流出现的目的是为了提高读取文件的效率和拓展了FileReader的功能。
------| InputStreamReader
---| Writer 输出字符流的基类(抽象类)
------| FileWriter 向文件数据数据的输出字符流。
------| BufferedWriter 缓冲输出字符流。
------| OutputStreamWriter
输入字节流:
使用FileInputStream读取文件数据的步骤:
1. 找到目标文件
2. 建立数据的输入通道。
3. 读取文件中的数据。
4. 关闭资源.
输出字节流:
FileOutputStream如何使用呢?
1. 找到目标文件
2. 建立数据的输出通道。
3. 把数据转换成字节数组写出。
4. 关闭资源
FileOutputStream要注意的细节:
1. 使用FileOutputStream的时候,如果目标文件不存在,那么会自动创建目标文件对象。
2. 使用FileOutputStream写数据的时候,如果目标文件已经存在,那么会先清空目标文件中的数据,然后再写入数据。
3. 使用FileOutputStream写数据的时候, 如果目标文件已经存在,需要在原来数据基础上追加数据的时候应该使用new FileOutputStream(file,true)构造函数,第二参数为true。
4. 使用FileOutputStream的write方法写数据的时候,虽然接收的是一个int类型的数据,但是真正写出的只是一个字节的数据,只是把低八位的二进制数据写出,其他二十四位数据全部丢弃。
缓冲输入字节流:
使用BufferedInputStream的步骤:
1. 找到目标文件。
2. 建立数据的输入通道
3. 建立缓冲输入字节流
4. 关闭资源
注意:
1. BufferedInputStream出现的目的是了提高读取文件的效率,但是缓冲流都不具备读写文件的能力,它要借助其它流的读写文件的能力。
2. BufferedInputStream的read方法每次读取一个字节的数据,
3. BufferedInputStream能提高效率的原因:读取时会一次性把8kb数据读入缓冲数组,然后每次都从数组中读取一个字节,8kb数据读完后,会再次将新的8kb数据放入缓冲数组。
4. 调用BufferedInputStream的close方法实际上关闭的是FileinputStream.
缓冲输出字节流:
使用BufferedOutputStream的步骤:
1. 找到目标文件
2. 建立数据的输出通道
3. 建立缓冲输出字节流
4. 关闭资源
要注意的细节:
1. 使用BufferedOutStream写数据的时候,它的write方法是是先把数据写到它内部维护的字节数组中。
2. 如果需要把数据真正的写到硬盘上面,需要调用flush方法或者是close方法、 或者是内部维护的字节数组已经填满数据的时候。
FileReader
用法:
1. 找到目标文件
2. 建立数据的输入通道
3. 读取数据
4. 关闭资源
FileWriter
FileWriter的使用步骤:
1. 找到目标文件。
2. 建立数据输出通道
3. 写出数据。
4. 关闭资源
FileWriter要注意的事项:
1. FileWriter内部是维护了一个1024个字符数组的,使用它写数据的时候,会先写入到它内部维护的字符数组中,如果需要把数据真正写到硬盘上,需要调用flush或者是close方法或者是填满了内部的字符数组。
2. 使用FileWriter的时候,如果目标文件不存在,那么会自动创建目标文件。
3. 使用FileWriter的时候,如果目标文件已经存在了,那么默认情况会先清空文件中的数据,然后再写入数据,如果需要在原来的基础上追加数据,需要使用“new FileWriter(File f, boolean b)”的构造方法,第二参数为true。
BuffererReader
输入字符流出现的目的是为了提高读取文件的效率和拓展了FileReader的功能。
其实该类内部也是维护了一个8kb的字符数组.
BufferedReader的使用步骤:
1. 找到目标文件
2. 建立数据的输入通道。
3. 读取数据
4. 关闭资源
经典写法
while((line = myReadLine(fileReader))!=null){
System.out.println(line);
}
BufferedWriter
BufferedWriter内部只不过是提供了一个8192长度的字符数组作为缓冲区而已,拓展了FileWriter的功能。
BufferedWriter使用:
1. 找到目标文件
2. 建立数据的输出通道
3. 写出数据
4. 关闭资源
SequenceInputStream
序列流创建步骤:
//1、创建文件
File file = new File("F:\\music");
//2、创建文件输入流
FileInputStream fos2 = new FileInputStream(file);
//3、创建Vector
Vector vector = new Vector();
//4、将文件输入流添加到Vector
vector.add(fos);
//5、通过Vector获取迭代器
Enumeration<FileInputStream> e = vector.elements();
//6、创建序列流
SequenceInputStream inputStream = new SequenceInputStream(e);
对象的输入输出流 : 对象的输入输出流主要的作用是用于写对象的信息与读取对象的信息。对象信息一旦写到文件上那么对象的信息就可以做到持久化了
对象的输出流:ObjectOutputStream
对象的输入流: ObjectInputStream
对象输入输出流要注意的细节:
1. 如果对象需要被写出到文件上,那么对象所属的类必须要实现Serializable接口。 Serializable接口没有任何的方法,是一个标识接口而已。
2. 对象的反序列化创建对象的时候并不会调用到构造方法的
3. serialVersionUID 是用于记录class文件的版本信息的,serialVersionUID这个数字是通过一个类的类名、成员、包名、工程名算出的一个数字。
4. 使用ObjectInputStream反序列化的时候,ObjeectInputStream会先读取文件中的serialVersionUID,然后与本地的class文件的serialVersionUID进行对比,如果这两个id不一致,那么反序列化就失败了。
5. 如果序列化与反序列化的时候可能会修改类的成员,那么最好一开始就给这个类指定一个serialVersionUID,如果一类已经指定的serialVersionUID,然后在序列化与反序列化的时候,jvm都不会再自己算这个 class的serialVersionUID了。
6. 如果一个对象某个数据不想被序列化到硬盘上,可以使用关键字transient修饰。
7. 如果一个类维护了另外一个类的引用,那么另外一个类也需要实现Serializable接口。
打印流
打印流可以打印任何类型的数据,而且打印数据之前都会先把数据转换成字符串再进行打印。
主要应用:
改变标准输出流:
PrintStream p = new PrintStream(new File(""));
System.setout(p);
收集异常日志信息:
File logFile = new File("logfile");
PrintStream logPrintStream = new PrintStream(new FileOutputStream(logFile,true));
try{
代码区
}catch(Exception e){
//将异常写入日志留
e.printStackTrace(logPrintStream);
}
转换流:
这是字节流和字符流沟通的桥梁。
输入字节流的转换流:InputStreamReader 可以把输入字节流转换为输入字符流
输出字节流的转换流:OutputStreamWriter 可以把输出字节流转换成输出字符流
转换流的作用:
1. 如果目前所获取到的是一个字节流需要转换字符流使用,这时候就可以使用转换流。
2. 使用转换流可以指定编码表进行读写文件。
编码与解码
编码: 把看得懂的字符变成看不懂码值这个过程我们称作为编码。
解码: 把码值查找对应的字符,我们把这个过程称作为解码。
String s = "中国a";
byte[] bytes = s.getBytes("gbk");//编码
String s1 = new String(bytes,"gbk");//解码
注意细节:
1、编码与解码的时候指定的码表是unicode实际上就是用了utf-16.