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即可。这样新写入的数据就会追加在之前写的内容末尾。

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

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

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

相关文章

javaScript基础3

javaScript 一.对象1.概念2.创建对象的三种方法(1).字面量创建&#xff08;利用{}&#xff09;(2)变量、属性、函数、方法的区别(3).new Object创建(4).构造函数 3.new关键字的执行过程4.遍历对象&#xff08;for..in) 二.内置对象1.了解2.math对象3.日期对象&#xff08;构造函…

用 LM Studio 1 分钟搭建可在本地运行大型语言模型平台替代 ChatGPT

&#x1f4cc; 简介 LM Studio是一个允许用户在本地离线运行大型语言模型&#xff08;LLMs&#xff09;的平台&#xff0c;它提供了一种便捷的方式来使用和测试这些先进的机器学习模型&#xff0c;而无需依赖于互联网连接。以下是LM Studio的一些关键特性&#xff1a; 脱机&am…

Web界面加持!数据库备份神器,助你轻松备份数据!

带Web界面的数据库/文件备份增强工具。原理&#xff1a;执行自定义shell命令输出文件&#xff0c;增强备份功能。同时支持: 文件、mysql、postgres... 支持自定义命令 支持执行shell输出的文件备份&#xff0c;原理上支持各种数据库/文件备份 支持备份周期设置&#xff0c;几分…

面试二十、BST二叉排序树

静态查找表&#xff1a; 当有序表是静态的&#xff0c;即其内容在创建后不再发生变化&#xff0c;适合使用顺序表作为存储结构。顺序表通过数组实现&#xff0c;可以提供常数时间的随机访问&#xff0c;因此在静态情况下&#xff0c;适合顺序表存储&#xff0c;这样可以简化数据…

项目暂停和重启运行,命令如何实现?

要通过命令行实现项目的暂停和重启运行&#xff0c;可以使用以下步骤&#xff1a; 1.查找项目进程ID&#xff1a;首先&#xff0c;你需要找到正在运行项目的进程ID&#xff08;PID&#xff09;。你可以使用 ps 命令来查找正在运行的进程&#xff0c;例如&#xff1a; ps aux …

如何批量修改图片的尺寸?轻松教你批量修改图片尺寸!三个快速有简单的方法

一&#xff0c;引言 在现代社会中&#xff0c;随着数字技术的快速发展&#xff0c;图片已经成为了我们日常生活中不可或缺的一部分。无论是在社交媒体上分享生活点滴&#xff0c;还是在工作中展示产品、宣传品牌&#xff0c;图片都扮演着重要的角色。然而&#xff0c;很多时候…

实现Spring底层机制(三)

文章目录 阶段4—实现BeanPostProcessor机制1.文件目录2.初始化方法实现1.编写初始化接口InitializingBean.java2.MonsterService.java实现初始化接口3.容器中的createBean方法增加初始化逻辑&#xff0c;判断对象类型是否是InitializingBean的子类型&#xff0c;如果是&#x…

在电脑上安装Linux?有手就行!

文章目录 安装虚拟机管理软件VM下载centos镜像文件开始安装创建虚拟机打开虚拟机&#xff0c;开始安装程序安装启动程序测试光盘选择语言进行安装前的配置安装 安装后操作 安装虚拟机管理软件VM 官方正版VMware下载&#xff08;16 pro&#xff09;&#xff1a;https://www.ali…

探索亚马逊云科技「生成式 AI 精英速成计划」

目录 前言「生成式 AI 精英速成计划」技术开发课程学习课程学习 总结 前言 亚马逊云科技&#xff08;Amazon Web Services&#xff0c;简称AWS&#xff09;作为全球领先的云计算服务提供商&#xff0c;一直以来在推动人工智能&#xff08;AI&#xff09;领域的发展中扮演着重要…

服务器 BMC(基板管理控制器,Baseboard Management Controller)认知

写在前面 工作中遇到&#xff0c;简单整理博文内容涉及 BMC 基本认知理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候&#xff0c;眼前的风景已经和从前不一样了。——村上春树 基板管理控制器&#xff08;BMC&…

rust 学习笔记(13-19)

13 迭代器与闭包 Rust 的设计灵感来源于很多现存的语言和技术。其中一个显著的影响就是 函数式编程&#xff08;functional programming&#xff09;。函数式编程风格通常包含将函数作为参数值或其他函数的返回值、将函数赋值给变量以供之后执行等等。 闭包&#xff08;Closu…

【学习】服务器解决:重新分配同样端口号后,连不上VScode

原来服务器分配的环境有问题&#xff0c;重新分配了一下。还是同样的端口号&#xff0c;Xshell和xftp能够连接上&#xff0c;但是VScode连接不上。 问题解决: 清除本地 SSH 缓存中与远程主机相关的条目可以通过编辑 known_hosts 文件来实现。这个文件包含了您曾经连接过的远程主…

API请求报错 Required request body is missing问题解决

背景 在进行调用的时候&#xff0c;加载方法&#xff0c;提示以下错误 错误信息如下&#xff1a; {"code": 10001,"msg": "Required request body is missing: XXX","data": null,"extra": null }Required request body…

2015NOIP普及组真题 3. 求和

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1971 核心思想&#xff1a; 本题的约束条件有两个&#xff1a; 条件1、colorx colorz 条件2、x、y、z的坐标满足 y − x z − y&#xff08;即 y 在 x 和 z 的中心位置&#xff09; …

ESP32学习第一天-ESP32点亮LED,按键控制LED状态,LED流水灯

第一天使用到的函数: 函数第一个参数设置哪一个引脚&#xff0c;第二个参数设置引脚模式。 pinMode(led_pin,OUTPUT); //设置引脚模式 函数的第一个参数设置哪一个引脚&#xff0c;第二个参数设置是高电平还是低电平。 digitalWrite(led_pin,HIGH);//将引脚电平拉高 #incl…

spring一二三级缓存和@Lazy解决循环依赖流程

简单对象指的是 实例化后还没有属性注入的时候的早期bean lambda表达式用于判断a是否存在aop代理 假如a和b循环依赖&#xff0c;a实例化时&#xff0c; bean创建流程如下&#xff1a; 0&#xff0c;创建一个set记录当前正在实例化的bean&#xff0c; 1.实例化a的简单对象时…

电脑问题快速判断

电脑开机没有任何反应 检查电源 检查电源是否有问题或损坏&#xff0c;可以短接方法检测 板电源卡口对自己接第四或第五根线&#xff0c;若风扇匀速转动&#xff0c;电源无问题&#xff0c;若不转动或转一下停一下&#xff0c;电源有问题 检查内部连线 确保主板上的线插的…

linux下编译c++程序报错“undefined reference to `std::allocator<char>::allocator()‘”

问题 linux下编译c程序报错“undefined reference to std::allocator::allocator()”。 原因 找不到c标准库文件。 解决办法 开始尝试给gcc指令添加-L和-l选项指定库路径和库文件名&#xff0c;但是一直不成功&#xff0c;后来把gcc改为g就可以了。

Google Play App Store API 获取谷歌安卓应用商城app数据接口

iDataRiver平台 https://www.idatariver.com/zh-cn/ 提供开箱即用的谷歌安卓应用商城google play app store数据采集API&#xff0c;供用户按需调用。 接口使用详情请参考Google Play App Store接口文档 接口列表 1. 获取指定app的基础信息 参数类型是否必填默认值示例值描…

重磅发布 | 《网络安全专用产品指南》(第一版)

2017年6月1日&#xff0c;《中华人民共和国网络安全法》正式实施&#xff0c;明确规定“网络关键设备和网络安全专用产品应当按照相关国家标准的强制性要求&#xff0c;由具备资格的机构安全认证合格或者安全检测符合要求后&#xff0c;方可销售或者提供。国家网信部门会同国务…