当前位置: 首页 > article >正文

Javaee文件的io操作

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

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

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

读文件,写文件。

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

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

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

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

属性

修饰符及类型属性说明
staticStringpathSeparator依赖于系统的路径分隔符,String 类型的表⽰
staticcharpathSeparator依赖于系统的路径分隔符,char类 型的表⽰

构造方法

签名说明
File(Fileparent,Stringchild)根据⽗⽬录+孩⼦⽂件路径,创建⼀个新的File实例
File(Stringpathname)根据⽂件路径创建⼀个新的File实例,路径可以是绝 对路径或者相对路径
File(Stringparent,Stringchild)根据⽗⽬录+孩⼦⽂件路径,创建⼀个新的File实 例,⽗⽬录⽤路径表⽰

方法

修饰符及返回值类型⽅法签名说明
StringgetParent()返回File对象的⽗⽬录⽂件路径
StringgetName()返回FIle对象的纯⽂件名称
StringgetPath()返回File对象的⽂件路径
StringgetAbsolutePath()返回File对象的绝对路径
StringgetCanonicalPath()返回File对象的修饰过的绝对路径
booleanexists()判断File对象描述的⽂件是否真实 存在
booleanisDirectory()判断File对象代表的⽂件是否是⼀ 个⽬录
booleanisFile()判断File对象代表的⽂件是否是⼀ 个普通⽂件
booleancreateNewFile()根据File对象,⾃动创建⼀个空⽂ 件。成功创建后返回true
booleandelete()根据File对象,删除该⽂件。成功 删除后返回true
voiddeleteOnExit()根据File对象,标注⽂件将被删 除,删除动作会到JVM运⾏结束时 才会进⾏
String[]list()返回File对象代表的⽬录下的所有 ⽂件名
File[]listFiles()返回File对象代表的⽬录下的所有 ⽂件,以File对象表⽰
booleanmkdir()创建File对象代表的⽬录
booleanmkdirs()创建File对象代表的⽬录,如果必 要,会创建中间⽬录
booleancanRead()判断⽤⼾是否对⽂件有可读权限
booleanrenameTo(Filedest)进⾏⽂件改名,也可以视为我们平 时的剪切、粘贴操作
booleancanWrite()判断⽤⼾是否对⽂件有可写权限

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

   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改成.

 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...是把当前的工作路径和相对路径进行简单的拼接。

  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的方式来实现

   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,

InputStream inputStream=new FileInputStream("d:/test.txt")

共有三个方法:

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

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

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

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

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

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

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

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个字节。

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

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);
        }
    }
}

 如果读字符:

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);
        }
    }
}

 如何写入字符:

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();
        }
    }
}

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

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案例

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

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

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打开文件,不会创建文件。

案例三:两种结合

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

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

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);
        }

    }

}


http://www.kler.cn/a/406162.html

相关文章:

  • CSS布局学习1
  • Shell编程-8
  • Wallpaper壁纸制作学习记录03
  • windows下,用CMake编译qt项目,出现错误By not providing “FindQt5.cmake“...
  • JavaWeb-表格标签-06
  • AbsPlus框架介绍2
  • 使用 PyTorch 实现并训练 VGGNet 用于 MNIST 分类
  • Frida反调试对抗系列(二)
  • pcb元器件选型与焊接测试时的一些个人经验
  • SELinux知识点
  • C++学习第四天
  • 深入了解 Spring Security 的授权核心功能
  • idea 程序打包 jar 发布
  • 前端 vue 如何区分开发环境
  • 使用php和Xunsearch提升音乐网站的歌曲搜索效果
  • vue 目录结构
  • 【Linux】进程-PCB
  • vue制作代码比较工具
  • 本地云存储 MinIO 中修改用户密码
  • Oracle-物化视图基本操作
  • Spring |(二)IoC相关内容 | bean
  • [JAVA]用MyBatis框架实现一个简单的数据查询操作
  • go版本,google-authenticator动态口令算法,二次安全校验
  • Elasticsearch面试内容整理-分析与映射
  • wsl2中kali linux下的docker使用教程(教程总结)
  • 深入实践 Shell 脚本编程:高效自动化操作指南