FILE类
文件介绍
通过程序将数据放在硬盘中长久保存的途径
FILE类
代表一个文件或者目录,通过File类的方法可以获取文件的大小,判断文件是否存在或者创建文件和文件夹
重写了toString,直接打印对象会输出地址
注意:File对象只能对文件操作不能操作文件里的内容
File对象的创建
构造器
创建对象时,对应的文件可以存在也可以不存在
public File(String pathname)
//根据文件路径创建文件对象
public File(String parent,String child)
//根据父路径和子路径创建文件对象
public File(File parent,String child)
//根据父路径对应文件对象和子路径名字创建文件对象
linux系统中
File f1 = new File("D:/resourse/ab.txt");
Windows系统中
File f1 = new File("D:\\resourse\\ab.txt")
通过File类中的separator()静态方法可以在不同操作系统中返回对应分隔符
所以可以编写跨平台的文件目录
File f1 = new File("D:"+File.separator+"resource"+File.separator+"ab.txt");
常用方法
public boolean exists()
//判断当前文件对象对应的文件路径是否存在,存在返回true
public boolean isFile()
//判断当前文件对象指代的是否是文件,是文件返回true
public boolean isDirectory()
//判断当前文件对象指代的是否是文件夹,是文件夹返回true
public String getName()
//获取文件的名称(包含后缀)
public long length()
//获取文件的大小,返回字节个数
public long lastModified()
//获取文件的最后修改时间
public String getPath()
//获取创建文件对象时,使用的路径
public String getAbsolutePath()
//获取绝对路径
public boolean delete()
//删除文件或目录(目录下有文件不能删除)
public boolean mkdir()
//创建路径对应的目录
public boolean mkdirs()
//创建路径对应的目录(包含需要但不存在的父目录)
public boolean createNewFile()
//创建对象对应路径下不存在的文件,创建成功返回true
public boolean renameTo(File dest)
//将文件对象名字改成dest的名字
文件路径
windows中使用\作为目录分隔符
但java中\为转义字符
所以在目录中应该使用两个
\\
来表示目录的分隔符(正则同理)
但linux或mac所需的正斜杠/不需要考虑这么多
绝对路径和相对路径
绝对路径
从根目录开始的完整路径
相对路径
相对于当前工作路径的路径
在IDEA中开发项目时,工作目录通常为项目的根目录,即项目文件夹所在的路径
文件遍历
一级文件名称:目录下的子文件和子目录(不包含子目录的子文件和子目录)名称
一级文件对象:目录下的子文件和子目录(不包含子目录的子文件和子目录)对象
当参数为文件或不存在时,返回null
空文件夹返回空数组
隐藏文件也能被返回,但对无权限访问的文件返回null
public String[] list()
//获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回
public File[] listFiles()
//获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回
递归
递归将方法分解为更小的子问题,直到终止递归
递归需要一个出口,不然会无限循环
递归实现文件遍历
search(f,filename)//查找方法 f参数为目录,filename为要找的文件名
1,获取f下所有一级文件对象
2,遍历这些文件对象
3,如果文件为所要找的则输出文件路径
4,如果文件对象中有文件夹则对文件夹继续调用search()方法递归遍历
5,当这个目录为空或者目录不存在时退出递归
文件遍历-队列
采用非递归算法进行文件遍历
使用队列,可以选择LinkedList
while遍历队列直到队列为空
判断队列中取出的元素是目录还是文件
如果为目录,取出目录中文件再装入队列
如果为文件直接进行判断
IO流
File类只能操作文件,但不能操作文件中的内容,而IO流就可以直接对文件中的数据进行直接操作
JAVA IO(input/output)是JAVA编程语言中用于处理输入输出的API
提供了一组类和接口,用于读取和写入数据
包括文件网络和控制台等
IO流的分类
按流向分为输入流和输出流:
输入流:
用于从外部数据源(文件/网络)读取数据到程序中
输出流:
用于将程序中的数据输出到外部目标(文件/网络)
按类型分为字节流和字符流:
字节流:以字节为单位进行读写操作,可以处理所有数据
在操作中文时可能会出现乱码
字节输入流:用于从外部数据源读取字节数据
字节输出流:用于将字节数据输出到外部目标
字符流:以字符为单位进行读写操作,适合处理文本数据
支持中文
字符输入流:用于从外部数据源读取字符数据
字符输出流:用于将字符数据输出到外部目标
IO流体系
字节流
InputStream(字节输入流):
所有字节输入流的基类,提供了读取字节的基本方法
FileInputStream:用于从文件中读取字节数据
OutputStream(字节输出流):
所有字节输出流的基类,提供了写入字节的基本方法
FileOutputStream:用于将字节数据接入文件
字符流
Reader(字符输入流):
所有字符输入流的基类,提供了读取字符的基本方法
FileReader:用于从文件中读取字符数据
Writer(字符输出流):
所有字符输出流的基类,提供了写入字符的基本方法
FileWriter:用于将字符数据写入文件
IO流的体系
在Java.io包下
字节输入流操作InputStream
一个用于从文件或数据源中读取字节数据的抽象类
通常使用其子类FileInputStream类
主要功能是从数据源中读取字节数据,可以逐个字节读入,也可以一次读取多个
构造器
字节输入流指向的文件不存在会发生异常
public FileInputStream(File file)//创建字节输入流管道连通源文件
public FileInputStream(String pathname)//同上
常用方法
注:数组读写的效率要远远高于字节读写
public int read()
//每次读取一个字节返回,如果没有数据可读会返回-1
public int read(byte[] buffer)
//每次用一个字节数组去读取数据,返回字节数组读取了多少个字节,如果没有数据可读会返回-1
//数组长度决定读取个数
//把读到的数据存到数组中,可以直接用String接收
//String s = new String(new byte[5]);
//返回读到的数据个数,没读到返回-1
字节输出流操作OutputStream
用于将数据写入到输出源(文件/网络)的流,是一个抽象类
通常使用其子类FileOutputStream类
构造器
如果输出流连通的文件不存在会自动创建一个
append默认为false,代表不追加写数据(会清空原有数据)
append为true代表在原有数据后追加数据
public FileOutputStream(File file)
//创建字节输出流管道和源文件对象连通
public FileOutputStream(String filepath)
//创建字节输出流管道和源文件对象连通
public FileOutputStream(File file,boolean append)
//创建字节输出流管道和源文件对象连通,可以追加数据
public FileOutputStream(String filepath,boolean append)
//创建字节输出流管道和源文件对象连通,可以追加数据
常用方法
如果需要写入字符串,可以使用字符串的getBytes()方法转成字节数组
public void write(int a)
//写出一个字节
public void write(byte[] buffer)
//写出一个字节数组
public void write(byte[] buffer,int pos,int len)
//写出一个字节数组的一部分,pos=开始索引,len=长度
public void close() throws IOException
//关闭流
资源释放
关流,断开流对象和文件之间的关联
1,对象.close()
直接关闭流
2,捕获(不推荐)
将文件处理语句放入try中捕获
将释放语句.close()放入finally中释放
在finally中需要做空指针判断和IO异常捕获
3,JDK7后处理方法
使用try-with-resource
只有实现了AutoCloseable接口的对象才能放入try中
try(资源对象1;资源对象2){
可能会出现问题的代码
}catch(异常类型 变量名){
处理异常的方案
}
自动释放资源,无需close