设备:磁盘 U盘 光盘 等。
按照数据流向来分:输入流和输出流。
按操作数据类型来分:字节流和字符流。
字符流:字节流+对应的码表。
字符流。
Reader 和 Writer。
字节流
InputStream 和 OutputStream。
写文件的FileWriter类:
FileWriter fw = new FileWriter("abc.txt");
write("abc"); //写到缓冲区
flush();//刷新缓冲区 将数据写到目的地
close();//关闭流 刷新缓冲区
读取文件的FileReader类:
FileReader fr = new FileReader("abc.txt");
read()方法:
int ch = fr.read(); //每次读取一个字符 读到文件末尾 返回-1
写法:
int ch = 0;
while((ch = fr.read()) != -1){
sout(ch);
}
高效读:
char[] buf = new char[1024]; //建议是1024的整数倍
int len = 0;
while((len = fr.read(buf)) != -1){
sout(new String(buf , 0 , len))
}
高效读写:
char[] buf = new char[1024]; //建议是1024的整数倍
int len = 0;
while((len = fr.read(buf)) != -1){
fw.write(buf , 0 , len)
}
高效写入子类BufferedWriter
write("abcd");
flush();//从缓冲区中将数据刷到目的地
close();
newLine();//另起一行
高效读取子类BufferedReader
read();//返回一个字符
read(buf);//返回读取长度
readLine();//读取一个文本行
装饰者模式和继承的区别
继承
Reader
|--MP3Reader:读取mp3音乐
|--BufferedMP3Reader高效读取mp3音乐
|--AVIReader:读取avi视频
|--BufferedAVIReader :高效读取avi视频
|--MKVReader:读取mkv视频
|--BufferedMKVReader :高效读取mkv视频
装饰者设计模式
Reader
|--MP3Reader:读取mp3音乐
|--AVIReader:读取avi视频
|--MKVReader:读取mkv视频
|--BufferedReader :高效读取类
总结:继承方式实现功能增强会产生复杂的继承关系
而装饰者模式会大大减少继承关系
LineNumberReader用法
getLineNumber();\\获取数据行号
setLineNumber();\\设置数据行号
字节流:InputStream 和 OutputStream
FileOutputStream 用来操作文件的字节流
write("superman".getBytes()); \\写入时直接将内容写入目的地
flush();\\没有实现该方法
FileInputStream 用来读取文件的字节流
read(); \\一次只读取一个字节
available(); \\此方法是获取当前文件的大小来创建一个字节数组
类比
FileOutputStream -- FileWriter
FileInputStream -- FileReader
BufferedInputStream对字节流的高效读
BufferedOutputStream对字节流的高效写
当使用read()方法时,在写入新的文件时,不建议刷新,刷新会使得效率降低。
System.in;\\只有一个,不用关闭
in.close(); \\如果关闭,必须要重启系统(java程序)
System.out;\\输出端是控制台
转换流
InputStreamReader:将字节流转换为字符流
OutputStreamWriter:将字符流转换为字节流
使用转换流向简体中文window系统中创建文本文件时默认使用的是utf-8进行编码。
直接在window中创建一个文本文件,默认使用的是gbk进行编码。
转换流作用:
1、解决编码问题
2、为使用字符流的一些特有的方法简化程序设计
File类用法
属性
System.out.println("getAbsolutePath = " + file.getAbsolutePath()); //绝对路径
System.out.println("getName=" + file.getName()); //文件名
System.out.println("getCanonicalPath=" + file.getCanonicalPath()); //绝对路径的规范形式
System.out.println("getPath=" + file.getPath()); //定义文件路径时 内容是什么就打印什么
System.out.println("length=" + file.length()); //文件大小
System.out.println("lastModified=" + file.lastModified()); //最后修改时间
File类用法
属性
System.out.println("getAbsolutePath = " + file.getAbsolutePath()); //绝对路径
System.out.println("getName=" + file.getName()); //文件名
System.out.println("getCanonicalPath=" + file.getCanonicalPath()); //绝对路径的规范形式
System.out.println("getPath=" + file.getPath()); //定义文件路径时 内容是什么就打印什么
System.out.println("length=" + file.length()); //文件大小
System.out.println("lastModified=" + file.lastModified()); //最后修改时间
文件创建
createNewFile();\\创建一个新的文件 如果文件存在 不创建
mkdir();\\创建一个目录
mkdirs();\\创建多级目录
delete(); \\能删除目录也能删除文件
deleteOnExit(); \\在虚拟机退出时删除该文件
文件判断
在操作文件时,需要先判断文件或者文件夹是否存在
file.exists(); \\判断文件或者文件夹是否存在
renameTo:重命名 源文件.renameTo(目标文件)
使用renameTo实现剪切功能:
剪切功能可能失败:
* 1、文件占用
* 2、没有删除权限
* 3、没有写入权限
list();//将目录下的文件及文件夹列出来,返回一个字符串数组(会列出隐藏文件)
File.listRoots();//列出系统盘各分区