Java语法七:文件操作---IO

news2024/11/18 15:42:20

目录

1.File概述

1.1:File概述的方法

 2:文件内容的读写

2.1:字节流

2.1.1:读--InputStream

2.1.2:写---OutputStream

2.2:字符


前言:

这一篇我们将讲文件操作的相关方法,以及数据流和字符流的相关操作

1.File概述

说到file,我们首先要弄清楚相对路径,绝对路径,网络路径。

  • 相对路径:必须要有一个基准路径。相对路径:就是从基准路径出发,看从那种的路径来看找到对应的文件。

如果基准路径:C:\Software\exercise,那么hello.txt相对路径就是:.\hello.txt

如果基准路径:C:\Software,那么hello.txt 的相对路径就是:.\exercise\hello.txt

  • 绝对路径:是以盘符开头的。

那么hello.txt的绝对路径就是:C:\Software\exercise.\hello.txt。

  • 网络路径:就是通过一个网络路径就可以打开一个网络上的东西。

1.1:File概述的方法

返回值类型方法签名说明
StringgetParent()返回File对象的父目录文件路径
StringgetName()返回File对象的纯文件名称
Stringgetpath()返回File对象的文件路径(相对路径)
StringgetAbsolutedPath()返回File对象的绝对路径(基准路径加相对路径)
StringgetCanonicalPath()返回File对象的绝对路径
booleanexists()判断File对象描述的文件是否真实存在
booleanisDirectory()判断File对象描述的文件是否是一个目录
booleanisFile()判断File对象描述的文件是否是一个普通文件
booleancreateNewFile()根据File对象,自动创建一个空文件,成功后返回true
booleandelete()根据File对象,删除该文件,成功后返回true
voiddeleteOnExit()删除文件,删除动作回到JVM运行结束时才会进行。
String[]list()返回File对象代表的目录下的所有文件名
file[]listFiles()返回File对象代表的目录下的所有文件,以File对象表示
booleanmkdir()创建File对象代表的目录
booleanmkdirs()创建File对象代表的目录
booleanrenameTo(Filedest)对文件重命名
booleancanRead()判断是否有可读权限
booleancanWrite()判断是否有可写权限

1.File对象:

File file=new File("./text.txt"); //这个并不要求改文真实存在

2.getAbsolutedPath() /getCanonicalPath()----返回file对象的文件绝对路径(返回String)

例如:System.out.println(file.getAbsolutePath());

结果显示:D:\编程\代码\gittee\fighting\File_boke \.\text.txt

这里多了一个 .\ 在这个方法getAbsolutePath(),返回的结果是基准路径加上相对路径 

D:\编程\代码\gittee\fighting\File_boke ,这个是当前的代码文件路径(也是text.txt的基准路径)。

./text.txt 这是相对路径。

例如:System.out.println(file.getCanonicalPath());

结果显示:D:\编程\代码\gittee\fighting\File_boke\text.txt。

这个就是正常的绝对路径。


代码演示:

示例一:

 File file=new File("./text.txt");
        //这个并不要求改文件是否真实存在
        System.out.println("文件名:"+file.getName());
        System.out.println("文件的绝对路径"+file.getAbsolutePath());
        System.out.println("文件的绝对路径"+file.getCanonicalPath());
        System.out.println("文件的相对路径:"+file.getPath());
        System.out.println("父目录路径"+file.getParent());

结果显示:


 示例二:

 public static void main(String[] args) throws IOException {
        File file=new File("./hello.txt");
        //创建一个文件
        file.createNewFile();//会抛出IOException
        //判断文件是否真实存在
        System.out.println("文件是否真实存在:"+file.exists());
        System.out.println("改名前的文件名:"+file.getName());
        //判断是否是一个文件
        System.out.println("是否是一个文件:"+file.isFile());
        //判断是否是一个目录
        System.out.println("是否是一个目录:"+file.isDirectory());
        //对文件重命名
      File file1=new File("./word.txt");
        System.out.println(file.renameTo(file1));
        System.out.println("word.txt文件是否存在:"+file1.exists());
        System.out.println("hello.txt文件是否存在:"+file.exists());
        System.out.println("改名后的文件名:"+file.getName());

结果显示:

 文件重命名:为啥改名前和改名后的文件名是一样的勒?

因为这个只是把磁盘上的文件给改动,file对象不变的。


示例三:

 public static void main(String[] args) {
        //创建一个单级目录
        File file=new File("./ddd");
        file.mkdir();
        //判断是否是一个目录
        System.out.println("是否是一个目录:"+file.isDirectory());
        //创建多级目录
        File file1=new File("./aaa/bbb/ccc");
       file1.mkdirs();
       //返回File对象代表的目录下的所有文件名
        System.out.println("返回File1对象代表的目录下的所有文件名");
        String [] arr=file1.list();
        for (String s:arr) {
            System.out.println(s);
        }
        System.out.println("返回File1对象代表的目录下的所有文件名,以File对象表示:");
        File []files=file1.listFiles();
        for (File f:files) {
            System.out.println(f);
        }
    }

结果显示:


 2:文件内容的读写

2.1:字节流

字节流对象,针对二级制文件,是以字符为单位进行读写。

2.1.1:读--InputStream

1.read()---读取一个字节的数据 ,返回-1就代表已经完全读取完了。

  public static void main(String[] args) throws FileNotFoundException {
        File file=new File("./aaa/bbb/ccc/hello.txt");
        try(FileInputStream inputStream=new FileInputStream(file)) {
            while(true){
                int len=inputStream.read();
                if(len==-1){//如果读取时负一,说明就是读取到文件末尾
                    break;
                }
                System.out.print(len);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

结果显示:

这里大家产生了一个疑问了吗?一次返回一个字节,不是应该返回一个byte吗?为啥是int类型的勒?

如果返回的是byte,本身就是-128 到127 。当读取到一个-1的时候,你到底是读取到文件末尾了,还是刚好有一个值-1(0xff)。这时候为了表示这个非法状态,就约定了-1来表示,因此就需要一个使用范围大与byte的类型。

针对字符流,也是类似的设定,一次读一个char,因此此处使用int就会更适合一些,可以让字符和字节流统一。


2:read(byte[] b)---最多读取到b.length 字节的数据到b中,-1代表读完

public static void main(String[] args) {
        File file=new File("./aaa/bbb/ccc/hello.txt");
        try (FileInputStream inputStream=new FileInputStream(file)){
            while(true) {
                //一次读取多个字符
                byte[] arr = new byte[1024];
                int len = inputStream.read(arr);
                if(len==-1){//这里的len是你实际读取到的字节长度
                    break;
                }
                for (int i = 0; i <len ; i++) {
                    System.out.print(arr[i]+" ");
                }
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }

结果显示:


3.read(byte[] b ,int off, int len) ----最多读取len-off字节的数据到b中,放到off开始,返回实际读取的字节数量。-1代表已经读取完。

  public static void main(String[] args) {
        File file=new File("./aaa/bbb/ccc/hello.txt");
        try(FileInputStream inputStream=new FileInputStream(file)) {
            while(true) {
                byte[] arr = new byte[1024];
                int len=inputStream.read(arr,2,5);
                if(len==-1){
                    break;
                }
                for (int i = 0; i <len; i++) {
                    System.out.print(arr[i]+" ");
                }
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }

结果显示:


2.1.2:写---OutputStream

每次写入到指定的文件中,会清除指定文件的内容。

1.write(int b)---写入要给字节的数据

 public static void main(String[] args) {
       try(OutputStream outputStream=new FileOutputStream("./aaa/bbb/ccc/hello.txt")) {
           outputStream.write(110);
           outputStream.write(111);
           outputStream.write(112);
    outputStream.close();//关闭文件资源
       }catch (IOException e){
           e.printStackTrace();
       }
    }

结果显示:

2.write(byte []b)---将b这个字符数组中的数据全部写入指定文件中

  public static void main(String[] args) {
        try(OutputStream outputStream=new FileOutputStream("./aaa/bbb/ccc/hello.txt" )){
            byte [] arr=new byte[]{110,111,112,113,114,115};
            outputStream.write(arr);
            outputStream.close();//关闭文件资源
        }catch(IOException e){
            e.printStackTrace();
        }
    }

结果显示:


2.2:字符

1:read()--读

 try(Reader reader=new FileReader("./aaa/bbb/ccc/hello.txt")) {
            while(true){
                char [] arr=new char[1024];
                int len=reader.read(arr);
                if(len==-1){
                    break;
                }
                String str=new String(arr,0,len);
                System.out.println(str);
            }
        }catch (IOException e){
            e.printStackTrace();
        }

结果显示:

2.wirte()---写

public static void main(String[] args) {
        try(Writer writer=new FileWriter("./aaa/bbb/ccc/hello.txt")) {
            writer.write("xyz");
          writer.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }

结果显示:

3.FileWriter---追加 

  public static void main(String[] args) {
        try (FileWriter url=new FileWriter("./aaa/bbb/ccc/hello.txt",true)){
            url.write("word");
            url.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }

结果显示:


 总结:

以上就是我总结的文件IO的相关知识点,若有错误之处,请各位铁子留言纠错。若感觉不错,请一键三联。

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

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

相关文章

详解Reflect:Reflect和Object的异同,Reflect的一些内置方法以及方法注意点

Reflect Reflect拥有Object对象的一些内部方法&#xff0c;某些方法会同时在Object对象和Reflect对象上部署&#xff0c;也就是说Object对象上存在的方法&#xff0c;通过Reflect也可以访问到。 单论Reflect的话&#xff0c;可以这么理解&#xff0c;Reflect就是继承了Object的…

C语言学习前序 - VS Code安装

要想学习一门编程语言&#xff0c;首先要有一个好的编程工具&#xff0c;推荐大家使用VS Code。 截止到现在&#xff0c;是我最喜欢的代码编辑工具。 工具下载。 官网地址&#xff1a;https://code.visualstudio.com/ 开始下载了&#xff0c;但是很慢很慢。 下载很慢可以直…

【Leetcode面试常见题目题解】4. 盛最多水的容器

题目描述 本文是LC第11题&#xff1a;盛最多水的容器。 题目描述如下&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多…

.Net 线程安全 (细粒度锁定、无锁机制以及lock)

.Net 线程安全最省事的lock关键字线程安全对象测试环境例子使用Queue源码和结果运行效果使用ConcurrentQueue的源码和结果运行效果volatile关键字易失性内存和非易失性内存的区别易失性内存&#xff1a;非易失性内存&#xff1a;volatile 关键字可应用于以下类型的字段&#xf…

<C++>AVL数

文章目录1. AVL树的概念2. AVL树节点的定义3. AVL树的插入4. AVL树的旋转5. AVL树的验证6. AVL树的性能1. AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0…

MySQL中alter命令知识

MySQL中alter命令知识 文章目录MySQL中alter命令知识(一) 删除、添加、修改字段1、删除表中的字段数据2、添加新字段指定字段插入位置3、修改字段类型和名称&#xff08;二&#xff09;、修改表名&#xff08;三&#xff09;、修改存储引擎创建copy_emp表&#xff0c;便于后面案…

Prompt Learning 简介

最近去参会&#xff0c;看到了大量关于Prompt相关的论文&#xff0c;或者说跟NLP NLU相关的新论文或多或少都使用到了Prompt learning的一些思想或者设置。由于本人主业不是是做NLP的&#xff0c;所以对NLP顶会的这一现象觉得很有意思&#xff0c;趁闲暇学习了一下Prompt learn…

对话 BitSail Contributor | 姚泽宇:新生火焰,未来亦可燎原

2022 年 10 月&#xff0c;字节跳动 BitSail 数据引擎正式开源。同期&#xff0c;社区推出 Contributor 激励计划第一期&#xff0c;目前已有 12 位开发者为 BitSail 社区做出贡献&#xff0c;成为了首批 BitSail Contributor。 江海的广阔是由每一滴水珠构成的&#xff0c;Bi…

【高阶数据结构】手撕哈希表(万字详解)

&#x1f308;欢迎来到数据结构专栏~~手撕哈希表 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句…

【jqgrid篇】jqgrid.setCell 改变单元格的值 改变单元格的样式设置单元格属性

setCellrowid,colname, data, class, propertiesjqGrid对象 改变单元格的值。rowid&#xff1a;当前行id&#xff1b;colname&#xff1a;列名称&#xff0c;也可以是列的位置索引&#xff0c;从0开始&#xff1b;data&#xff1a;改变单元格的内容&#xff0c;如果为空则不更 …

将GO、Pathway富集结果整合在一张高颜值圆圈图上

富集分析是生物医学论文中非常常见的一类分析&#xff0c;例如GO富集分析&#xff0c;Pathway富集分析等。其结果一般包括以下几个要素&#xff1a;1&#xff0c;名字&#xff08;GO term或者KEGG description&#xff09;&#xff1b;2&#xff0c;该名字所包含的基因数目&…

400G数据中心短距离传输方案:400G QSFP-DD SR8光模块

随着更快、更高可靠性的网络需求增加&#xff0c;400G将是下一代骨干网升级和新建设的方向。400G光模块在构建400G网络系统中起着至关重要的作用。前面我们为大家介绍了短距离单模应用的400G QSFP-DD DR4光模块&#xff0c;本期文章&#xff0c;我们一起来了解一下短距离多模光…

自定义类型:结构体,枚举,联合(2)

TIPS 1. 类型的定义可以考虑放在头文件里头。 2. 一个汉字存储的时候占两个字节空间 3. 关于结构体变量初始化的一些细节 4. 关于结构体内存对齐的补充 1. 2. S1和S2类型的成员一模一样&#xff0c;但是S1和S2所占空间的大小有了一些区别。 3. 这两个结构体类型成员都…

【Linux】六、Linux 基础IO(一)|重谈文件|C语言文件操作|操作系统文件操作(系统文件I/O)|文件描述符

目录 一、重谈文件 二、C语言文件操作 2.1 重谈C语言文件操作 2.2 补充细节 三、操作系统文件操作&#xff08;系统文件I/O&#xff09; 3.1 文件相关系统调用&#xff1a;close 3.2 文件相关系统调用&#xff1a;open 3.2.1 open 的第二个参数 flags 3.2.2 open 的第…

解决跨微服务调用token共享问题

场景描述 使用jeecg搭建SpringCloud微服务系统模块&#xff0c;各个系统模块单独创建了拦截器进行权限校验。结果发现跨微服务调用存在鉴权失败问题。不能正常跨微服务调用。 原因描述 单个微服务鉴权拦截器。 package org.jeecg.modules.taxation.inerceptor;import org.s…

【MySQL】MySQL单表操作

序号系列文章2【MySQL】MySQL基本操作详解3【MySQL】MySQL基本数据类型4【MySQL】MySQL表的七大约束5【MySQL】字符集与校对集详解文章目录MySQL单表操作1&#xff0c;数据操作1.1&#xff0c;复制表结构和数据1.2&#xff0c;解决主键冲突1.3&#xff0c;清空数据1.4&#xff…

二叉树详解(概念+遍历实现)

一、基本概念 1.最左孩子结点&#xff1a;一个结点的孩子结点中位于最左边的孩子结点。例如&#xff0c;A——B&#xff0c;B——E&#xff1b; 2.树的高度&#xff1a;树的最高层数&#xff1b; 3.路径长度&#xff1a;树中的任意两个顶点之间都存在唯一的一条路径。一条路径所…

我们这样做容器分层性能测试

前言目前闲鱼不少业务正在从H5/Weex升级到Kun&#xff08;基于W3C标准&Flutter打造的混合高性能终端容器&#xff09;&#xff0c;从测试角度来看&#xff0c;我们希望这种升级迭代对于用户体验是正向的&#xff0c;所以用好性能测试这把标准尺就显得格外重要。早期做性能保…

有什么比较好用的低代码开发平台?

国内有特色的低代码快速开发平台产品有哪些&#xff1f;这篇就来介绍下目前市面上主要的几家零代码开发平台&#xff01; 简道云、明道云、IVX这几家目前是无代码赛道的明星选手&#xff0c;在市场综合表现上名列前茅。宜创、红圈营销虽也极具潜力&#xff0c;但在市场表现力上…

Java开发技术之成为高级java工程师必须学习的三个技术

所谓的Java高级程序员往往是经验和能力的结合&#xff0c;并不是说掌握了哪几个技术就是高级程序员了&#xff0c;能否把掌握的知识运用到实际的项目中&#xff0c;并且解决了具体的问题&#xff0c;这个才是衡量一个Java程序员的标准。 那么对于一名Java程序员来说&#xff0…