1.
File类
Java.io.File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找、删除等操作
File中的静态成员变量
pathSeparator与系统有关的路径分隔符 File.pathSeparator 代表路径分隔符 windows:用分号表示 linux:冒号
separator与系统默认的名称分隔符 File. separator 文件名称分隔符 widows:反斜杠\ Linux:正斜杠/
绝对路径:是一个完整的路径,以盘符开始的路径 例如“C:\\Users\\itcas\\shds.txt”
相对路径:是一个简化的路径,相对于当前项目的根目录,如果使用当前目录的根目录,路径可以简化书写:
C:\\Users\\itcas\\shds.txt 简化为:123.txt(可以省略项目的根目录)
注意:1:路径中是不区分大小写的
2:路径中的文件名称分隔符windows使用反斜杠,反斜杠是转义字符,两个反斜杠代表一个普通泛斜杠
2.
File中的构造方法:
第一个:
File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新的File实例
路径可以是以文件名结尾,也可以一是以文件夹结尾
路径可以是相对路径,也可以是绝对路径
路径可以存在也可以是不存在,创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况
第二个:
File(String parent,String child) 根据parent路径名字和字符串和child路径名字创建一个新File实例
参数:
String parent父路径
String child子路径
好处:父路径和子路径,可以单独书写,使用起来非常灵活,父路径和子路径都可以变化
第三个:
File(File parent,String child) 根据parent路径名字和字符串和child路径名字创建一个新File实例
参数:
File parent父路径
String child子路径
好处:父路径和子路径,可以单独书写,使用起来非常灵活,父路径和子路径都可以变化
父路径是File类型,可以使用File的方法对路径进行一些操作,在使用路径创建对象
3.
File类常用的方法:
获取的方法:
getAbsolutePath() 返回此File的绝对路径名字符串
getPath() 将此File转换为路径名字符串
getName() 返回次File表示的文件或目录的名称
length()返回次File表示的文件的长度
判断功能的方法:
public boolean exixts() 此file表示的文件或目录是否实际存在
isDiretory() 此file表示的是否为目录
isFile() 此file表示的是否为文件
创建,删除功能的方法:
public boolean createNewFile() 当且仅当具有该名称的文件上不存在时,创建一个新的空文件(不能创建文件夹)
delete() 删除由此File表示的文件或目录(文件夹)
mkdir()创建此file的表示的目录,创建单级文件夹
mkdirs()创建由此file表示的目录,包括任何必须但不存在的父目录 创建多级文件夹
遍历(文件夹)目录功能:
Public String [] list(); 返回一个String数组,表示该File目录中的所有子文件或目录
Public File [] listFiles() 返回一个File数组,表示该File目录中的所有的子文件或目录
注意:list方法 和listFiles方法遍历的是构造方法中给出的目录,如果构造方法中给出的目录的路径不存在,会抛出空指针异常,如果构造方法中给出的路径不是一个目录,也会抛出空指针异常
3.
递归
递归:指当前在方法内调用自己的这种想象,递归分类:直接递归、间接递归
直接递归:称为方法自身调用自己
间接递归:可以A方法调用B方法,B方法调用C方法,C方法调用A方法
注意事项:
1递归一定要有条件限定,保证递归能够停下来,否则会发生栈内存溢出
2在递归中虽然有限定条件,但是递归次数不能太多,否则也会发生栈内存溢出
3构造方法禁止递归
文件过滤器:
Java.ioFileFilter是一个接口,是File的过滤器,该接口的对象可以传递给listFiles(FileFilter)作为参数,接口中只有一个方法 Boolean accept(File name):
我们可以使用过滤器来实现优化:
在File类中有两个和listFiles重载的方法,方法参数传递的就是过滤器
File[] listFiles(FileFilter filter) java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器
作用:用于过滤文件(File对象)
抽象方法:用于过文件的方法 boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径列表中
参数:File pathname:使用ListFiles方法遍历目录,得到的每一个文件对象
File[] listFiles(FilenameFilter filter) java.io.FileFilter接口;实现此接口的类实例可用于过滤文件名
作用:用于过滤抽象名称
抽象方法:用于过滤抽象文件的方法 boolean accept(File dir,String name) 测试指定文件夹是否应该包含在某一文件列表中
参数:File dir:构造方法中传递的被遍历的目录
String name:使用listFiles方法遍历的目录,获取的每一个文件或文件夹的名称
注意:两个过滤器接口是没有实现类的,需要我们写实现类,重写过滤的规则
使用Lamdba表达式优化匿名内部类(接口中只有一个抽象方法)
//使用Lamdba表达式优化匿名内部类
File[] file=dir.listFiles((File pathname)->{
//过滤规则
return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
});
//使用Lamdba表达式优化匿名内部类(接口中只有一个抽象方法)
File[] file=dir.listFiles((File d, String name)->{
return new File(d,name).isDirectory() || name.toLowerCase().endsWith(".java");
// File(dir,name).isDirectory()根据目录组合成文件对象
});
4.
硬盘永久存储,硬盘中存储的数据都是字节、内存:临时存储
IO概述
I:input(输入) 读取
O:output(输出) 写入
流:数据(字符、字节) 1个字符=2个字节=8个二进制位
输入:是把硬盘中的数据读取到内存中使用
输出:把内存中的数据写入到硬盘中保存
根据数据分为:字符流、字节流
字节流: 字节输入流:InputStream 字节输出流:OutputStream
字符流: 字符输入流:Read 字符输出流:Writer
字节流:
一切皆为字节:
一切文件数据(文本、图像、视频)在存储时,都是以二进制的形式保存的,都是一个字节,那么传输时一样如此,所以字节流可以传输任意文件数据,在操作流的时候,我们要时刻明确,无论使用什么流的对象,底层传输的始终为二进制数据
字节输出流OutputStream
Java.io.OutputStream此抽象类是表示所有输出流所有类的超类(父类)将指定的字节信息写出到目的地
方法:
close() 关闭此输出流并释放此流有关的所有系统资源
flush() 刷新次输出流并强制写出所有缓冲的输出字节
write() 有3个 将数据写入到硬盘中
write(byte[] b)将b.length个字节从指定的byte数组写入此输出流
public void' write(byte[] b):将b.length字节从指定的字节数组写入此输出流
如果写的第一个字节是正数(0-127),那么显示的时候会查询ASCII表
如果写的第一个字节是负数,那第一个字节会和第二个字节组成一个中文显示,查询系统默认码表(GBK)
write(byte[] b,int off,int len ) 将指定的字节数组写入len个字节,从偏移量off开始输出到此的输出流
public void write(byte [] b,int off,int len):把字节数组的一部分写入到文件中
int off:数组的开始索引
int len:写几个字节
指定的字节数组写入len字节,从偏移量off开始输出到此输出流
write(int b)将指定的字节输出流 写一个字节
/*
写入字符方法:可以使用String类中的方法把字符串,转换为字节数组
byte[] getByte() 把字符串转换为字节数组
*/
byte[] byte2="你好".getBytes();
System.out.println(Arrays.toString(byte2));//[-28, -67, -96, -27, -91, -67] 编码格式UTF-8里边3个字节是一个中文,JDK中2个字节是一个中文
fos.write(byte2);
直接已知子类:ByteArrayOutputStream、FileOutputStream、FilterOutputStream ObjectOutputStream、OutputStream、PipeOutputStream
FileOutputStream文件字节输出流 作用:把内存中的数据写入到文件中
构造方法:
FileOutputStream(String name)创建一个向具有指定名称的文件中写入数据的输出文件流
FileOutputStream(File file)创建一个向指定File对象表示的文件中写入数据的文件输出流
参数:写入数据的目的地
String name:目的地是一个文件的路径
File file :目的地是一个文件
构造方法作用:
创建一个FileOutputStream对象
会根据构造方法中传递的文件/文件路径,创建一个空的文件
会把FileOutputStream对象指向创建好的文件
写入数据的原理:(内存-硬盘)
Java程序—>JVMàOS(操作系统)àOS(自己方法)调用写数据的方法à把数据写入到文件中
字节输出流的使用步骤:
创建一个FileOutputStream对象,构造方法中传递写入数据的目的地
调用FileOutputStream对象中的write方法把数据写入到文件中
释放资源(流使用会占用硬顶的内存,使用完毕要把内存清空,提高程序的效率)
fos.write(97);//在写入数据的时候,会把10进制整数97,转换为二进制整数
硬盘中存储的数据都是字节
任意的文本编辑器(记事本)再打开文件的时候,都会查询编码表,把字节转换为字符表示
0-127查询ASCII表
其他值查看系统默认码表(中文系统GBK)
/*
写入字符方法:可以使用String类中的方法把字符串,转换为字节数组
byte[] getByte() 把字符串转换为字节数组
*/
byte[] byte2="你好".getBytes();
System.out.println(Arrays.toString(byte2));//[-28, -67, -96, -27, -91, -67] 编码格式UTF-8里边3个字节是一个中文,JDK中2个字节是一个中文
fos.write(byte2);
追加写/续写
FileOutputStream(String name,boolean append)创建一个向具有指定name的文件夹中写入数据的的输出文件流
FileOutputStream(File file,boolean append)创建一个向指定File对象表示的文件中写入数据的文件输出流
参数:
String name,File file:写入数据的目的地
boolean append:追加写开关 true:创建的对象不会覆盖原文件,继续在文件的末尾追加写数据 false创建一个新文件,覆盖源文件
换行符号:
Windows:\r\n
Linus:/n
Mac:/r
5.
字节输入流:InputStream
Java.io.InputStream抽象类表示字节输入流的所有类的父类,它定义了字节输入流的基本共性方法
public void close() 关闭此输入流并释放与此流相关联的任何系统资源
public abstract int read()从输入流读取数据的下一个字节
public int read(byte[] b)从输入流中读取一些字节,并将他们存储到字节数组b中
直接已知子类:AudioInputStream(读取音频)、ByteArrayInputStream(读取数组)、FileInputStream(读取文件)、FilterInputStream(过滤器的)、InputStream、ObjectInputStream(读取对象)、PipedInputStream(管道流)、SequenceInputStream(队列的)、StringBufferInputStream(字符串缓冲区)
FileInputStream():文件字节输入流
作用:把硬盘文件的数据,读取到内存中使用
构造方法:
FileInputStream(String name)
FileInputStream(File file)
参数:读取文件的数据源
String name:文件的路径
File file:文件
构造方法的作用:
会创建一个FileInputStream对象
会把FileInputStream对象指定的构造方法中要读取的文件