目录
前言
在上篇博客,我们学习了多线程,接下来就要学一些文件的操作!!!
文件
狭义上的文件
存储在硬盘上的数据,以“文件”为单位,进行组织,常见的就是普通文件(文本文件、图片、视频、音频等)
硬盘的特点:
1、硬盘存储空间大,内存存储空间小;
2、硬盘访问速度慢,内存访问速度快;
3、硬盘的成本比较低,内存成本比较高;
4、硬盘上的数据断电不会丢失,内存数据断电会丢失
广义上的文件
操作系统,是要负责管理软硬件资源,操作系统往往会把这些资源都统一的抽象成“文件”来进行管理
File类
IO输入输出
File(String pathname)根据文件路径创建一个新的File实例,路径可以是绝对路径或者相对路径
修饰符及返回值类型 | 方法签名 | 说明 |
String |
getParent()
|
返回
File
对象的父目录文件路径
|
String |
getName()
|
返回
FIle
对象的纯文件名称
|
String |
getPath()
|
返回
File
对象的文件路径
|
String |
getAbsolutePath()
|
返回
File
对象的绝对路径
|
String |
getCanonicalPath()
|
返回
File
对象的修饰过的绝对路径
|
boolean |
exists()
|
判断
File
对象描述的文件是否真实存在
|
boolean |
isDirectory()
|
判断
File
对象代表的文件是否是一个目录
|
boolean |
isFile()
|
判断
File
对象代表的文件是否是一个普通文件
|
boolean |
createNewFile()
|
根据
File
对象,自动创建一个空文件。成功创建后返 回 true
|
boolean |
delete()
|
根据
File
对象,删除该文件。成功删除后返回
true
|
void |
deleteOnExit()
|
根据
File
对象,标注文件将被删除,删除动作会到 JVM 运行结束时才会进行
|
String[ ] |
list()
|
返回
File
对象代表的目录下的所有文件名
|
File[ ] |
listFiles()
|
返回
File
对象代表的目录下的所有文件,以
File
对象表示
|
boolean |
mkdir()
|
创建
File
对象代表的目录
|
boolean |
mkdirs()
|
创建
File
对象代表的目录,如果必要,会创建中间目录
|
boolean |
renameTo(File dest)
|
进行文件改名,也可以视为我们平时的剪切、粘贴操作
|
boolean | canRead() |
判断用户是否对文件有可读权限
|
boolean | canWrite() |
判断用户是否对文件有可写权限
|
public static void main(String[] args) throws IOException {
File f=new File("D:/do.txt");
System.out.println(f.getParent());
System.out.println(f.getName());
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());
System.out.println(f.getCanonicalPath());
}
普通文件的创建删除
public static void main(String[] args) throws IOException {
File f=new File("./test.txt");
//判定存在
System.out.println(f.exists());
//判定是否是目录
System.out.println(f.isDirectory());
//判定文件是否存在
System.out.println(f.isFile());
//创建文件
System.out.println(f.createNewFile());
System.out.println(f.exists());
}
public static void main(String[] args) {
//删除文件
File f=new File("./test.txt");
System.out.println(f.delete());
//进程退出时删除文件
f.deleteOnExit();
}
创建目录
public static void main(String[] args) {
//创建目录
File f=new File("./testDir");
f.mkdir();
//创建多级目录
f.mkdirs();
}
重命名
public static void main(String[] args) {
//重命名
File srcFile=new File("aaa.txt");
File destFile=new File("bbb.txt");
srcFile.renameTo(destFile);
}
文件内容的读写
字节流(以字节为单位)适用于二进制文件
InputSream
public static void main(String[] args) throws IOException {
InputStream inputStream=new FileInputStream("./bbb.txt");
while (true){
int b=inputStream.read();
if (b==-1){
break;
}
System.out.println(b);
}
inputStream.close();
}
OutputSream
public static void main(String[] args) throws IOException {
OutputStream outputStream=new FileOutputStream("./bbb.txt");
outputStream.write(97);
outputStream.write(98);
outputStream.write(99);
outputStream.close();
}
使用OutputStream写文件的时候,只要打开文件成功,就会把文件原有内容清空
字符流(以字符为基本单位)适用于文本文件
Reader
public static void main(String[] args) throws IOException {
Reader reader=new FileReader("./bbb.txt");
while (true){
int ret=reader.read();
if (ret==-1){
break;
}
char ch=(char) ret;
System.out.println(ch);
}
reader.close();
}
Writer
public static void main(String[] args) throws IOException {
Writer writer=new FileWriter("./bbb.txt");
writer.write(97);
writer.close();
}
使用Scanner来读取文本文件内容
public static void main(String[] args) throws IOException {
InputStream inputStream=new FileInputStream("./bbb.txt");
Scanner scanner=new Scanner(inputStream);
while (scanner.hasNext()){
System.out.println(scanner.next());
}
inputStream.close();
}
使用PrintWriter来写文本文件内容
public static void main(String[] args) throws IOException {
OutputStream outputStream=null;
try {
outputStream=new FileOutputStream("./bbb.txt");
PrintWriter writer=new PrintWriter(outputStream);
writer.println();
writer.printf("a=%d\n",10);
}finally {
outputStream.close();
}
}
示例
扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件
1、先让用户输入:要扫描的路径+要查找的词
2、遍历目录,找到名字匹配的文件
3、询问用户是否删除
public static void main(String[] args) throws IOException {
//1.让用户输入了必要的信息
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要扫描的路径:");
File rootDir=new File(scanner.next());
if (!rootDir.isDirectory()){
System.out.println("您输入的目录不存在!");
return;
}
System.out.println("请输入要搜索的关键词:");
String toDelete=scanner.next();
//2.遍历目录
scanDir(rootDir,toDelete);
}
private static void scanDir(File rootDir,String toDelete) throws IOException {
System.out.println("当前访问"+rootDir.getCanonicalPath());
File[] files=rootDir.listFiles();
if(files==null){
//说明rootDir是一个空的目录
return;
}
//如果目录非空,循环遍历每个元素
for (File f:files){
if (f.isDirectory()){
scanDir(f,toDelete);
}else {
//不是目录,是普通文件,判定文件名是否符合要求,是否要进行删除
checkDelete(f,toDelete);
}
}
}
private static void checkDelete(File f, String toDelete) throws IOException {
if (f.getName().contains(toDelete)){
System.out.println("该单词"+toDelete+"被"+f.getCanonicalPath()+"包含了,是否删除?(Y/N)");
Scanner scanner=new Scanner(System.in);
String choice=scanner.next();
if (choice.equals("Y")||choice.equals("y")){
f.delete();
}
}
}
文件的复制
public static void main(String[] args) {
//输入源文件和目标文件
Scanner scanner=new Scanner(System.in);
System.out.println("请输入源文件:");
File srcFile=new File(scanner.next());
System.out.println("请输入目标文件:");
File destFile=new File(scanner.next());
if (!srcFile.isFile()){
System.out.println("输入的源文件有误!");
return;
}
if (!destFile.getParentFile().isDirectory()){
System.out.println("输入的目标文件有误!");
return;
}
//打开源文件,按照字节读取内容,依次写入到目标文件中
try (InputStream inputStream=new FileInputStream(srcFile);
OutputStream outputStream=new FileOutputStream(destFile)){
//读src的每个字节,写到dest中
while (true){
int ret=inputStream.read();
if (ret==-1){
break;
}
outputStream.write(ret);
}
}catch (IOException e) {
e.printStackTrace();
}
}
扫描指定目录,并找到名称中或者内容包含指定字符的所有普通文件(不包含目录)
public static void main(String[] args) throws IOException {
//1.输入路径和要查找的关键词
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要扫描的路径:");
File rootDir=new File(scanner.next());
if (!rootDir.isDirectory()){
System.out.println("您输入的目录不存在!");
return;
}
System.out.println("请输入要搜索的关键词:");
String toFind=scanner.next();
scanDir(rootDir,toFind);
}
private static void scanDir(File rootDir, String toFind) throws IOException {
File[] files=rootDir.listFiles();
if(files==null){
//说明rootDir是一个空的目录
return;
}
//如果目录非空,循环遍历每个元素
for (File f:files){
if (f.isDirectory()){
scanDir(f,toFind);
}else {
//不是目录,是普通文件,判定文件名是否符合要求,是否要进行删除
checkDelete(f,toFind);
}
}
}
private static void checkDelete(File f, String toFind) throws IOException {
//1.先检查文件名
if (f.getName().contains(toFind)){
System.out.println(f.getCanonicalPath()+"文件中包含了"+toFind);
Scanner scanner=new Scanner(System.in);
String choice=scanner.next();
if (choice.equals("Y")||choice.equals("y")){
f.delete();
}
}
//2.在检查文件内容
try (InputStream inputStream=new FileInputStream(f)){
StringBuilder stringBuilder=new StringBuilder();
Scanner scanner=new Scanner(inputStream);
while (scanner.hasNextLine()){
stringBuilder.append(scanner.nextLine()+"\n");
}
if (stringBuilder.indexOf(toFind)>-1){
System.out.println(f.getCanonicalPath()+"文件内容包含"+toFind);
}
}
}