浅介绍一下java中的流的使用,主要从流的读取,流的一些api来学习;
一、简单介绍一下File的使用
- File主要是使某个具体的路径成为一个文件对象,包括文件的创建、判断、修改、删除等等操作
isDirectory()与isFile():前者是判断当前的file对象是否为目录,那么后者是判断是否为文件
getAbsolutePath() :获取文件对象的绝对路径。与之对应的还有一个文件的相对路径,这个一般是相对于本项目所在路径来说的,看需求来使用。
exists():判断当前文件对象是否存在,主要是结合文件的后续需求来使用;
mkdirs()与mkdir():这两个的区别显而易见,前者能创建多个目录,而后者只能创建单个目录。举个大狸子:C://a\b\c,和C://a,当我们需要创建这样的目录时,前者必须使用mkdirs,因为c盘下的a\b\c都不存在,而mkdir只能创建C://a这种单个目录。所以为什么不用mkdis呢,强烈推荐
getName() :获取当前文件的文件名
canRead() :当前文件是否能读取
delete():删除文件
二、再认识了file对象后,再接着了解流的使用
- InputStream与OutputStream
InputStream:字节输入流,主要是通过创建一个文件字节输入流对象来操作文件,将文件内容读取到内存中
OutputStream与只相反,将文件内容从内存输出到文件
两个流对象通常搭配缓冲流来使用,设置读取的容量大小,或者设置字节数组来读取文件
1.1字节数组方式读取
byte[] buffer = new byte[1024];//创建了一个1024字节容量的数组
1.2缓冲流读取
BufferedInputStream与BufferedOutputStream
一个是输入缓冲流,另一个是输出缓冲流,本质上还是字节数组读取方式,他的默认字节是8192B
①使用方式输入流的对象.read(buffer);
②缓冲流的对象.read();//使用缓冲流并不需要设置读取容量,但在创建输入缓冲流对象时应该new BufferedInputStream(输入流对象);同理输出缓冲流的对象类似定义。
- 用文件流操作文件
文件流主要是用于文件的输入和输出,比如说,当需要把某个目录下的文件全都拷贝到某个文件夹下,就需要使用流来处理,介绍一下具体步骤:
//将路径转换为file对象
File sourceFile=new File(sourcePath)//注意传入源路径
File targetFile=new File(targetPath)//注意传入目标路径
//首先创建输入输出流对象
InputStream is=new FileInputStream(sourceFile);
OutputStream os=new FileOutputStream(targetFile);
//创建缓冲流对象
BufferedInputStream bis=new BufferedInputStream(is);
BufferedOutputStream bos=new BufferedOutputStream(os);
//使用read方法来读取文件
int len;
while((len=bis.read())!=-1){
bos.write(len);
}
os.flush();//刷新流,行读取数据流
//这里必须解释一下为什么需要强行读取
//因为字节输出流是有一定的缓冲区的,往往是只有等到缓冲区满或者到达一定大小才会读出,因为很可能会因为不读出而发生数据丢失,这个时候就必须要强行读取余下的数据了
//关闭流对象
is.close();
os.close();
bis.close();
bos.close();
到这里基本能够操作一些文件实现复制,转移等等操作了
三、扩展文件过滤
当使用idea获取当前文件对象所在目录的全部文件名称时,java官方提供了listFiles供我们使用,仔细看有一些构造方法:FileFilter和FilenameFilter
FileFilter和FilenameFilter区别
FileFilter:操作File对象实现过滤操作,需要重写accept方法,参数是File对象
方法一:创建一个类用作过滤并继承FileFilter,并最后再将类对象传入listFiles中
sourceFile.listFiles(new FilterFile())
//accept方法会返回成功或失败的Boolean类型
//先是获取当前文件对象的名称,接着判断是否为指定后缀,是则最终返回false,过滤
jpg后缀的文件
@Override
public boolean accept(File pathname) {
boolean flag=true;
if(pathname.getName().endsWith("jpg")){//文件路径是否是jpg结尾
flag=false;
}
return flag;
方法二:lambda表达式
sourceFile.listFiles((pathname)->pathname.getName().endsWith("jpg")))//jpg后缀返回false然后过滤
FilenameFilter:与FileFilter的不同之处在于继承的类是FilenameFilter和参数区别
@Override
public boolean accept(File dir,String name) { //直接提供了一个文件名字给我们使用,不需要使用文件对象获取,相比较为简便
boolean flag=true;
if(name.toLowerCase().endsWith(".jpg")){//文件路径是否是jpg结尾
//toLowerCase将字符串全部转为小写
flag=false;
}
return flag;
}
//lambda表达式方式
sourceFile.listFiles((File dir,String name)->!name.toLowerCase().endsWith(".jpg"))
我还是比较喜欢用普通类继承的方式写书写,通俗易懂,可读性强,逻辑较强
以上就是全部的文件操作,并且能够实现文件的过滤操作