Javaee文件的io操作

1)针对文件系统进行操作

创建文件,删除文件,创建目录,重命名文件

2)针对文件内容进行操作

读文件,写文件。

3)针对文件系统进行操作

创建文件,删除文件,创建目录,重命名文件。

File类出自于java.io包里面,和输入输出相关的内容,就是在这个包里。

Overview (Java Platform SE 8 )(点击可直接进入)

属性

|--------------|---------------|--------------------------|
| 修饰符及类型 | 属性 | 说明 |
| staticString | pathSeparator | 依赖于系统的路径分隔符,String 类型的表⽰ |
| staticchar | pathSeparator | 依赖于系统的路径分隔符,char类 型的表⽰ |

构造方法

|--------------------------------|-------------------------------------|
| 签名 | 说明 |
| File(Fileparent,Stringchild) | 根据⽗⽬录+孩⼦⽂件路径,创建⼀个新的File实例 |
| File(Stringpathname) | 根据⽂件路径创建⼀个新的File实例,路径可以是绝 对路径或者相对路径 |
| File(Stringparent,Stringchild) | 根据⽗⽬录+孩⼦⽂件路径,创建⼀个新的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 | canRead() | 判断⽤⼾是否对⽂件有可读权限 |
| boolean | renameTo(Filedest) | 进⾏⽂件改名,也可以视为我们平 时的剪切、粘贴操作 |
| boolean | canWrite() | 判断⽤⼾是否对⽂件有可写权限 |

上述都是涵盖了日常生活的常见方法

java 复制代码
   File f=new File("d:/text.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());

如果把d改成.

java 复制代码
 File f=new File("./text.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());

getab...是把当前的工作路径和相对路径进行简单的拼接。

java 复制代码
  File f=new File("./test.txt");
        //调用创建方法,把它搞出来
        f.createNewFile();
        System.out.println(f.exists());
        System.out.println(f.isFile());
        System.out.println(f.isDirectory());

调用创建方法把他搞出来。

创建文件啥时候会失败呢?

1)给出的路径非法。

2)权限不足

有些程序,运行的过程中,会产生"临时文件"。

就需要再进程结束之后,自动删除掉。

这样的情况就可以使用deleteOnExit的方式来实现

java 复制代码
   Scanner scanner=new Scanner(System.in);
        File f=new File("./test.txt");
        //文件删除
        f.delete();
        //把文件阻塞住
        f.deleteOnExit();
scanner.next();
        System.out.println(f.exists());

文件内容操作:

读文件,写文件,打开文件,关闭文件。

Java通过"流"这样的一组类,进行上述的文件内容操作。

stream流,操作系统本身,针对文件操作的时候,就引入了流概念。C语言中也有文件流说法,Java也是文件流说法。读文件的方式非常灵活,和接水非常类似。

在Java中,用来操作文件内容的"流"是一组类。

分成两组~~

字节流

(以字节为单位,读写数据的){二进制文件}

InputStream

OutputStream

字符流

(以字符为单位,读写数据的){文本文件}

Reader

Write

后面的用法就都基本一样,通过构造方法,打开文件,通过read/write方法来读写文件,通过close方法来关闭文件。

文件io

字节流 以字节为单位读写数据

InputStream OutputStream

字符流 以字符为单位读写数据

Reader

Writer

如果想要读字节文件,首先需要用InputSteam,

java 复制代码
InputStream inputStream=new FileInputStream("d:/test.txt")

共有三个方法:

版本一:无参数,一次读取一个字节,读取到的内容,就通过返回值来表示了

既然一次读一个字节,返回值就应该是byte.但是实际上,这里的返回值是int

1)返回int为了能够有额外的余地表示"到达末尾"-1这样的情况。

2)确保读到的数据都是正数

从原则上来说,"字节"这样的概念,本身应该是"无符号",但是byte类型本身有符号。

此处通过int类型就可以确保读出来的字节,都是正数,按照"无符号"的方式来处理了。

版本二:带有一个参数byte[]

java 复制代码
package FILE;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class Demo5 {
    public static void main(String[] args) throws RuntimeException, IOException {
//        InputStream inputStream=null;
//        try{
//            inputStream =new FileInputStream("d:/test.txt");
//        while(true){
//            int b=inputStream.read();
//            if(b==-1){
//                //读取完毕
//                break;
//            }
//            System.out.println(b);
//            byte[] bytes=new byte[1024];
//            int n=inputStream.read();
//            System.out.println("n = "+n);
//            if(n==-1){
//                //读取完毕,n就是-1.
//                break;
//            }
//            for (int i = 0; i < n; i++) {
//                System.out.println(bytes[i]);
//            }
//            System.out.println( );
//        }
//
//        }finally{
//            inputStream.close();
//        }
        try(InputStream inputSream=new FileInputStream("d:.test.txt")){
            byte[] bytes=new byte[1024];
            int n=inputSream.read(bytes);
            for (int i = 0; i < n; i++) {
                System.out.println(bytes[n]);
            }
        }
    }
}

关闭文件close

为啥要关闭文件?

如果你没关闭文件,大部分情况,肯可能感知不到,但是一旦真的遇到了问题,就是大事。

打开文件:

打开文件的时候,会在操作系统内核,pcb结构体中,给"文件描述符表"添加一个元素,这个元素就是表示,当前打开的文件相关信息。

OutputSteam

版本一:一次write一个字节,参数是int类型。

版本二:一次write若干字节,会把参数数组里所有的字节都写入文件中。

版本三:一次write若干字节,把数组从offset下标开始,连续写len个字节。

默认的写方式打开,会清空。如果使用"追加写"方式打开就可以了。

java 复制代码
package FILE;

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

public class Demo6 {
    public static void main(String[] args) {
        try(OutputStream outputStream=new FileOutputStream("d:/test.txt")){
outputStream.write(97);
outputStream.write(98);
outputStream.write(99);
outputStream.write(100);

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

如果读字符:

java 复制代码
package FILE;

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

public class Demo7 {
    public static void main(String[] args) {
        try(Reader reader=new FileReader("d:/test.txt")){
            while(true){
                int c=reader.read();
                if(c==-1){
                    break;
                }
                char ch=(char)c;
                System.out.print(ch);
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

如何写入字符:

java 复制代码
public class Demo9 {
    public static void main(String[] args) {
        try (Writer writer = new FileWriter("d:/test.txt", true)) {
            writer.write("你好世界你好世界");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

案例一:做一个查找目录和文件的小程序

java 复制代码
package FILE;

import java.io.File;
import java.util.Scanner;

public class Demo8 {
    public static void main(String[] args) {
        //1.输入必要的信息
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入查询的目录");
        String rootPath=scanner.next();
        System.out.println("请输入查询的");
        String searchWord=scanner.next();
        //2.构造File对象,检查路径是否合法
        File rootFile =new File(rootPath);
        if(!rootFile.isDirectory()){
            System.out.println("输入的路径非法");
            return;
        }
        //3.进行递归搜索.
        searchFile(rootFile,searchWord);
    }
    private static void searchFile(File rootFile,String searchWord){
        //1.先列出当前目录有哪些内容
        File [] files=rootFile.listFiles();
        if(files==null){
            //空目录返回
            return;
        }
    for (File f:files){
        if(f.isFile()){
            //普通文件,就判定文件名是否包含查询词
            String fileName=f.getName();
            if(fileName.contains(searchWord)){
                System.out.println("找到匹配结果:"+f.getAbsolutePath());

            }else if (f.isDirectory()){
                searchFile(f,searchWord);

            }
        }

    }
    }
}

案例二:做一个简单的io案例

输入一个路径,表示要被复制的文件

输入另一个文件,表示要复制到的目标文件

java 复制代码
package FILE;

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

//输入一个路径,表示要被复制的文件
//输入另一个文件,表示要复制到的目标目录
public class Demo9 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入要被复制的文件");
        String srcPath=scanner.next();
        System.out.println("请输入要复制到的目标路径");
        String destPath=scanner.next();
        //验证目录是否合法
        File srcFile=new File(srcPath);
        if(!srcFile.isFile()){
            System.out.println("输入的复制的文件路径不合法");
            return;
        }
        File destFile=new File(destPath);
        if(!destFile.isFile()){
            System.out.println("输入的要复制到的目标路径非法");
            return;
        }
        //读写文件
        try(InputStream inputStream=new FileInputStream(srcFile);
            OutputStream outputStream=new FileOutputStream(destFile)) {
            while(true){
                byte[] bytes=new byte[1024];
                int n=inputStream.read(bytes);
                if(n==-1){
                    break;
                }
                outputStream.write(bytes,0,n);

            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

如果文件不存在,就创建

1)createNewFile

2)通过OutputNewFile打开文件,也能创造文件。

通过inputStream打开文件,不会创建文件。

案例三:两种结合

输入一个路径,再输入一个查询词。

搜索这个路径中,文件内容,包含这个查询词这里的文件。

java 复制代码
package FILE;

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

//查找搜索的路径
//查找目录的内容
public class Demo10 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入要搜索的路径:");
        String path=scanner.next();
        System.out.println("请输入要查找的词");
        String searchWord=scanner.next();
        //判断路径是否合法
        File rootFile=new File(path);
        if (!rootFile.isDirectory()) {
            System.out.println("文件不合法");
            return;
        }
        search(rootFile,searchWord);
    }
    private static void search(File rootFile,String searchWord){
        File []files=rootFile.listFiles();
        if(files==null){
            //空目录,递归结束
            return;
        }
        for (File f:files){
            if(f.isFile()){
                //读取文件并搜索
                matchWord(f.searchWord);
            }else if(f.isDirectory()){
                search(f.searchWord);
            }

        }

    }
    //负责针对一个文件进行读取和判定
    private static void matchWord(File f,String searchWord){
        try(Reader reader =new FileReader(f)) {
            StringBuilder stringBuilder=new StringBuilder();
while(true){
    int c=reader.read();
    if(c==-1){
        break;

    }
    stringBuilder.append((char)c);
}
//循环结束,此时文件所有的内容,就都进入了stringBuilder了
            if(stringBuilder.indexOf(searchWord)>=0){
                System.out.println("找到了匹配结果"+f.getAbsolutePath());

            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

}
相关推荐
斌斌_____4 分钟前
Spring Boot 配置文件的加载顺序
java·spring boot·后端
路在脚下@12 分钟前
Spring如何处理循环依赖
java·后端·spring
一个不秃头的 程序员35 分钟前
代码加入SFTP JAVA ---(小白篇3)
java·python·github
丁总学Java1 小时前
--spring.profiles.active=prod
java·spring
上等猿1 小时前
集合stream
java
java1234_小锋1 小时前
MyBatis如何处理延迟加载?
java·开发语言
菠萝咕噜肉i1 小时前
MyBatis是什么?为什么有全自动ORM框架还是MyBatis比较受欢迎?
java·mybatis·框架·半自动
林的快手1 小时前
209.长度最小的子数组
java·数据结构·数据库·python·算法·leetcode
向阳12182 小时前
mybatis 缓存
java·缓存·mybatis
上等猿2 小时前
函数式编程&Lambda表达式
java