【文件操作和IO】

news2024/12/26 10:37:42

文件操作和IO

  • 1.文件
  • 2. 硬盘上文件的目录结构
  • 3. 文件路径
  • 4. 文件重要分类:
  • 5. Java中操作文件
    • 5.1 Java对于文件操作的API
    • 5.2 Java中使用File类来进行文件操作
    • 5.3 File类属性
    • 5.4 构造方法
    • 5.5 方法:
  • 6. 文件内容的读写 -- 文件流(数据流)
    • 6.1 InputStream
    • 6.2 使用InputStream读文件
    • 6.3 使用OutputStream写文件
  • 7. Reader和Writer字符流
    • 7.1 Reader读文件
    • 7.2 Writer写文件
  • 8. 使用Scanner接收intputStream

1.文件

文件指的是 存储在硬盘上的文件。文件除了有数据内容之外,还有一部分信息,例如文件名、文件类型、文件大小等并不作为文件的数据而存在,这部分信息可以视为文件的元信息。

2. 硬盘上文件的目录结构

硬盘上文件的目录结构为树形结构

3. 文件路径

  1. 绝对路径:指的就是从树根节点出发(Windows是盘符)一层一层最终到达目标文件
  2. 相对路径:先指定一个 当前目录、工作目录、基准目录,从当前目录出发,找到目标文件。

4. 文件重要分类:

  • 文本文件 :是按照 文本/字符串 方式来理解文本内容(文件里面的二进制内容,都是表示的字符串),进一步可以认为二进制文件的内容都是合法的字符(如普通英文字母、使用ascii汉字、使用gbk/utf8)。
  • 二进制文件:这里的内容任何数据都可以(图片、音频、可执行程序、动态库都属于二进制文件.class也是二进制)。
  • 用记事本的方式来判定是文本文件还是二进制文件;使用记事本打开一个文件,如果看到的是正常内容,不是乱码,说明这是文本文件,乱码则是二进制文件

5. Java中操作文件

5.1 Java对于文件操作的API

  1. 针对文件系统的操作,创建文件、删除文件、重命名文件、列出目录内容等
  2. 针对文件内容的操作:读文件和写文件

5.2 Java中使用File类来进行文件操作

File类所在包 为java.io。这里的io即输入input和输入output,数据从硬盘到cpu为输入,反之则输出。

5.3 File类属性

  • static String(修饰符及类型) – pathSeparator :依赖于系统的路径分隔符,String类型的表示;
  • static char – pathSeparator :依赖于系统的路径分隔符,char类型

5.4 构造方法

  • File(File parent, String child):根据父目录 + 孩子文件路径,创建一个新的 File 实例
  • File(String pathname) :根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者
    相对路径
  • File(String parent, String child) :根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示

5.5 方法:

  • 获取路径、文件名、绝对路径
    如下代码:
// File 常见的方法
import java.io.File;
import java.io.IOException;

public class IODemo1 {
    public static void main(String[] args) throws IOException {
        //File f = new File("E:/user/1/test.txt");
        File f = new File("./test.txt");
        // 返回 File 对象的父目录文件路径
        System.out.println(f.getParent());
        // 返回 FIle 对象的纯文件名称
        System.out.println(f.getName());
        //返回 File 对象的文件路径
        System.out.println(f.getPath());
        // 返回 File 对象的绝对路径
        System.out.println(f.getAbsolutePath());
        //返回 File 对象的修饰过的绝对路径
        System.out.println(f.getCanonicalPath());
    }
}
  • 创建文件、查看文件是否存在、是否是文件、是否是目录
import java.io.File;
import java.io.IOException;

public class IODemo2 {
    public static void main(String[] args) throws IOException {
        File f = new File("./test.txt");
        System.out.println(f.exists());
        System.out.println(f.isFile());
        System.out.println(f.isDirectory());

        // 创建文件,创建完之后不会重复创建,
        boolean ret = f.createNewFile();
        System.out.println("ret = "+ret);
    }
}

  • 删除文件
import java.io.File;

public class IODemo3 {
    public static void main(String[] args) throws InterruptedException {
        File file = new File("./test.txt");
        // 删除文件
        //boolean ret = file.delete();
        //System.out.println(ret);

        // 根据File对象,标注文件将被删除,删除动作会到JVM运行结束时才会进行
        file.deleteOnExit();
        Thread.sleep(5000);
    }
}
  • 获取目录下所有文件名
import java.io.File;
import java.util.Arrays;

public class IODemo4 {
    public static void main(String[] args) {
        File file = new File(".");
        // 返回File对象代表的目录下的所有文件名
        //String[] files = file.list();

        // 返回File对象代表的目录下的所有文件,以File对象表示
        File[] files = file.listFiles();
        //System.out.println(files);  // 打印的是哈希值,不是地址
        System.out.println(Arrays.toString(files));
    }
}
  • 创建目录(多层目录)
import java.io.File;

public class IODemo5 {
    public static void main(String[] args) {
        File file = new File("./aaa/bbb/ccc");
        // 创建单个目录
        //boolean ret = file.mkdir();

        boolean ret = file.mkdirs();
        System.out.println(ret);
    }
}
  • 重命名
import java.io.File;

public class IODemo6 {
    public static void main(String[] args) {
        File src = new File("./test2.txt");
        File dest = new File("./aaa/test2.txt");
        // 重命名 还可以移动文件
        System.out.println(src.renameTo(dest));
    }
}

6. 文件内容的读写 – 文件流(数据流)

  • 字节流:每次读写的最小单位就是一个字符。 InputStream和OutputStream
  • 字符流:每次读写的最小单位是一个字符(一个字符可能由多个字节构成)。字符流可以内部处理字符编码。Reader 和 Writer。

6.1 InputStream

由于inputStream 是抽象类,不能实例化。所以new的是一个 FileInputStream。
在这里插入图片描述
在这里插入图片描述

inputStream 是抽象类,不能实例化。有些类我们不希望它能够创建出实例的,使用abstract来描述,编译器就可以进行更严格的检查(如单例模式,数据库约束)所谓 面向对象 就是通过代码抽象的表示实际事物的一种方式

  • read()方法:返回类型为int,读取一个字节的数据,返回-1代表读完了。

  • read(byte[] b) :最多读取 b.length 字节的数据到 b 中,返回实际读到的数量;-1 代表已经读完了

  • read(byte[] b,int off, int len):最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量;-1 代表以及读完了
    read的参数版本,传入的字节数参数,是一个输出型参数,byte[]是引用类型,方法内部针对数组内容进行修改,方法执行结束之后,方法外部也能生效

  • close() :返回类型为void,关闭字节流。

使用try() 代码块会自动调用inputStream的close方法

public class IODemo7 {
    public static void main(String[] args) throws IOException { // FileNotFoundException也是一种特殊的IOException
        /*InputStream inputStream = null;
        try {
            // 打开文件
            inputStream = new FileInputStream("./test.txt");

            // 中间还有很多逻辑,所有得使用try finally,最后执行inputStream.close()以免没执行
        } finally {
            // 关闭文件
            inputStream.close();
        }*/

        // 使用try模块 ,此时try自动调用inputStream得close,但前提得FileInputStream实现了Closeable接口得类,才能放到try()里面
        try (InputStream inputStream = new FileInputStream("./test.txt")) {
            // 读取文件,也不知道文件有多少个字节,使用while来完成
            while (true) {
                /*int b = inputStream.read();
                if (b == -1) {
                    // 读到文件末尾为-1,文件读取完毕
                    break;
                }
                //打印这个字节的数据 文件内容是abcde 以16进制打印它的ASCII码
                // 如果内容是中文,此时打印出的就是每个字节,就是对应到utf8编码的值
                System.out.printf("%x ", b);*/

                //
                byte[] buffer = new byte[1024];
                int n = inputStream.read(buffer);
                if (n == -1) {
                    break;
                }
                for (int i = 0; i < n; i++) {
                    System.out.printf("%x ",buffer[i]);
                }
            }
        }
    }
}

6.2 使用InputStream读文件

读文件:就是把硬盘数据读取到内存中。

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

public class IODemo8 {
    public static void main(String[] args) {
        try(InputStream inputStream = new FileInputStream("./test.txt")) {
            while (true) {
                byte[] buffer = new byte[1024];
                int n = inputStream.read(buffer);
                if (n == -1) {
                    break;
                }
                String s = new String(buffer,0,n);
                System.out.println(s);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

6.3 使用OutputStream写文件

在FileOutputStream()添加true参数,是在源文件里的内容进行追加

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

public class IODemo9 {
    public static void main(String[] args) {
        // append参数是追加
        try (OutputStream outputStream = new FileOutputStream("./test.txt",true)) {
        //此处写入的是二进制,
            byte[] buffer = new byte[] {97,98,99,100,101};
            outputStream.write(buffer);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

7. Reader和Writer字符流

使用方式和InputStream、OutputStream差不多。

7.1 Reader读文件

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

public class IODemo10 {
    public static void main(String[] args) {
        // 使用字符流读取文件内容
        try (Reader reader = new FileReader("./test.txt")) {
            // 读取文件
            while (true) {
                char[] buffer = new char[1024];
                int n = reader.read(buffer);
                if (n == -1) {
                    break;
                }
                String s = new String(buffer,0,n);
                System.out.println(s);
                /*for (int i = 0;i < n;i++) {
                    System.out.print(buffer[i]);
                    System.out.println(" ");
                }*/
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

7.2 Writer写文件

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

public class IODemo11 {
    public static void main(String[] args) {
        try (Writer writer = new FileWriter("./test.txt",true)) {
            String str = "你好帅哥";
            writer.write(str);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

8. 使用Scanner接收intputStream

Scanner(System.in)本质就是一个inputStream

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

public class IODemo12 {
    public static void main(String[] args) {
        try (InputStream inputStream = new FileInputStream("./test.txt")) {
            Scanner scanner = new Scanner(inputStream);
            while (scanner.hasNext()) {
                String s = scanner.next();
                System.out.println(s);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1532814.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

32.768K晶振X1A000141000300适用于无人驾驶汽车电子设备

科技的发展带动电子元器件的发展电子元器件-“晶振”为现代的科技带来了巨大的贡献&#xff0c;用小小的身体发挥着大大的能量。 近两年无人驾驶汽车热度很高&#xff0c;不少汽车巨头都已入局。但这项技术的难度不小&#xff0c;相信在未来几年里&#xff0c;无人驾驶汽车这项…

改进粒子群优化算法||粒子群算法变体||Improved particle swarm optimization algorithm

粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;是一种基于群体智能的优化算法&#xff0c;其思想来源于鸟群寻食和鱼群捕食等自然现象。PSO算法通过模拟群体智能的行为&#xff0c;以一种启发式的方式寻找最优解&#xff0c;因此具有全局搜索能…

数学建模(熵权法 python代码 例子)

目录 介绍&#xff1a; 模板&#xff1a; 例子&#xff1a;择偶 极小型指标转化为极大型&#xff08;正向化&#xff09;&#xff1a; 中间型指标转为极大型&#xff08;正向化&#xff09;&#xff1a; 区间型指标转为极大型&#xff08;正向化&#xff09;&#xff1a…

【Web应用技术基础】HTML(4)——表单类的标签

目录 题目1&#xff1a;文本框 题目2&#xff1a;密码框 题目3&#xff1a;单选框 题目4&#xff1a;多选框 题目5&#xff1a;单选框选中 题目6&#xff1a;禁用disabled 题目7&#xff1a;lable标签 题目8&#xff1a;下拉框 题目9&#xff1a;textarea 题目10&…

【Java之老话常谈】学习Java可以用来做什么?

对于很多新手来说,刚开始接触Java会很迷惘,不知道Java可以做什么。其实Java 可以做的东西太多了,手机游戏、中间件、软件、网站,电脑游戏,以及现在流行的安卓手机app等,都是由java语言编写的。由于Java拥有很高的安全性、平台移植性等,所以受到广大程序员的喜爱。 java…

接口测试、postman、测试点提取【主】

接口测试是测试系统组件间接口的一种测试 接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点 测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系 文章目录 HTTP接口 & Web Service接口RESTful接口…

ubuntu10.04 apache2.2开启tls1.2的支持,使现代的edge和firefox浏览器能正常访问https

最近发现自己ubuntu10.04服务器上的apache https无法通过win11上的edge和firefox浏览器访问&#xff0c;但xp下的ie6和ie8没有问题。 firefox的错误提示为“此网站可能不支持TLS 1.2协议,而这是Firefox支持的最低版本”。 经过检查发现&#xff1a; IE6访问https所需的版本是SS…

virtualBox镜像复制

镜像复制 有一个镜像后&#xff0c;图方便&#xff0c;想直接使用这个vdi文件&#xff0c;但vdi有个uuid值&#xff0c;同一个虚拟机中不能同时存在两个同样的uuid的介质的&#xff0c;普通的复制文件所得到的uuid是一样的 &#xff0c;所以需要用到自带的方法复制vdi文件&…

隐私计算实训营学习二:隐私计算开源如何助力数据要素流通

文章目录 一、数据要素流转与数据内外循环二、数据外循环中的信任焦虑三、数据要素流通对隐私计算的期望四、隐私计算开源助力数据要素流通 一、数据要素流转与数据内外循环 数据要素流转过程(从数据采集加工->到数据价值释放)&#xff1a; 链路主要包括采集、存储、加工、…

计算机网络面经-什么是IPv4和IPv6?

前言 Internet协议&#xff08;IP&#xff09;是为连接到Internet网络的每个设备分配的数字地址。它类似于电话号码&#xff0c;是一种独特的数字组合&#xff0c;允许用户与他人通信。IP地址主要有两个主要功能。首先&#xff0c;有了IP&#xff0c;用户能够在Internet上被识别…

JUnit5的条件测试、嵌套测试、重复测试

条件测试 JUnit5支持条件注解&#xff0c;根据布尔值判断是否执行测试。 自定义条件 EnabledIf和DisabledIf注解用来设置自定义条件&#xff0c;示例&#xff1a; Test EnabledIf("customCondition") void enabled() { // ... } Test DisabledIf("cust…

动态规划课堂6-----回文串问题

目录 引言&#xff1a; 例题1&#xff1a;回文子串 例题2&#xff1a;回文串分割IV 例题3&#xff1a;分割回文串II 例题4&#xff1a;最长回文子序列 例题5&#xff1a;让字符串成为回文串的最小插入次数 引言&#xff1a; 回文字符串 是正着读和倒过来读一样的字符串。…

Sora后时代文生视频的探索

一、写在前面 按常理&#xff0c;这里应该长篇大论地介绍一下Sora发布对各行业各方面产生的影响。不过&#xff0c;这类文章已经很多了&#xff0c;我们今天主要聊聊那些已经成熟的解决方案、那些已经可以“信手拈来”的成果&#xff0c;并以此为基础&#xff0c;看看Sora发布…

PHP全新美化广告横幅在线制作源码

源码简介 可以做网站的引流不需要安装上传就可以使用&#xff0c;在第一版基础上做了二次开发更加好用 注意&#xff1a;主机和服务器均可架设搭建,如果使用宝塔架设点击访问的时候提示找不到文件路径的时候,记得点击网站目录把防跨站攻击先关闭,这样就可以正常访问了,这款是…

用pdf2docx将PDF转换成word文档

pdf2docx是一个Python模块&#xff0c;可以将PDF文件转换为docx格式的Word文档。 pdf2docx模块基于Python的pdfminer和python-docx库开发&#xff0c;可以在Windows、Linux和Mac系统上运行。它可以从PDF文件中提取文本和图片&#xff0c;并将其转换成可编辑的Word文档&#xf…

手撕算法-二叉搜索树与双向链表

牛客BM30。 描述&#xff1a;https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId295&tqId23253&ru/exam/oj&qru/ta/format-top101/question-ranking&sourceUrl%2Fexam%2Foj分析&#xff1a;二叉搜索树的中序遍历是递增序列。可以利用…

相聚武汉氢能展_2024武汉国际氢能源及燃料电池产业博览会

相聚武汉氢能展_2024武汉国际氢能源及燃料电池产业博览会 2024武汉国际氢能源及燃料电池产业博览会 2024 Wuhan International Hydrogen Energy and Fuel Cell Industry Expo 同期举办&#xff1a;2024世界汽车制造技术暨智能装备博览会 时间&#xff1a;2024.8.14-16 地…

【动态规划】【同余前缀和】【多重背包】[推荐]2902. 和带限制的子多重集合的数目

本文涉及知识点 动态规划汇总 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 C算法&#xff1a;滑动窗口总结 多重背包 LeetCode2902. 和带限制的子多重集合的数目 给你一个下标从 0 开始的非负整数数组 nums 和两个整数 l 和 r 。 请你…

拷贝他人maven仓库jar包到自己本地仓库,加载maven依然提示无法下载对应依赖

所遇问题&#xff1a; 拷贝他人maven仓库jar包到自己本地maven仓库repository下的对应依赖位置&#xff0c;重新加载idea的maven依然提示无法下载对应依赖。 解决办法&#xff1a; 在maven->repository找到对应报错依赖路径&#xff0c;删除xxx.repositories 和 xxx.lastU…

记录开发STM32遇到的卡死问题-串口

背景&#xff1a;以STM32作为主控&#xff0c;广州大彩显示屏显示&#xff0c;主控实时采集数据&#xff0c;串口波特率115200.设置收发频率为50Hz&#xff0c;即单片机每秒发送50帧数据&#xff0c;每秒接收50帧数据&#xff0c;每帧数据大概14字节。 问题&#xff1a;系统长…