文件操作IO


认识文件

文件的概念

平时说的文件一般都是指存储在硬盘上的普通文件,如 txt, jpg, mp4, rar 等这些文件都可以认为是普通文件,它们都是在硬盘上存储的. 在计算机中,文件是一个广义的概念,不只是包含普通文件,还可以包含目录(文件夹)

文件的分类

文件大概可以分为两类 1.文本文件 : 里面存储的是字符,但是文本文件本质上也是存字节的. 2.二进制文件: 存储的是字节. 怎样区分文本文件和二进制文件 是记事本打开该文件,如果出现乱码,就是二进制文件,没有出现乱码就是文本文件. ps:日常中使用的.txt .c .java 都属于文本文件, .doc .ppt .exe .zip .class等等属于二进制文件

文件的存储

在计算机里,保存管理文件,是通过操作系统中的"文件系统"这样的模块来负责的,文件系统中,一般是通过"树形"结构来组织磁盘上的目录和文件的,是一颗N叉树.

文件的路径

文件的路径可以分为两种 1.相对路径 以盘符开头的 D:xxxxx test.txt 2.相对路径 以 . 或者 … 开头的 . 表示当前路径, … 表示当前路径的父目录(上级路径),相对路径,必须要有一个基准目录,相对路径就是从基准目录出发.

java文件的操作

文件系统相关的操作,指的是通过"文件资源管理器"能完成一些功能

列出目录中有哪些文件 创建文件 创建目录 删除文件 重命名文件

java中提供了一个File类,通过这个来完成上述操作.

File 概述

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() 判断用户是否对文件有可写权限

代码示例

示例1

package file;

import java.io.File;
import java.io.IOException;

public class Demo1 {
          
   
    public static void main(String[] args) throws IOException {
          
   
        File f1 = new File("d:/test.txt");
        //获取文件的父目录
        System.out.println(f1.getParent());
        //获取文件的名字
        System.out.println(f1.getName());
        //获取文件的路径
        System.out.println(f1.getPath());
        //获取文件的绝对路径
        System.out.println(f1.getAbsolutePath());
        //获取文件修饰过的绝对路径
        System.out.println(f1.getCanonicalPath());
        System.out.println("-------------------------");
        File f2 = new File("./test.txt");
        //获取文件的父目录
        System.out.println(f2.getParent());
        //获取文件的名字
        System.out.println(f2.getName());
        //获取文件的路径
        System.out.println(f2.getPath());
        //获取文件的绝对路径
        System.out.println(f2.getAbsolutePath());
        //获取文件修饰过的绝对路径
        System.out.println(f2.getCanonicalPath());
    }
}

运行结果

d:
test.txt
d:	est.txt
d:	est.txt
D:	est.txt
-------------------------
.
test.txt
.	est.txt
D:BianChengjavaProgramJavaEEjavaEE.	est.txt
D:BianChengjavaProgramJavaEEjavaEE	est.txt

示例2

普通文件的创建删除

package file;

import java.io.File;
import java.io.IOException;

//文件创建于删除
public class Demo2 {
          
   
    public static void main(String[] args) throws IOException {
          
   
        File f1 = new File("test.txt");
        //判断文件是否存在
        System.out.println(f1.exists());
        //查看文件目录
        System.out.println(f1.isDirectory());
        //判断文件是否为普通文件
        System.out.println(f1.isFile());
        //创建文件
        System.out.println(f1.createNewFile());
        //判断文件是否存在
        System.out.println(f1.exists());
        //查看文件目录
        System.out.println(f1.isDirectory());
        //判断文件是否为普通文件
        System.out.println(f1.isFile());
    }
}

运行结果

false
false
false
true
true
false
true

示例3

普通文件的删除

package file;

import java.io.File;
//普通文件的删除
public class Demo3 {
          
   
    public static void main(String[] args) {
          
   
        File f1 = new File("test.txt");
        System.out.println(f1.exists());
        System.out.println(f1.delete());
        System.out.println(f1.exists());
    }
}

运行结果

true
true
false

示例4

运行结束时删除

package file;

import java.io.File;
import java.io.IOException;

public class Demo4 {
          
   
    public static void main(String[] args) throws IOException {
          
   
        File f1 = new File("test.txt");
        System.out.println(f1.exists());
        System.out.println(f1.createNewFile());
        System.out.println(f1.exists());
        f1.deleteOnExit();
        System.out.println(f1.exists());
    }
}

运行结果

false
true
true
true

示例5

创建单个目录

package file;

import java.io.File;
import java.lang.reflect.Field;

//创建单个目录
public class Demo5 {
          
   
    public static void main(String[] args) {
          
   
        File f1 = new File("aaa");
        System.out.println(f1.isDirectory());
        System.out.println(f1.isFile());
        System.out.println(f1.mkdir());
        System.out.println(f1.isDirectory());
        System.out.println(f1.isFile());
    }
}

运行结果

false
false
true
true
false

示例6

创建多层目录

package file;

import java.io.File;

public class Demo6 {
          
   
    public static void main(String[] args) {
          
   
        File dir = new File("aaa/bbb");
        System.out.println(dir.isDirectory());
        System.out.println(dir.isFile());
        System.out.println(dir.mkdirs());
        System.out.println(dir.isDirectory());
        System.out.println(dir.isFile());
    }
}

运行结果

false
false
true
true
false

示例7

文件重命名

package file;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;

public class Demo7 {
          
   
    public static void main(String[] args) throws IOException {
          
   
        File f1 = new File("test.txt");
        File f2 = new File("dest.txt");
        f1.createNewFile();
        System.out.println(f1.exists());
        System.out.println(f2.exists());
        System.out.println(f1.renameTo(f2));
        System.out.println(f1.exists());
        System.out.println(f2.exists());
    }
}

运行结果

true
false
true
false
true

文件内容的读写

代码示例

示例1

一次读取一个字节

package file;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Demo8 {
          
   
    public static void main(String[] args) {
          
   
        try(InputStream inputStream = new FileInputStream("test.txt")){
          
   
            int b;
            while (( b = inputStream.read()) != -1){
          
   
                System.out.println(b);
            }
        }catch (IOException e){
          
   
            e.printStackTrace();
        }
    }
}

运行结果

104
101
108
108
111

一次读取N个字节

package file;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Demo8 {
          
   
    public static void main(String[] args) {
          
   
        try(InputStream inputStream = new FileInputStream("test.txt")){
          
   
            //一次读取若干个字节
            while (true){
          
   
                byte[] bytes = new byte[1024];
                int len = inputStream.read(bytes);
                if(len == 1){
          
   
                    break;
                }
                for(int i = 0; i < len; i++){
          
   
                    System.out.println(bytes[i]);
                }
            }
        }catch (IOException e){
          
   
            e.printStackTrace();
        }
    }
}

运行结果

104
101
108
108
111

示例2

写操作

package file;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class Demo9 {
          
   
    public static void main(String[] args) {
          
   
        try(OutputStream outputStream = new FileOutputStream("test.txt")){
          
   
            byte[] bytes = new byte[26];
            for(int i = 0; i < 26; i++){
          
   
                outputStream.write(97+i);
            }
        }catch (IOException e){
          
   
            e.printStackTrace();
        }
    }
}

运行结果

test.txt 中的内容 abcdefghijklmnopqrstuvwxyz

示例3

按照字符来读

package file;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class Demo10 {
          
   
    public static void main(String[] args) {
          
   
        try(Reader reader = new FileReader("test.txt")){
          
   
            //按照字符来找
            while (true){
          
   
                char[] buffer = new char[1024];
                int len = reader.read(buffer);
                if(len == -1){
          
   
                    break;
                }
                System.out.println(new String(buffer,0,len));
            }
        }catch (IOException e){
          
   
            e.printStackTrace();
        }
    }
}

运行结果

abcdefghijklmnopqrstuvwxyz

示例4

按照字符来写

package file;

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Demo11 {
          
   
    public static void main(String[] args) {
          
   
        //FileWriter第二个参数true代表在源文件中追加写,如果没写或者为false代表覆盖写
        try(Writer writer = new FileWriter("test.txt",true)){
          
   
            writer.write("abc");
        }catch (IOException e){
          
   
            e.printStackTrace();
        }
    }
}

运行结果

abcdefghijklmnopqrstuvwxyzabc

小程序练习

示例1

删除文件夹中的指定文件

package file;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Demo12 {
          
   
    public static void main(String[] args) throws IOException {
          
   
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要扫描的根目录(绝对路径 or 相对路径): ");
        String rootDirPath = scanner.next();

        File rootDir = new File(rootDirPath);
        if(!rootDir.isDirectory()){
          
   
            System.out.println("输入的根目录错误或者不存在此根目录:");
            return;
        }
        System.out.println("请输入要找出的文件名中的字符");
        String token = scanner.next();
        List<File> ans = new ArrayList<>();
        scanDir(rootDir,token,ans);
        System.out.println("共找到了符合添加文件 " + ans.size() + "它们分别是");
        for(File file : ans){
          
   
            System.out.println(file.getCanonicalPath() + "请问您是否要删除该文件? Y/N");
            String in = scanner.next();
            if(in.toLowerCase().equals("y")){
          
   
                file.delete();
                System.out.println("删除成功");
            }
        }
    }

    private static void scanDir(File rootDir, String token, List<File> ans) {
          
   
        File[] files = rootDir.listFiles();
        if(files == null || files.length == 0){
          
   
            return;
        }
        for (File file : files){
          
   
            if(file.isDirectory()){
          
   
                scanDir(file,token,ans);
            }else {
          
   
                if(file.getName().equals(token)) {
          
   
                    ans.add(file.getAbsoluteFile());
                }
            }
        }
    }
}

运行结果

请输入要扫描的根目录(绝对路径 or 相对路径): 
D:	mp
请输入要找出的文件名中的字符
test.txt
共找到了符合添加文件 1它们分别是
D:	mp	est.txt请问您是否要删除该文件? Y/N
y
删除成功

示例2

拷贝文件

package file;

import java.io.*;
import java.util.Scanner;

public class Demo13 {
          
   
    public static void main(String[] args) {
          
   
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要拷贝的源路径:");
        String src = scanner.next();
        System.out.println("请输入要拷贝的目标路径:");
        String dest = scanner.next();
        File file = new File(src);
        if(!file.isFile()){
          
   
            System.out.println("文件不存在");
            return;
        }

        try(InputStream inputStream = new FileInputStream(src)){
          
   
            try(OutputStream outputStream = new FileOutputStream(dest,true)){
          
   
                byte[] bytes = new byte[1024];
                while(true){
          
   
                    int len = inputStream.read(bytes);
                    if(len == -1) break;
                    outputStream.write(bytes,0,len);
                }
            }

        }catch (IOException e){
          
   
            e.printStackTrace();
        }
    }
}

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/290328.html

(0)
上一篇 2022年10月2日
下一篇 2022年10月2日

相关推荐

发表回复

登录后才能评论