java中File类和输入输出流的用法

目录

针对文件系统进行操作

针对文件内容进行操作


java针对文件操作可以分为两种:1)针对文件系统进行操作,如创建文件,删除文件,创建目录,重命名文件等。

2)针对文件内容进行操作,如读文件,写文件等。

针对文件系统进行操作

我们可以使用File类对文件系统进行操作。

java标准库提供了File类(出自java.io包里,和输入输出相关的内容就在这个包里)表示一个文件,进一步的通过File提供的方法,就可以进行文件系统操作了。

我们可以通过以下方法创建File类的对象:

File f = new File("./test.txt");

File中提供了很多文件操作的方法:

演示获取文件路径:

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

public class Demo1 {
    public static void main(String[] args) throws IOException {
        File f = new File("./test.txt");
       // f.createNewFile();
        System.out.println(f.getParent());
        System.out.println(f.getPath());
        System.out.println(f.getName());
        System.out.println(f.getAbsolutePath());
        System.out.println(f.getCanonicalPath());
    }
}

注:当我们在java中运行程序的时候,基准目录是什么呢?此时基准目录是项目所在目录

关于deleteOnExit方法:有些程序运行过程中,会产生“临时文件”,就需要在进程结束之后,自动删除掉,这样的情况就可以使用deleteOnExit方法来实现。

针对文件内容进行操作

  文件内容操作就是对文件中的具体内容进行操作,如文件打开,关闭,读写。java中可以通过“流”(stream)这样的一组类,进行上述操作。“流”的方式读写文件方式非常灵活,我们这里就使用“文件流”。

java中,用来操作文件内容的“流”是一组类。

java中的文件流可以分为两组:

1)节流 : 以字节为单位,读写数据的。 如InputStream , OutputStream 。操纵的是二进制文件。

2)字符流: 以字符为单位,读写数据的。如Reader, Writer。操纵的是文本文件。

使用的核心步骤大体如下:

1、通过构造方法,打开文件。

2、通过read方法读文件内容。

3、通过write方法写文件内容。

4、通过close方法关闭文件。

由于InputStream是一个抽象类,我们不能直接new它,但是我们可以对它的子类FileInputStream和FIleOutputStream创建对象,就是文件输入输出流。

FileInputStream

先讲FileInputStream类的使用,首先创建一个对象,也就是打开一个文件

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

如果文件存在,打开成功,接下来就可以读取文件内容。有以下三个方法:

第一个方法:无参数,一次读取一个字节读取到的内容通过返回值来表示。注意,此处返回的值是int类型,原因如下:1)为了能够表示读到文件末尾的情况,当返回-1时,就代表读到文件末尾了。

2)为了确保读到的数据都是正数。对于字节这样的数据来说,是不需要进行算术运算的。比如,有一个图片,图片里由很多的字节构成,每个字节都有特定的含义,对于这里的字节进行加减乘除是没有意义的。所以,“字节”这样的概念,本身应该是“无符号的”,此处通过int 类型就可以确保读出来的字节都是整数,按照“无符号”的方式来处理了。

第二个方法:带有一个参数 byte[]

在使用这个方法时,我们要先创建一个byte类型的数组,利用数组作为容器来读取文件数据

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

先准备好空的数组,方法执行完毕之后,就会把读到的数据填写到byte数组中。一次读取多少数据,取决于数组的大小。返回值int表示这次实际读取到多少字节了。

为何要用数组?

  数组相当于文件内容的容器,第一种read方法,一次只读一个字节,操作频次高,但是一次读的东西少。(1次读1个字节,和一次读1kb个字节,开销是差不多的)而如果我们创建一个1024大小的数组,一次就可读1024个字节。低效操作次数少了,一次读的东西更多,整体的速度就更快了。相当于嗑瓜子,一次丢一个瓜子皮,一次对100个瓜子皮,开销是差不多的。

这种写法,在java中不太常见,是用参数来作为函数的返回结果,称为“输出型函数”。

第二个方法,读到的数据是往整个数组填充。而第三个方法是指定填充数组的一部分,指从offset下标开始,最多填充len这么长。

有的时候,可能需要一个数组里面不同的部分表示不同含义的数据。可能第一次read,填充第一部分,第二次read,填充第二部分。

注:千万别忘了在操作完文件之后,关闭文件。因为在打开文件的时候,会在操作系统内核,PCB结构体中,给“文件描述符表”(就是一个顺序表)添加一个元素,这个元素表示当前打开的文件的相关信息。但是文件描述符表长度存在上限,并且是不能扩容的。当进行close的时候,就会释放这个文件描述符表上对应的元素。一旦打开文件而不关闭,就会使文件描述符表被占满,一旦被占满之后,尝试再次打开,就会打开文件失败(其他操作,如网络通信也可能受到影响)。

我们可以使用以下方法避免:

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

public class Demo8 {
    public static void main(String[] args) {
        try (InputStream inputStream = new FileInputStream("./test.txt")){
          byte[] bytes = new byte[1024];
          int n = inputStream.read(bytes);
            for (int i = 0; i < n; i++) {
                System.out.printf("0x%x ",bytes[i] );
            }

        }
        catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

把流对象的创建写到try()里之后,此时,代码执行出了try{}时,就会自动调用inputStream的close了。注意,务必要实现Closeable接口的类,才能够放到try()里。

OutputStream

OutputStream的用法和InputStream基本一致,只是核心操作从read变成了write。

第一个方法:一次write一个字节,参数是int类型。

第二个方法:一次write若干个字节,会把参数数组里所有的字节都写入文件中。

第三个方法:一次write若干字节,把数组从offset下标开始,连续写len个字节。

次数写的这几个数字,就是abcd的ascii值。

注意,按照默认写方式打开文件的时候,会把文件原有的内容清空掉。(不是write清空的,而是打开操作清空的)。但是如果使用“追加写”方式打开,就可以了。

只需要创建文件对象的时候,将append参数设为true即可。这样新写入的数据就会追加在之前写的内容末尾。

以上关于文件类,希望对你有所帮助。

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

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

相关文章

【webrtc】m98 RoundRobinPacketQueue的优先级处理

m98 代码 PacedSender::EnqueuePackets 的调用者可能是多个地方,所以这个要加锁保护。RoundRobinPacketQueue 本身是没有锁的发现m98和新版本不同,参考:【webrtc】m114自己实现的PrioritizedPacketQueuepush和pop都是RtpPacketToSend 但是实际上,内部是封装为QueuedPacket 处…

Darknet框架优化介绍

一、DarkNet框架简介 1.DarkNet的简介 Darknet是一个完全使用C语言编写的人工智能框架&#xff0c;可以使用CUDA的开源框架。主要应用于图像识别领域。 它具有可移植性好&#xff0c;安装间接&#xff0c;查看源码方便等优势&#xff0c;提供了OpenCV等附加选项&#xff0c;还…

基于SSM+Jsp+Mysql的电子商城系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

hackthebox - Redeemer

2024.4.19 TASK 1 Which TCP port is open on the machine? 6379 TASK 2 Which service is running on the port that is open on the machine? redis TASK 3 What type of database is Redis? Choose from the following options: (i) In-memory Database, (ii) Traditiona…

Java -集合-知识点

本文详细介绍了Java中集合的基本概念、常用数据结构和核心特性。通过学习本文&#xff0c;读者可以了解到Java集合框架的核心接口和实现类&#xff0c;掌握各种数据结构在不同场景下的应用方法和优劣势&#xff0c;以及如何使用集合框架提供的方法进行数据操作和处理。同时&…

智慧公厕是如何诞生的?

在城市化进程中&#xff0c;公共卫生设施的建设一直是重要议题之一。而随着科技的不断发展&#xff0c;智慧公厕作为一种创新的解决方案&#xff0c;逐渐成为了现代城市管理的亮点。那么&#xff0c;智慧公厕是如何产生的呢&#xff1f; 一、城市化进程的推动 城市人口的增加和…

[阅读笔记16][Orca-2]Teaching Small Language Models How to Reason

接下来是Orca-2&#xff0c;这篇是微软在23年11月发表的论文&#xff0c;在Orca-1的基础上又进行了一些改进。 作者希望教会Orca-2各种推理策略&#xff0c;例如逐步思考、回忆然后回答、先回忆再推理再回答、直接生成回答等等策略。并且Orca-2应该能针对不同任务应该使用最合适…

使用PHP开发体育赛事直播平台,有这些缺点和优点

"东莞梦幻网络科技"作为体育直播平台开发领域的领导者&#xff0c;选择使用PHP开发体育赛事直播平台的现成源码&#xff0c;为什么会选择该语言&#xff0c;背后的选择理由可以从该技术的优点和缺点中找到答案。 一、优点1、易学易用与快速开发&#xff1a;PHP语言语…

为电路提供参考电压(基准电压) - 齐纳二极管的使用

在电路中通常需要用到参考电压&#xff0c;即提供一个恒定的精确的电压值。比如稳压电路、比较器电路、微控制器的Vref&#xff0c;这些电路都需要提供参考电压。很多厂家都提供了参考电压芯片&#xff0c;不过最简单最省钱的方式是使用齐纳二极管。 齐纳二极管 齐纳二极管也是…

OSI网络七层协议 ——(随手笔记)

1.OSI OSI&#xff08;Open System Interconnect&#xff09;&#xff0c;即开放式系统互连。 一般都叫OSI参考模型&#xff0c;是ISO组织在1985年研究的网络互连模型。该体系结构标准定义了网络互连的七层框架&#xff08;物理层、数据链路层、网络层、传输层、会话层、表示层…

【MATLAB基础绘图第21棒】绘制比例弦图 (Chord Diagram)

MATLAB绘制比例弦图 Chord Diagram 1 简介1.1 弦图简介1.2 比例弦图简介 2 MATLAB绘制比例弦图2.1 数据准备2.2 基本绘制2.3 添加方向箭头2.4 添加绘图间隙2.5 添加刻度2.6 修改标签2.7 颜色设置2.8 弧块及弦属性设置2.8.1 弧块属性设置2.8.2 弦属性设置 2.9 字体设置 参考 1 简…

python数据分析pyecharts【饼状图、直方图、词云、地图】

目录 饼状图 直方图 词云 地图 饼状图 from pyecharts.charts import Pie from pyecharts import options as optsdata {神农架林区: 2.6016,恩施州: 3.0729,十堰市: 3.4300,宜昌市: 3.4555,襄阳市: 4.0543,咸宁市: 4.1145,荆门市: 4.1777,潜江市: 4.2574,黄冈市: 4.40…

C++智能指针(二十)

一.RAII&#xff08;Resource Acquisition Is Initialization&#xff09; RAII资源获取即初始化&#xff0c;RAII的思想就是在构造时初始化资源&#xff0c;或者托管已经构造的资源。在析构的时候释放资源。一般不允许复制或赋值&#xff0c;并且提供若干的资源访问的方法。比…

OpenHarmony其他工具类—lua

简介 Lua是一种功能强大、高效、轻量级、可嵌入的脚本语言。 支持过程编程、面向对象编程、函数编程、数据驱动编程和数据描述。 下载安装 直接在OpenHarmony-SIG仓中搜索lua并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 将下载的lua库代码存在以下路径&#…

C# 将 TextBox 绑定为 KindEditor 富文本

目录 关于 KindEditor 绑定设计 部署 KindEditor 实现代码 小结 关于 KindEditor KindEditor 基于JavaScript 编写&#xff0c;可以与众多WEB应用程序结合。KindEditor 依靠出色的用户体验和领先的技术提供富文本编辑功能&#xff0c;是一款非常受欢迎的HTML在线编辑器。…

【FreeRTOS】使用CubeMX快速移植FreeRTOS工程到蓝桥杯开发板(STM32G431RBT6)

使用CubeMX快速创建FreeRTOS工程到蓝桥杯开发板&#xff08;STM32G431RBT6&#xff09; CubeMX配置CubeMX基础工程的配置☆FreeRTOS相关配置FreeRTOS配置选项卡的解释 软件工程架构与程序设计小综合&#xff1a;☆任务的创建删除、挂起与恢复设计cubexMX配置创建任务软件程序设…

高频前端面试题汇总之JavaScript篇(上)

一、数据类型 1. JavaScript有哪些数据类型&#xff0c;它们的区别&#xff1f; JavaScript共有八种数据类型&#xff0c;分别是 Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt。 其中 Symbol 和 BigInt 是ES6 中新增的数据类型&#xff1a; Symbol 代…

关于 Windows10 计算机丢失 MSVCP120.dll 的解决方法

今天学长跟平时一样打开电脑开始发布文章需要用到Adobe Photoshop CC 2018的时候居然给我来个Photoshop.exe-系统错误、无法启动此程序&#xff0c;因为计算机中丢失MSVCP120.dll 尝试重新安装该程序以解决此问题&#xff0c;安装上面的说明重新安装了我的Photoshop CC 打开还是…

关于CAS

什么是CAS: CAS:Compare And Swap&#xff0c;比较且交换。 CAS中有三个参数&#xff1a;1.内存中原数据的值V 2.预期值A 3.修改后的数据B Compare&#xff1a;V与A会先比较是否一样 Swap&#xff1a;如果V与A一致&#xff0c;那么就将B写入V 返回操作是否成功 伪代码&…

椋鸟数据结构笔记#10:排序·中

文章目录 四、归并排序时间复杂度实现递归实现非递归实现 测试稳定性 五、非比较排序5.1 计数排序时间复杂度实现测试局限性 5.2 桶排序时间复杂度实现测试 5.3 基数排序时间复杂度实现测试局限性 萌新的学习笔记&#xff0c;写错了恳请斧正。 四、归并排序 归并排序是一种非常…