首页 > 其他分享 >文件IO

文件IO

时间:2024-07-26 18:39:23浏览次数:7  
标签:文件 IO io System File println new out

文件 、IO

1. 认识输入输出

 

2. 认识文件

操作系统角度的文件 -> 软件资源 + 硬件资源 -> 文件

此处文件指 -> 保持在硬盘上的都是文件 -> 目录文件 (文件夹) + 普通文件 (文本文件.txt 、二进制文件.exe )

 

文本文件.txt -> 文本数据, 二进制数据组成的合法字符串

 二进制文件.exe -> 就是二进制数据

如何区分 文本文件与二进制文件 -> 用记事本 (文本编辑器) 打开看看, 没乱码就是文本文件

 

3. 认识路径 

路径的用处 -> 找文件

 

绝对路径, 此电脑 (忽略) -> D:/目录1/xxx.txt  

相对路径 ->

 

4. 用 java代码操作文件

-> 针对文件系统进行操作 (创建 删除 重命名文件、创建目录)

创建文件:

查看代码

package io;

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

public class demo1 {
    public static void main(String[] args) throws IOException {

        // 指定路径创建
        //File file = new File("D:\\我的\\IDEA 项目\\test.txt");
        //File file = new File("../test.txt");

        // 当前路径下没 test.txt -> file.createNewFile() 创建 test.txt 文件
        File file = new File("./test.txt");
        // 创建 test.txt 文件
        file.createNewFile();

        System.out.println(file.getParent()); // 打印在哪个目录下
        System.out.println(file.getName()); // 打印文件名
        System.out.println(file.getPath()); // 打印相对路径
        System.out.println(file.getCanonicalPath()); // 打印绝对路径

        System.out.println(file.exists());
        System.out.println(file.isFile());
        System.out.println(file.isDirectory());
    }
}

 

删除文件:

查看代码
 package io;

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

public class demo2 {
    public static void main(String[] args) throws IOException {
        File f = new File("./test.txt");
        System.out.println(f.exists());
        if (!f.exists()) {
            f.createNewFile();
        }
        // 删除文件
        //f.delete();

        System.out.println(f.exists());
        // 进程结束的时候删除文件
        f.deleteOnExit();
        System.out.println(f.exists());

        Scanner scanner = new Scanner(System.in);
        scanner.next();
    }
}

 

文件重命名, 移动文件

查看代码
 import java.io.IOException;

public class demo4 {

    public static void main(String[] args) {
        File f1 = new File("./t2.txt");
        // 移动到 testDir 目录下
        File f2 = new File("./testDir/t2.txt");
        f1.renameTo(f2);
    }

    public static void main1(String[] args) throws IOException {
        File file1 = new File("./t1.txt");
        File file2 = new File("./t2.txt");

        if (!file1.exists()) file1.createNewFile();

        // 重命名 t1 -> t2
        file1.renameTo(file2);
        System.out.println(file1.getName());
    }
}

 

创建目录:

查看代码
 package io;

import java.io.File;

public class demo3 {
    public static void main(String[] args) {

        // 创建一级目录
        //File file = new File("./testDir");
        //file.mkdir();

        // 创建多级目录
        File file = new File("./a/b/c");
        file.mkdirs();
        System.out.println(file.exists());
        System.out.println(file.isFile());
        System.out.println(file.isDirectory());

    }
}

 

-> 针对文件内容操作 (读写文件)

以字节为单位读取:

package io;

import java.io.*;

public class demo5 {
    public static void main1(String[] args) throws IOException {
        File f = new File("d:/test.txt");

        try (InputStream inputStream = new FileInputStream(f);) {
            while (true) {
                // 一次最多读1024个字节 ( 根据byte数组长度 ), 把读到的东西放到 byte 数组中
                // n -> 读到的字节个数
                byte[] bytes = new byte[1024];
                int n = inputStream.read(bytes);
                if (n == -1) {
                    break;
                }
                for (int i = 0;i < n;i++) {
                    System.out.printf("0x%x ",bytes[i]);
                }

            }
        }
    }

    public static void main(String[] args) throws IOException {
        // 打开文件
        try (InputStream inputStream = new FileInputStream("d:/test.txt");) {
            while (true) {
                // 一次读取 1字节
                int v = inputStream.read();
                if (v == -1) {
                    break;
                }
                System.out.printf("0x%X ",v);
            }
        }
    }
}

注意打开文件后, 一定要关闭文件

 

以字节为单位写文件:

package io;

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) throws IOException {
        // 不想清空内容, 可以以追加写方式打开 -> 加参数 true
        try (OutputStream outputStream = new FileOutputStream("d:/test.txt",true)) {
            outputStream.write(100); // 一次写一个字节

        }
    }
    public static void main2(String[] args) throws IOException {
        // 以默认写操作打开文件, 会直接清空文件内容
        try (OutputStream outputStream = new FileOutputStream("d:/test.txt")) {
            outputStream.write(97); // 一次写一个字节
            outputStream.write(98);
            outputStream.write(99);
        }
    }
}

 

以字符为单位读:

package io;

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

public class demo7 {
    public static void main(String[] args) throws IOException {
        try(Reader reader = new FileReader("d:/test.txt");) {
            while (true) {
                int c = reader.read(); // 读取一个字符, 一次读2个字节
                if (-1 == c) {
                    break;
                }
                System.out.println((char) c);
            }
        }
    }
}

 

以字符为单位写:

package io;

import java.io.*;

public class demo7 {
    public static void main(String[] args) throws IOException {
        try(Writer writer = new FileWriter("d:/test.txt",true)) {
            writer.write("你好");
        }
    }
}

 

5. 3个使用案例

案例1:

扫描指定目录, 找到包含输入关键词的文件,并输出绝对路径

查看代码
 package io;

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

        // 2. 检查路径是否合法
        File rootDir = new File(rootPath);
        if (!rootDir.isDirectory()) {
            System.out.println("输入路径非法");
            return;
        }

        // 3. 输入查询关键词
        System.out.println("输入要查询的词: ");
        String keyWord = scanner.next();

        // 4. 搜索
        searchFile(rootDir,keyWord);
    }

    public static void searchFile(File rootDir,String keyWord) {
        File[] files = rootDir.listFiles();
        // 目录为空, 直接返回
        if (files == null) {
            return;
        }
        for (File file: files) {
            if (file.isFile()) {
                if (file.getName().contains(keyWord)) {
                    System.out.println("找到匹配结果: " + file.getAbsolutePath());
                }
            }else if (file.isDirectory()) {
                searchFile(file,keyWord);
            }
        }
    }
}

 

查看代码
 package io;

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

public class demo9 {

    public static void main(String[] args) {
        // 1. 输入
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入要复制的文件路径: ");
        String srcPath = scanner.next();

        File srcFile = new File(srcPath);
        if (!srcFile.isFile()) {
            System.out.println("这路径没这文件");
            return;
        }

        System.out.println("输入要复制到的目标路径: ");
        String dstPath = scanner.next();
        File dstFile = new File(dstPath);

        // 这是判断 目标目录的上级目录 是否存在
        if (!dstFile.getParentFile().isDirectory()) {
            System.out.println("输入路径非法");
            return;
        }

        // InputStream & OutputStream 没文件, 就先创建文件 -> 打开
        try (InputStream inputStream = new FileInputStream(srcFile);
            OutputStream outputStream = new FileOutputStream(dstFile)){
            while (true) {
                byte[] bytes = new byte[1024];
                int n  = inputStream.read(bytes);
                if (n == -1) {
                    return;
                }
                outputStream.write(bytes,0,n);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}

 

 

 

找出所以这个目录下, 所有包含关键词的文件

 

查看代码
 package io;

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

 

标签:文件,IO,io,System,File,println,new,out
From: https://www.cnblogs.com/qyx1/p/18320613

相关文章

  • asyncio Queue和Semaphore的结合使用
    importasyncio#假设这是你的大数据集large_data_set=range(1000000)#用1到1000000的数字模拟大数据集#任务队列task_queue=asyncio.Queue()#并发限制sem=asyncio.Semaphore(10)#任务处理函数asyncdefprocess_data(sem,q):whileTrue:#......
  • VMware Fusion Pro 虚拟机 免费了附最新版 13.5.2-23775688 下载地址
    VMwareFusionPro可以帮助用户在Mac上安装Windows、Linux等多种操作系统,最重要的是无需重启电脑切换系统,可以和MacOS系统同时运行,就类似于MacOS安装了一个应用。对于家庭用户来说足够简单,对于IT专业人员,开发人员和企业来说足够强大。VMwareFusionPro是一款强大的......
  • 常用System.Text.Json的JsonSerializerOptions配置
    newJsonSerializerOptions{PropertyNamingPolicy=JsonNamingPolicy.CamelCase,//驼峰命名规则Encoder=JavaScriptEncoder.Create(UnicodeRanges.BasicLatin,//基础拉丁文字母UnicodeRanges.CjkUnifiedIdeographs,//中日韩统一的表意文字......
  • 07 33984 Management Education and Learning B
    AssignmentRemitProgrammeTitleBusinessManagementsuiteofprogrammesModuleTitleManagementEducationandLearningBModuleCode0733984AssignmentTitleResit–Coursework2:ReflectivepieceLevelLCWeighting2......
  • Fatal error: Call to undefined function mysql_connect() in …
    错误记录:Fatalerror:Calltoundefinedfunctionmysql_connect()in…错误原因:运行环境问题解决方案:你的PHP不支持mysql_connect()函数。PHP是一种模块化的设计,除了核心的内容,其他都是可选的。之所以不支持,是因为在编译PHP时没有加入对MYSQL数据库的支持。原因2:......
  • CF932C Permutation Cycle
    题目传送门思路:个人认为构造题全靠感性理解,理解对了问题就迎刃而解了。(有点像做阅读理解)我们先感性地理解题目中所有变量和函数的含义。\(f\)函数是什么?当\(j\neq0\)时,\(f(i,j)=f(p_i,j-1)\),就是使\(j\)花费了\(1\)的代价,然后使\(i\)变为了\(p_i\)。这就......
  • 上传到 Microsoft 应用商店的 Python 应用在上传 MSIX 或 .exe 文件之前是否需要获得
    我刚刚完成了桌面应用程序的开发工作,我想开始在Microsoft应用商店上销售该应用程序。我不确定许可部分。我想实现一种解决方案,当一个人下载应用程序时,他通过商店付费,如果他在下载时没有安装它,他获得的安装文件将被锁定,只能安装在同一台计算机上。如果他尝试在另一台计算机上使......
  • 【YOLOv8改进 - 注意力机制】ContextAggregation : 上下文聚合模块,捕捉局部和全局上下
    YOLOv8目标检测创新改进与实战案例专栏专栏目录:YOLOv8有效改进系列及项目实战目录包含卷积,主干注意力,检测头等创新机制以及各种目标检测分割项目实战案例专栏链接:YOLOv8基础解析+创新改进+实战案例介绍摘要卷积神经网络(CNNs)在计算机视觉中无处不在,具有众多高效......
  • 【YOLOv8改进- 多模块融合改进】GhostConv + ContextAggregation 幽灵卷积与上下文聚
    YOLOv8目标检测创新改进与实战案例专栏专栏目录:YOLOv8有效改进系列及项目实战目录包含卷积,主干注意力,检测头等创新机制以及各种目标检测分割项目实战案例专栏链接:YOLOv8基础解析+创新改进+实战案例ContextAggregation介绍摘要卷积神经网络(CNNs)在计算机视觉中无......
  • 空间反演对称性 (Spatial Inversion Symmetry) 和非线性响应 (Non-linear Response)
    我们定义一次宇称变换(paritytransformation)为反转所有坐标:\[\mathcal{P}:\begin{pmatrix}x\\y\\z\end{pmatrix}\rightarrow\begin{pmatrix}-x\\-y\\-z\end{pmatrix}\]如果在一维世界中,宇称变换就像是透过“镜子”看这个世界;在三维世界中,则是将全部体系对于......