Java实现文件操作

简介: Java实现文件操作

一、文件概述

在计算机中,通常都需要文件系统来管理文件,文件系统中通过“树形” 组织文件和目录,文件可以分为文本文件和二进制文件,如果文件记事本打开出现乱码就是二进制文件,否则就是文本文件,常见的二进制文件有:.txt,.c,.java等;常见的文本文件有:.doc,.jpg,.class以及office系列的一些文件。

在文件系统中,文件的路径可以分为绝对路径和相对路径。

绝对路径:就是从根目录开始到文件,也就是从盘符开始的文件,例如:D:\bin\aa\c.txt

相对路径:以./或者../开头的路径,./代表当前目录,../代表父目录(上级目录),在相对路径中必须有一个基准目录,例如:./c.txt

二、常见文件操作

1、获取文件路径

getParent():获取File对象的父目录的文件路径。

getPath():返回File对象的文件路径,就是在创建File对象时指定的路径。

getAbsolutePath():返回File对象的绝对路径,该方法在返回时会将绝对路径中的./和../理解成正确路径。

getCanonicalPath():返回File对象修饰过的绝对路径。

例如:利用相对路径和绝对路径创建文件。

public static void main(String[] args) throws IOException {
        File file = new File("D:/test/test.doc");
        System.out.println(file.getParent());
        System.out.println(file.getPath());
        System.out.println(file.getAbsoluteFile());
        System.out.println(file.getCanonicalFile());
        System.out.println("____________________________");
        File file1=new File("./test.txt");
        System.out.println(file1.getParent());
        System.out.println(file.getPath());
        System.out.println(file1.getAbsoluteFile());
        System.out.println(file1.getCanonicalFile());
    }


运行结果:

2、判断文件存在以及判断类型

exists():判断File对象是否存在。

isFile():判断File对象是否为一个普通文件。

isDirectory():判断File对象是否为一个目录文件。

操作演示:

 public void static void main(String[] args){
    File file = new File("D:/test/test.doc");
    System.out.println(file.exists());
    System.out.println(file.isFile());
    System.out.println(file.isDirectory());
}

运行结果:

3、文件的创建与删除

createNewFile():会根据File对象自动地创建一个空文件。

delete():删除文件,删除成功后,返回true;

deleteOnExit():根据File对象,标注文件将会被删除,删除动作会到JVM运行结束时才会进行。也就是说在程序运行结束时才会执行删除操作。

public static void main(String[] args) throws IOException {
        File file=new File("./abc.txt");
        file.createNewFile();
        System.out.println(file.exists());
        file.delete();
        System.out.println(file.exists());
}


运行结果:

4、展示文件夹的文件

list():返回值是String[],返回的是目录文件下的所有文件名。

listFiles():返回值是File(),返回的是目录文件下的所有的文件。

public static void main(String[] args) throws IOException {
        File file=new File("d:/test");
        String[] fileNames=file.list();
        for(int i=0;i< fileNames.length;i++){
            System.out.print(fileNames[i]+" ");
        }
        System.out.println();
        File[] files=file.listFiles();
        for(int i=0;i<files.length;i++){
            System.out.print(files[i] + " ");
        }
}

5、创建文件夹

mkdir():创建单个目录文件。

mkdirs():创建多个嵌套的目录文件。

 public static void main(String[] args) throws IOException {
        File file=new File("D:/test/a");
        file.mkdir();
        System.out.println(file.getAbsolutePath());
        File file2=new File("D:/test/sa/wq/a/c");
        file.mkdirs();
        System.out.println(file2.getAbsolutePath());
}

运行结果:

三、用数据流来读取文件内容

在Java标准库中提供了一组类来进行文件操作:

字节流文件:也就是二进制文件,以字节的方式进行读写,利用InputStream和OutputStream类进行操作。

字符流文件:以字符的方式进行读取,利用Reader和Writer类进行操作。

但是上述的四个类都是抽象类,在真正实现时采用FileInputStream、FileOutputStream、FileReader和FileWriter。

1、操作字节流文件

a、读取字节流文件

需要创建一个FileinputStream流对象,利用read方法读取字符流文件时使用byte[]字节数组进行接收,最后对byte数组进行遍历输出。注意:在读取文件以及关闭文件时可能都会出现IOException,于是在try()的括号中构建实例,这样就不用在finally中关闭流对象,会自动关闭。

try(InputStream inputStream=new FileInputStream("D:\\one-question-per-day\\src\\test.txt")){
            byte[] buffer=new byte[1024];
            int len;
            while(true){
                len=inputStream.read(buffer);
                if(len==-1){
                    break;
                }
                System.out.println(Arrays.toString(buffer));
 
            }
 
        }catch (IOException e){
            e.printStackTrace();
        }

b、写字节流文件

需要创建一个FileOutputStream流对象,然后同样也是try—catch处理异常,然后利用write()方法向指定文件写入内容。

try(OutputStream outputStream=new FileOutputStream("D:\\one-question-per-day\\src\\test.txt")){
            outputStream.write(11);
            outputStream.write(90);
            outputStream.write(23);
        }catch(IOException e){
            e.printStackTrace();
        }

2、操作字符流对象

a、读取字符流文件

需要创建一个FileReader对象,再创建一个char[]型数组用于接收文件的字符,最后再对char数组进行遍历。

try(Reader reader=new FileReader("D:\\one-question-per-day\\src\\test.txt")){
            char[] chars=new char[1024];
            int len;
            while(true){
                len=reader.read(chars);
                if(len==-1){
                    break;
                }
                for(int i=0;i<len;i++){
                    System.out.println(chars[i]);
                }
 
            }
 
        }catch (IOException e){
            e.printStackTrace();
        }

b、写字符流文件

需要创建一个FileWriter对象,再用write()方法写入指定文件。

try(Writer writer=new FileWriter("D:\\one-question-per-day\\src\\test.txt")){
            writer.write(99);
            writer.write('x');
            writer.write('a');
        }catch (IOException e){
            e.printStackTrace();
        }


四、常见题目

1、扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件。

解题思路:首先输入要指定的目录文件的路径和指定字符,首先需要判断路径是否有效,接着再利用listFiles()列出目录中的文件存放到files数组中,对数组进行遍历,若是普通文件则询问删除,若是目录文件,则递归调用本身方法。

public static void deleteFile(String path,String name){
        File file=new File(path);
        if(!file.exists()){
            System.out.println("指定路径的文件不存在");
        }
        File[] files=file.listFiles();
        if(files==null){
            return;
        }
        for(File f:files){
            if(f.isDirectory()){
                deleteFile(f.getAbsolutePath(),name);
            }
            if(f.isFile()){
                if(f.getName().contains(name)){
                    System.out.println(f.getAbsolutePath()+"确认删除吗?(y/n)");
                    Scanner sc=new Scanner(System.in);
                    char option=sc.next().charAt(0);
                    if(option=='y'){
                        f.delete();
                    }else if(option!='n'){
                        System.out.println("输入有误");
                    }
                }
            }
        }
    }
 
 
    public static void main(String[] args) {
       System.out.println("请输入要检索的文件路径");
        Scanner sc=new Scanner(System.in);
        String str=sc.next();
        System.out.println("请输入要删除的文件名包含的信息");
        String str2=sc.next();
        deleteFile(str,str2);
    }

2、复制普通文件

解题思路:分别创建输入流对象和输出流对象,然后定义byte数组,对原文件进行读取,将读取的内容写入新复制的文件。

public static File copyFile(File file) throws IOException {
        if(!file.exists()){
            System.out.println("文件不存在");
        }
        File dFile=new File("dFile.txt");
        try(InputStream inputStream=new FileInputStream(file)){
            try(OutputStream outputStream=new FileOutputStream(dFile)){
                byte[] buffer=new byte[1024];
                int len=0;
                while(true){
                    len= inputStream.read(buffer);
                    if(len==-1){
                        break;
                    }
                    outputStream.write(buffer,0,len);
                }
            }
        }
        return dFile;
    }

3、扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)

解题思路:该题与第一题类似,也需要用到递归思想,本题着重在于如何确定文件内容中是否含有指定字符。可以利用StringBuilder对象,将每次读到的内容添加进去,再在StringBuilder对象中检索是否包含指定字符。

public static void scanFile(File file,String massage) throws FileNotFoundException {
        if(!file.exists()){
            System.out.println("文件不存在");
        }
        File[] files=file.listFiles();
        if(files==null){
            return;
        }
 
        for(File f:files){
            if(f.isFile()){
                if(f.getName().contains(massage)||content(f,massage)){
                    System.out.println(f.getName());
                }
            }
            if(f.isDirectory()){
                scanFile(f,massage);
            }
        }
    }
    public static boolean content(File file,String massage) throws FileNotFoundException {
        StringBuilder stringBuilder=new StringBuilder();
        try(Reader reader=new FileReader(file)) {
            char[] chars=new char[1024];
            int len=0;
            while(true){
                len=reader.read(chars);
                if(len==-1){
                    break;
                }
                stringBuilder.append(chars,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuilder.indexOf(massage)==-1;
    }

目录
相关文章
|
5月前
|
Java
揭秘Java文件操作背后的惊天秘密:读写、复制、删除一网打尽!
【6月更文挑战第27天】Java文件操作涵盖读、写、复制和删除。例如,读文件使用`BufferedReader`和`FileReader`;写文件利用`BufferedWriter`和`FileWriter`;复制文件通过读写流实现;删除文件则依赖`Files.delete()`。以上代码示例展示了具体实现。
38 5
|
5月前
|
Java API
Java文件操作,你的电脑“硬盘”竟然可以这样玩?!
【6月更文挑战第27天】Java文件操作涵盖创建、读取、写入、复制、删除等。`java.io`和`java.nio.file`包提供API,如`BufferedReader/FileReader`用于读取,`BufferedWriter/FileWriter`用于写入,`Files.copy()`用于复制,`Files.delete()`用于删除文件。以上代码示例展示了这些功能的简单用法。
38 1
|
6月前
|
Java API
Java的文件操作:创建、读写与删除的技术性详解
Java的文件操作:创建、读写与删除的技术性详解
48 1
|
5月前
|
安全 Java 开发者
掌握Java文件操作,让你的代码“飞”起来!读写、复制、删除全攻略!
【6月更文挑战第27天】Java文件操作涵盖读写、复制、删除。使用NIO的`Files`类提升效率:读取文件用`newBufferedReader`实现逐行读,写入文件用`newBufferedWriter`,复制文件用`copy`方法,删除文件用`deleteIfExists`,确保安全。这些最佳实践优化了内存使用,简化了代码。
38 0
|
2月前
|
Java
Java文件操作
本文介绍了Java中`File`类的使用方法,包括构造方法、常见成员方法及其实现功能。`File`对象可以表示文件或文件夹,支持绝对路径和相对路径。构造方法有三种:基于完整路径、父级路径与子路径组合、`File`对象与字符串组合。成员方法涵盖判断类型、获取大小、获取路径、创建与删除文件/文件夹、获取文件列表、重命名等操作。文章通过示例代码详细展示了各个方法的应用场景及注意事项。
41 1
Java文件操作
|
5月前
|
监控 Java API
Java文件操作大揭秘:不只是读写,还有这些逆天技巧!
【6月更文挑战第27天】Java文件操作不仅包括基础的读写,还有NIO的文件过滤、锁定、映射以及压缩解压和文件变化监控。例如,使用Files.walk结合PathMatcher查找特定类型的文件,利用FileChannel进行文件锁定和内存映射以提升效率,借助ZipOutputStream压缩文件,以及用WatchService监听文件系统变化。这些高级技巧能提升开发效率。
33 3
|
5月前
|
Java API
惊呆了!Java文件操作竟能如此简单:一分钟学会读写、复制、删除!
【6月更文挑战第27天】Java编程中的文件操作简单易行。使用`java.io`包中的`FileInputStream`和`FileOutputStream`进行读写,例如写文件将字符串转为字节写入,读文件则循环读取字节。文件复制涉及两个流,从源文件读取后写入目标文件。删除文件只需调用`File`对象的`delete`方法。这些基本操作让Java文件处理变得直观且易于掌握。
33 1
|
5月前
|
存储 网络协议 Java
Java I/O 详解:基础、文件操作与 NIO 实践
Java I/O 详解:基础、文件操作与 NIO 实践
54 1
|
5月前
|
存储 安全 Java
Java文件操作,让你的代码更“有型”!读写、复制、删除全解析!
【6月更文挑战第27天】在Java中进行文件操作是程序基础功能之一,涉及读写、复制和删除。使用`FileReader/FileWriter`进行文本文件的读写,如示例所示,通过`try-with-resources`保证资源释放。文件复制利用`FileInputStream/FileOutputStream`,而删除文件则依赖`File`的`delete()`方法,确保条件安全执行。这些标准库类提供了高效且健壮的文件管理能力。
38 0
|
5月前
|
安全 Java API
Java文件操作:从入门到精通,读写、复制、删除一个都不能少!
【6月更文挑战第27天】在Java编程中,学习文件操作至关重要,涵盖读写、复制和删除。入门文件读写涉及读取`example.txt`内容并追加文字;进阶文件复制展示如何使用`FileInputStream`和`FileOutputStream`从`source.txt`复制到`destination.txt`;精通文件删除则利用`File`的`delete()`方法安全删除`destination.txt`,前提检查文件存在且有权限。这些实例带你全面掌握Java文件操作基础!
39 0