File 类的用法和 InputStream, OutputStream,System 类的用法

🎉🎉🎉点进来你就是我的人了
博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!

人生格言:当你的才华撑不起你的野心的时候,你就应该静下心来学习!

欢迎志同道合的朋友一起加油喔🦾🦾🦾
目标梦想:进大厂,立志成为一个牛掰的Java程序猿,虽然现在还是一个🐒嘿嘿
谢谢你这么帅气美丽还给我点赞!比个心


目录

1.File类

File概述

File属性

2.File类对文件进行操作

3.File类对目录进行操作

5.InputStream方法简介

 6.OutputStream方法简介

7.InputStream和OutputStream的使用

7.1 FileInputStream读取文件中内容

【1】读取文本文件:

【2】利用字节流读取非文本文件:一个字节一个字节的读取(以图片为案例)

【3】利用字节类型的缓冲数组:

7.2 FileInputStream,FileOutputStream完成非文本文件的复制

【1】读入一个字节,写出一个字节:

【2】利用缓冲字节数组:

 8.System类的使用

9.try-with-resource语句



1.File类

在java程序中操纵 文件/目录 ?怎么办?
java程序,最典型的特点,面向对象,java程序最擅长的就是操作对象,盘符上的文件/目录,将它的各种信息进行了封装,封装为一个对象,
java程序最擅长的就是操纵对象,这个对象属于 ---》File类

盘符上的文件---》封装为对象---》对象属于File类的对象--》有了这个对象,我们程序就可以直接操纵这个对象,通过这个对象获取文件的各种信息,还可以对文件进行创建 ,删除。

File概述

在java中提供了一个File类通过这个类来完成文件系统的相关操作例如:

1)列出目录中有哪些文件

2)创建文件

3)创建目录

4)删除文件

5)重命名文件

这个File类就描述了一个文件/目录,通过这个对象就可以实现以上的功能

File属性

构造方法

  方法


2.File类对文件进行操作

public class Test01 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) throws IOException {
        //将文件封装为一个File类的对象:
        File f = new File("d:\\test.txt");
        File f1 = new File("d:\\test.txt");
        File f2 = new File("d:/test.txt");
        //File.separator属性帮我们获取当前操作系统的路径拼接符号
       //在windows,dos下,系统默认用“\”作为路径分隔符 ,在unix,url中,使用“/”作为路径分隔符。
        File f3 = new File("d:"+File.separator+"test.txt");//建议使用这种
        //常用方法:
        System.out.println("文件是否可读:"+f.canRead());
        System.out.println("文件是否可写:"+f.canWrite());
        System.out.println("文件的名字:"+f.getName());
        System.out.println("上级目录:"+f.getParent());
        System.out.println("是否是一个目录:"+f.isDirectory());
        System.out.println("是否是一个文件:"+f.isFile());
        System.out.println("是否隐藏:"+f.isHidden());
        System.out.println("文件的大小:"+f.length());
        System.out.println("是否存在:"+f.exists());
        /*if(f.exists()){//如果文件存在,将文件删除操作
            f.delete();
        }else{//如果不存在,就创建这个文件
            f.createNewFile();
        }*/
        System.out.println(f == f1);//比较两个对象的地址
        System.out.println(f.equals(f1));//比较两个对象对应的文件的路径
        //跟路径相关的:
        System.out.println("绝对路径:"+f.getAbsolutePath());
        System.out.println("相对路径:"+f.getPath());
        System.out.println("toString:"+f.toString());
        System.out.println("----------------------");
        File f5 = new File("demo.txt");
        if(!f5.exists()){
            f5.createNewFile();
        }
        //绝对路径指的就是:真实的一个精准的,完整的路径
        System.out.println("绝对路径:"+f5.getAbsolutePath());
        //相对路径:有一个参照物,相对这个参照物的路径。
        //在main方法中,相对位置指的就是:D:\IDEA_workspace\TestJavaSE
        //在junit的测试方法中,相对路径指的就是模块位置
        System.out.println("相对路径:"+f5.getPath());
        //toString的效果永远是  相对路径
        System.out.println("toString:"+f5.toString());
        File f6 = new File("a/b/c/demo.txt");
        if(!f5.exists()){
            f5.createNewFile();
        }
        System.out.println("绝对路径:"+f6.getAbsolutePath());
        System.out.println("相对路径:"+f6.getPath());
    }
}

3.File类对目录进行操作

public class Test02 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        //将目录封装为File类的对象:
        File f = new File("D:\\IDEA");
        System.out.println("文件是否可读:"+f.canRead());
        System.out.println("文件是否可写:"+f.canWrite());
        System.out.println("文件的名字:"+f.getName());
        System.out.println("上级目录:"+f.getParent());
        System.out.println("是否是一个目录:"+f.isDirectory());
        System.out.println("是否是一个文件:"+f.isFile());
        System.out.println("是否隐藏:"+f.isHidden());
        System.out.println("文件的大小:"+f.length());
        System.out.println("是否存在:"+f.exists());
        System.out.println("绝对路径:"+f.getAbsolutePath());
        System.out.println("相对路径:"+f.getPath());
        System.out.println("toString:"+f.toString());
        //跟目录相关的方法:
        File f2 = new File("D:\\b\\b\\c");
        File f3 = new File("D:\\c\\b\\c");
        //创建目录:
//        f2.mkdir();//创建单层目录
        f2.mkdirs();//创建多层目录
        //删除:如果是删除目录的话,只会删除一层,并且前提:这层目录是空的,里面没有内容,如果内容就不会被删除
        f2.delete();
        //查看:
        String[] list = f.list();//文件夹下目录/文件对应的名字的数组
        for(String s:list){
            System.out.println(s);  //只能输出文件名
        }
        System.out.println("=========================");
        File[] files = f.listFiles();//作用更加广泛
        for(File file:files){
                                                                                                                                //能通过对象去获取名字和路径等等
            System.out.println(file.getName()+","+file.getAbsolutePath());
        }
    }
}

5.InputStream方法简介

针对文件内容,使用“流对象”来进行操作。Java标准库中的流对象,从类型上分为字节流操作二进制数据的和字符流操作文本数据的。字节流中,又存在InputStream和OutputStream两个抽象类。

        InputStream方法:

 InputStream只是一个抽象类,要使用还要具体的实现类,对于文件读取来说,通常使用FileInputStream,其构造方法如下:

 6.OutputStream方法简介

        方法:

 OutputStream也是一个抽象类,要使用需要具体的实现类,而对于写入文件来说,使用FIleOutputStream。

7.InputStream和OutputStream的使用

 文本文件:.txt   .java  .c  .cpp  ---》建议使用字符流操作
非文本文件:.jpg,  .mp3  ,   .mp4 , .doc  , .ppt  ---》建议使用字节流操作

7.1 FileInputStream读取文件中内容

【1】读取文本文件:

public class Test01 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) throws IOException {
        //功能:利用字节流将文件中内容读到程序中来:
        //1.有一个源文件:
        File f = new File("D:\\Test.txt");
        //2.将一个字节流这个管 怼  到 源文件上:
        FileInputStream fis = new FileInputStream(f);
        //3.开始读取动作
        /*
        细节1:
        文件是utf-8进行存储的,所以英文字符 底层实际占用1个字节
        但是中文字符,底层实际占用3个字节。
        细节2:
        如果文件是文本文件,那么就不要使用字节流读取了,建议使用字符流。
        细节3:
        read()读取一个字节,但是你有没有发现返回值是 int类型,而不是byte类型?
        read方法底层做了处理,让返回的数据都是“正数”,到达末尾该方法就会返回-1
        之所以让read方法返回值是int, 就是为了避免如果字节返回的是-1的话,那到底是读入的字节,还是到文件结尾呢。
         */
        int n = fis.read();
        while(n!=-1){
            System.out.println(n);
            n = fis.read();
        }
        //4.关闭流:
        fis.close();
    }
}

【2】利用字节流读取非文本文件:一个字节一个字节的读取(以图片为案例)

public class Test02 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) throws IOException {
        //功能:利用字节流将文件中内容读到程序中来:
        //1.有一个源文件:
        File f = new File("D:/b/hello.png");
        //2.将一个字节流这个管 怼  到 源文件上:
        FileInputStream fis = new FileInputStream(f);
        //3.开始读取动作
        int count = 0;//定义一个计数器,用来计读入的字节的个数
        int n = fis.read();
        while(n!=-1){
            count++;
            System.out.println(n);
            n = fis.read();
        }
        System.out.println("count="+count);
        //4.关闭流:
        fis.close();
    }
}

【3】利用字节类型的缓冲数组:

public class Test03 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) throws IOException {
        //功能:利用字节流将文件中内容读到程序中来:
        //1.有一个源文件:
        File f = new File("D:/b/hello.png");
        //2.将一个字节流这个管 怼  到 源文件上:
        FileInputStream fis = new FileInputStream(f);
        //3.开始读取动作
        //利用缓冲数组:(快递员的小车)
        byte[] b = new byte[1024*6];
        int len = fis.read(b);//len指的就是读取的数组中的有效长度
        while(len!=-1){
            //System.out.println(len);
            for(int i = 0;i<len;i++){
                System.out.println(b[i]);
            }
            len = fis.read(b);
        }
        //4.关闭流:
        fis.close();
    }
}

7.2 FileInputStream,FileOutputStream完成非文本文件的复制

【1】读入一个字节,写出一个字节:

public class Test04 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) throws IOException {
        //功能:完成图片的复制:
        //1.有一个源图片
        File f1 = new File("D:/b/hello.png");
        //2.有一个目标图片:
        File f2 = new File("D:/b/hello2.png");
        //3.有一个输入的管道 怼 到 源文件:
        FileInputStream fis = new FileInputStream(f1);
        //4.有一个输出的管道 怼到  目标文件上:
        FileOutputStream fos = new FileOutputStream(f2);
        //5.开始复制:(边读边写)
        int n = fis.read();
        while(n!=-1){
            fos.write(n);
            n = fis.read();
        }
        //6.关闭流:(倒着关闭流,先用后关)
        fos.close();
        fis.close();
    }
}

 复制结果如下图:

【2】利用缓冲字节数组:

public class Test05 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) throws IOException {
        //功能:完成图片的复制:
        //1.有一个源图片
        File f1 = new File("D:/b/hello.png");
        //2.有一个目标图片:
        File f2 = new File("D:/b/hello3.png");
        //3.有一个输入的管道 怼 到 源文件:
        FileInputStream fis = new FileInputStream(f1);
        //4.有一个输出的管道 怼到  目标文件上:
        FileOutputStream fos = new FileOutputStream(f2);
        //5.开始复制:(边读边写)
        //利用缓冲数组:
        byte[] b = new byte[1024*8];
        int len = fis.read(b);
        while(len!=-1){
            fos.write(b,0,len);
            len = fis.read(b);
        }
        //6.关闭流:(倒着关闭流,先用后关)
        fos.close();
        fis.close();
    }
}

复制结果如下图:

 8.System类的使用

【1】System的属性:
        System.in  : “标准”输入流。---》默认情况下  从键盘输入
        System.out  :“标准”输出流。 ---》默认情况下,输出到控制台。
【2】System.in :“标准”输入流。---》默认情况下  从键盘输入

public class Test01 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) throws IOException {
        //得到的是标准的输入流:--》从键盘输入:
        //InputStream in = System.in;
        //调用方法:
        //int n = in.read();//read方法等待键盘的录入,所以这个方法是一个阻塞方法。
        //System.out.println(n);
        //以前案例:从键盘录入一个int类型的数据:
        //从上面的代码证明,键盘录入实际上是:System.in
        //形象的理解:System.in管,这个管怼到键盘上去了,所以你从键盘录入的话,就从这个管到程序中了
        //Scanner的作用:扫描器:起扫描作用的,扫键盘的从这根管出来的数据
        /*Scanner sc = new Scanner(System.in);
        int i = sc.nextInt();
        System.out.println(i);*/
        //既然Scanner是扫描的作用,不一定非得扫 System.in进来的东西,还可以扫描其他管的内容:
        Scanner sc = new Scanner(new FileInputStream(new File("d:\\Test.txt")));
        while(sc.hasNext()){
            System.out.println(sc.next());
        }
    }
}

【3】System.out  : 返回的输出流 、 打印流(PrintStream)

public class Test02 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        //写到控制台:
        PrintStream out = System.out;
        //调用方法:
        out.print("你好1");//直接在控制台写出,但是不换行
        out.print("你好2");
        out.print("你好3");
        out.print("你好4");
        out.println("我是中国人1");//直接在控制台写出,并且换行操作
        out.println("我是中国人2");
        out.println("我是中国人3");
        out.println("我是中国人4");
        System.out.println("你是");
        System.out.print("中国人");
    }
}

9.try-with-resource语句

try-with-resources是Java 7中引入的一个特性,它是为了简化在程序中使用资源(例如文件、网络连接等)的管理。在Java程序中,资源的正确关闭非常重要,因为资源泄漏可能导致性能问题、程序错误或其他问题。try-with-resources语句确保在代码块执行完毕后自动关闭资源,无论代码执行过程中是否发生异常。

try-with-resources语句实现自动关闭资源的方式是通过在资源实现java.lang.AutoCloseablejava.io.Closeable接口的情况下,确保close()方法被调用。这两个接口都包含一个close()方法,它们的实现负责释放资源。

try-with-resources语句的基本结构如下:

try (ResourceType resource = new ResourceType()) {
    // 使用资源的代码
} catch (Exception e) {
    // 处理异常的代码
}

当程序执行到try语句块结束时,如果resource实现了AutoCloseableCloseable接口,那么close()方法将被自动调用。这确保了无论try块中是否抛出异常,资源都会被正确关闭。

因此,try-with-resources语句可以自动关闭资源,主要是因为它依赖实现AutoCloseableCloseable接口的资源,使得在try语句块结束时自动调用close()方法。这简化了资源管理,降低了资源泄漏和相关问题的风险。

注意:如果一个资源没有实现AutoCloseableCloseable接口,那么try-with-resources语句将无法自动关闭该资源。在这种情况下,你需要在代码中手动管理资源的关闭。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Typescript学习笔记(一)

什么是TypeScript? TypeScript 是添加了类型系统的 JavaScript&#xff0c;适用于任何规模的项目。 TypeScript 是一门静态类型、弱类型的语言。 安装TypeScript npm install -g typescript编译 tsc hello.tsTypeScript 只会在编译时对类型进行静态检查&#xff0c;如果发…

iOS 内存管理机制与原理

内存分区 内存一般分为五大区&#xff1a;栈区、堆区、常量区、全局区、代码区。如图 1.栈区 是由编译器自动分配并释放的&#xff0c;主要用来存储局部变量、函数的参数等&#xff0c;是一块连续的内存区域&#xff0c;遵循先进后出&#xff08;FILO&#xff09;原则。一般在…

WebAssembly 助力云原生:APISIX 如何借助 Wasm 插件实现扩展功能?

本文将介绍 Wasm&#xff0c;以及 Apache APISIX 如何实现 Wasm 功能。 作者朱欣欣&#xff0c;API7.ai 技术工程师 原文链接 什么是 Wasm Wasm 是 WebAssembly 的缩写。WebAssembly/Wasm 是一个基于堆栈的虚拟机设计的指令格式。 在 Wasm 未出现之前&#xff0c;浏览器中只能…

Hadoop(伪分布式)+Spark(local模式)搭建Hadoop和Spark组合环境

一、安装Hadoop环境使用Ubuntu 14.04 64位 作为系统环境&#xff08;Ubuntu 12.04&#xff0c;Ubuntu16.04 也行&#xff0c;32位、64位均可&#xff09;&#xff0c;请自行安装系统。Hadoop版本: Hadoop 2.7.4创建hadoop用户如果你安装 Ubuntu 的时候不是用的 "hadoop&qu…

研究的艺术 (The craft of research) 读书笔记

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 对于研究者而言&#xff0c;写作是一件很重要的事&#xff0c;好的写作不仅能让更多人愿意读&#xff0c;获得更大影响力&…

Windows系统配置SSH服务

1.安装OpenSSH 打开【设置】-【应用】 选择【管理可选功能】 点击【添加可选功能】 选择【OpenSSH 服务端】&#xff0c;切记不是【OpenSSH 客户端】&#xff08;如果安装一个不行&#xff0c;就都安装&#xff0c;我都安装了可以用&#xff09;&#xff0c;然后点击下载即可 …

ERP系统如何让项目管理更轻松?

项目管理是许多企业的首要任务&#xff0c;通常有一个ERP系统来协助他们。然而&#xff0c;一些企业仍然没有意识到&#xff0c;ERP解决方案可以使他们的项目管理更容易。项目管理需要有一个目标&#xff0c;并在你朝着完成项目前进的过程中控制变量&#xff0c;而ERP系统指导你…

成都北大青鸟怎么样?

对于任何一个培训机构的了解大概的流程是&#xff1a;听说名字——网上搜索&#xff0c;可以看到机构官网&#xff0c;也会看到机构广告&#xff0c;当然也会看到各种有好有坏的评论&#xff0c;到这里会对机构形成初印象&#xff1b;然后如果身边有培训出身的小伙伴会去询问对…

【C语言进阶:自定义类型详解】联合(共用体)

本节重点内容&#xff1a; 联合类型的定义联合的特点联合大小的计算⚡联合类型的定义 联合也是一种特殊的自定义类型这种类型定义的变量也包含一系列的成员&#xff0c;特征是这些成员公用同一块空间&#xff08;所以联合也叫共用体&#xff09;。 为了方便大家理解举个例子…

Java 网络编程之NIO(ByteBuffer)

在 Java NIO 中&#xff0c;ByteBuffer 是用于存储和传输数据的一种数据结构。它提供了高效的数据存储和读取能力&#xff0c;使得 Java NIO 能够高效地处理大量的数据输入输出。 ByteBuffer 的作用包括以下几个方面: 存储数据:ByteBuffer 可以存储任意长度的数据&#xff0c;…

Elasticsearch 8.X 如何基于用户指定 ID 顺序召回数据?

1、实战问题如何根据输入的id 的顺序输出结果&#xff0c;id 个数有500个&#xff0c;还有分页&#xff1f;问题来源&#xff1a;https://t.zsxq.com/0cdyq7tzr2、方案探讨2.1 Elasticsearch 默认排序机制在 Elasticsearch 中&#xff0c;如果未指定排序规则&#xff0c;检索结…

Linux下实现的 HTTP 服务器

项目功能&#xff1a;&#xff08;1&#xff09;能接收客户端的GET请求&#xff1b;&#xff08;2&#xff09;能够解析客户端的请求报文&#xff0c;根据客户端要求找到相应的资源&#xff1b;&#xff08;2&#xff09;能够回复http应答报文&#xff1b;&#xff08;3&#x…

数据结构和算法学习记录——设计循环队列(数组实现循环队列)核心思路、题解过程、完整题解

目录 题目描述 题目示例 核心思路 链表实现 数组实现 重点 题解过程 结构体类型定义 创建一个循环队列并初始化 判断循环队列为空或为满 入队列函数 出队列函数 取队头数据 取队尾数据 销毁循环队列 完整题解 题目来源&#xff1a;力扣 题目描述 设计你的…

Sentinel滑动时间窗限流算法原理及源码解析(下)

文章目录对统计数据如何使用获取之前统计好的数据对统计数据如何使用 流控快速失败 获取之前统计好的数据

SpringBoot 项目的创建与启动

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

iosApplePay

1、Apple Pay 接入工程 - 简书 // 设置币种、国家码及merchant标识符等基本信息 PKPaymentRequest *payRequest [[PKPaymentRequest alloc]init]; payRequest.countryCode "CN"; //国家代码 payRequest.currencyCode "CNY"; //RMB的币种代码 …

“被裁员之前,没得到任何风声,措手不及...” 一个在职6年测试工程师内心独白

前言 一个码农&#xff08;软件测试工程师&#xff09;的自白 小张&#xff1a; 我们用工作五年的积蓄&#xff0c;在这个一线城市买了房子&#xff0c;买了车子&#xff0c;然后领证。我也在6年前进入了一个很多人梦寐以求新的公司 码农的新生活开始了。在这家公司里&…

ChatGPT如何为企业提供帮助?

数字化转型是指利用技术来改变企业的运营方式并为客户提供价值&#xff0c;这不仅仅是关于如何采用新的技术或工具。要想取得成功&#xff0c;就需要从根本上改变文化和心态。 ChatGPT如何为企业提供帮助?从数据分析到知识管理再到客户服务等等&#xff0c;人工智能聊天机器人…

光伏发电系统模拟及其发电预测开源python工具pvlib

1. 太阳辐照量模拟 pysolar是一个用于计算太阳位置和辐照量的Python库。它是基于python语言编写的&#xff0c;可以方便地在各种python项目中使用。pysolar主要用于计算太阳的位置、太阳高度角、太阳方位角、日出和日落时间等信息。这些信息可以用于太阳能电池板和太阳能集热器…

【设计模式】创建型-抽象工厂模式

文章目录一、抽象工厂模式1.1、产品族、产品等级1.2、抽象工厂模式中的角色1.3、实例一、抽象工厂模式 在工厂方法模式中&#xff0c;每一个具体的工厂子类只能生成一种具体的产品&#xff0c;如果想要生产另外一种产品&#xff0c;就需要重新定义一个抽象工厂类&#xff0c;这…