注意:流读取文件的路径必须是绝对路径
流按操作类型分为两种:
* 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
* 字符流 : 字符流只能操作纯字符数据,比较方便。
IO流常用父类
* 字节流的抽象父类:
* InputStream
* OutputStream
* 字符流的抽象父类:
* Reader
* Writer
d: 方法介绍
* void close(): 关闭此输出流并释放与此流有关的所有系统资源。
* void write(byte[] b): 将 b.length 个字节从指定的 byte 数组写入此输出流
* void write(byte[] b, int off, int len) :将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
* abstract void write(int b) : 将指定的字节写入此输出流。
字节输出流FileOutputStream
FileOutputStream
* 写入数据文件,学习父类方法,使用子类对象
* b: FileOutputStream构造方法
* 作用:绑定输出的输出目的
* FileOutputStream(File file)
* 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
* FileOutputStream(File file, boolean append)
* 创建一个向指定 File 对象表示的文件中写入数据的文件输出流,以追加的方式写入。
* FileOutputStream(String name)
* 创建一个向具有指定名称的文件中写入数据的输出文件流。
* FileOutputStream(String name, boolean append)
* 创建一个向具有指定 name 的文件中写入数据的输出文件流,以追加的方式写入。
* c: 流对象使用步骤
* 1. 创建流子类的对象,绑定数据目的
* 2. 调用流对象的方法write写
* 3. close释放资源
* d: 注意事项
* 流对象的构造方法,可以创建文件,如果文件存在,直接覆盖
a: 方法介绍
* void write(byte[] b): 将 b.length 个字节从指定的 byte 数组写入此输出流
* void write(byte[] b, int off, int len) :将指定 byte 数组中从偏移量 off 开始的 len 个字节写入
文件的续写和换行符号
* a: 文件的续写
* FileOutputStream构造方法, 的第二个参数中,加入true
* b: 换行符号
* 在文件中,写入换行,符号换行 \r\n
* \r\n 可以写在上一行的末尾, 也可以写在下一行的开头
字节输入流InputStream
方法介绍
* abstract int read() :
* 从输入流中读取数据的下一个字节。
* int read(byte[] b)
* 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
* int read(byte[] b, int off, int len)
* 将输入流中最多 len 个数据字节读入 byte 数组。
* void close()
* 关闭此输入流并释放与该流关联的所有系统资源。
字节输入流FileInputStream读取字节
* a: 方法介绍
* abstract int read() :
* 从输入流中读取数据的下一个字节,返回-1表示文件结束
* int read(byte[] b)
* 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
* 读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。
* int read(byte[] b, int off, int len)
* 将输入流中最多 len 个数据字节读入 byte 数组。
* void close()
* 关闭此输入流并释放与该流关联的所有系统资源。
字符输入流读取文本FileReader类
* a: 方法介绍
* int read()
* 读取单个字符
* int read(char[] cbuf)
* 将字符读入数组
* abstract int read(char[] cbuf, int off, int len)
* 将字符读入数组的某一部分。
* OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节
* 将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去
构造方法:
* OutputStreamWriter(OuputStream out)接收所有的字节输出流
* 字节输出流: FileOutputStream
* OutputStreamWriter(OutputStream out, String charsetName)
* String charsetName 传递编码表名字 GBK UTF-8
InputStreamReader
缓冲流
BufferedOutputStream
构造方法:
* BufferedOuputStream(OuputStream out)
* 可以传递任意的字节输出流, 传递的是哪个字节流,就对哪个字节流提高效率
BufferedInputStream
构造方法:
* BufferedInputStream(InputStream in)
* 可以传递任意的字节输入流,传递是谁,就提高谁的效率
* 可以传递的字节输入流 FileInputStream
字符输出流缓冲流BufferedWriter
构造方法:
* BufferedWriter(Writer w)传递任意字符输出流
* 传递谁,就高效谁
* 能传递的字符输出流 FileWriter, OutputStreamWriter
字符输出流缓冲流BufferedWriter特有方法newLine newLine()文本中换行
BufferedReader
构造方法:
* BufferedReader(Reader r)
* 可以任意的字符输入流
FileReader InputStreamReader
IO流对象的操作规律
* A: IO流对象的操作规律
* a: 明确一:要操作的数据是数据源还是数据目的。
* 源:InputStream Reader
* 目的:OutputStream Writer
* 先根据需求明确要读,还是要写。
* b: 明确二:要操作的数据是字节还是文本呢?
* 源:
* 字节:InputStream
* 文本:Reader
* 目的:
* 字节:OutputStream
* 文本:Writer
* c: 明确三:明确数据所在的具体设备。
* 源设备:
* 硬盘:文件 File开头。
* 内存:数组,字符串。
* 键盘:System.in;
* 网络:Socket
* 目的设备:
* 硬盘:文件 File开头。
* 内存:数组,字符串。
* 屏幕:System.out
* 网络:Socket
* 完全可以明确具体要使用哪个流对象。
* d: 明确四:是否需要额外功能呢?
* 额外功能:
* 转换吗?转换流。InputStreamReader OutputStreamWriter
* 高效吗?缓冲区对象。BufferedXXX
* 已经明确到了具体的体系上。
File文件对象:
* a: Output
* 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作
* b: Input
* 把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作
File类是文件和目录路径名的抽象表示形式
File类静态的成员变量
* a: pathSeparator
* 与系统有关的路径分隔符,为了方便,它被表示为一个字符串
* b: separator
* 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串
File类构造方法_1
* a: File(String pathname)
* 通过将给定路径名字符串转换为一个File对象,之后可以使用File中的方法
* windows中的路径或文件名不区分大小写
相对路径和绝对路径
* a: 绝对路径
* 绝对路径是一个固定的路径,从盘符开始
* b: 相对路径
* 相对路径相对于某个位置,在eclipse下是指当前项目下
File类的构造方法_2
* a:File(String parent, String child)
* 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 对象
* b: File(File parent, String child)
File创建文件的功能
* boolean createNewFile()
* 创建的文件路径和文件名,在File构造方法中给出
* 文件已经存在了,不在创建
File类创建目录功能
* a: 创建目录
* public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
* public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来
File类删除功能
* a: 删除功能
* public boolean delete():删除文件或者文件夹(一个文件夹如果不是空的则不能删除)
File类获取功能
* a: 方法介绍
* String getName(): 返回路径中表示的文件或者文件夹名。获取路径中的最后部分的名字
* long length(): 返回路径中表示的文件的字节数
* String getAbsolutePath(): 获取绝对路径,返回String对象
* File getAbsoluteFile() : 获取绝对路径,返回File对象
* eclipse环境中,写一个相对路径,绝对位置工程根目录
* String getParent(): 获取父路径,返回String对象
* File getParentFile(): 获取父路径,返回File对象
File类判断功能
* a: 方法介绍
* boolean exists(): 判断File构造方法中封装路径是否存在。存在返回true,不存在返回false
* boolean isDirectory(): 判断File构造方法中封装的路径是不是文件夹
* boolean isFile(): 判断File构造方法中封装的路径是不是文件
File类list获取功能
* a: 方法介绍
* String[] list():获取到File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)。返回只有名字数组
* File[] listFiles():获取到,File构造方法中封装的路径中的文件和文件夹名 (遍历一个目录)* 返回的是目录或者文件的全路径
* static File[] listRoots(): 列出可用的文件系统根
文件过滤器
* a: 作用
* 过滤一个目录下的指定扩展名的文件,或者包含某些关键字的文件夹
* b: 方法介绍
* public String[] list(FilenameFilter filter)
* public File[] listFiles(FileFilter filter)
public class MyFilter implements FileFilter{
public boolean accept(File pathname) {
/*
* pathname 接受到的也是文件的全路径
* c:\\demo\\1.txt
* 对路径进行判断,如果是java文件,返回true,不是java文件,返回false
* 文件的后缀结尾是.java
*/
//String name = pathname.getName();
return pathname.getName().endsWith(".java");
}
}
文件过滤器_原理分析
* listFiles()遍历目录的同时,获取到了文件名全路径,调用过滤器的方法accept,将获取到的路径传递给accept方法的参数pathname
* accept方法接收了参数pathname,参数是listFiles传递来的
* 在accept方法中,进行判断,如果这个路径是Java文件,返回true,走着返回false
* 一旦方法返回了true
* listFiles将路径保存到File数组中