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

news2024/12/24 0:08:18

目录

针对文件系统进行操作

针对文件内容进行操作


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://www.coloradmin.cn/o/1611496.html

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

相关文章

SQLite R*Tree 模块(三十三)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite FTS3 和 FTS4 扩展(三十二) 下一篇:SQLite轻量级会话扩展&#xff08;三十四&#xff09; 1. 概述 R-Tree 是一个特殊的 专为执行范围查询而设计的索引。R-树最常见的是 用于地理空间系统&#xff0c;其中…

第 2 章:FFmpeg简介

2.1 历史 历史 一些相关术语介绍&#xff1a; 容器&#xff08;Container&#xff09;格式&#xff1a;一种文件封装格式&#xff0c;里边主要包含了流&#xff0c;一般会使用一个特定的后缀名标识&#xff0c;例如.mov、.avi、.wav等。流 &#xff08;Stream&#xff09;&am…

稀碎从零算法笔记Day54-LeetCode:39. 组合总和

题型&#xff1a;数组、树、DFS、回溯 链接&#xff1a;39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数…

Tomcat核心组件深度解析

Server组件 Service组件 连接器Connector组件 容器Container组件

C语言系列文章 | 初识C语言

首先分为几个方面来和各位读者介绍C语言&#xff0c;并在之后的学习过程中不断地和各位读者去分享我学习的经历。 坐好&#xff0c;发车咯~目录如下&#xff1a;1. C语言是什么&#xff1f;2. C语言的历史和辉煌3. 编译器的选择VS20224. VS项目和源⽂件、头⽂件介绍5. 第⼀…

前端css中table表格的属性使用

前端css中table表格的属性使用 一、前言二、常见的表格属性1.边框的样式2.布局和对齐3.间距和填充4.背景和颜色5.字体的样式6.边框的圆角 三、简单的表格&#xff0c;例子11.源码12.源码1效果截图 四、给表格添加动画效果&#xff0c;例子21.源码22.源码2的运行效果 五、结语六…

Vue 指令、计算属性、侦听器

目录 指令 指令修饰符 按键修饰符 ​编辑 v-model修饰符 事件修饰符 v-bind对于样式操作的增强 操作class 对象 数组 操作style v-model应用于其他表单元素 computed计算属性 概念 基础语法 ​编辑 计算属性vs方法 computed计算属性 作用 语法 缓存特性 m…

图像处理的魔法师:Pillow 库探秘

文章目录 图像处理的魔法师&#xff1a;Pillow 库探秘第一部分&#xff1a;背景介绍第二部分&#xff1a;库是什么&#xff1f;第三部分&#xff1a;如何安装这个库&#xff1f;第四部分&#xff1a;库函数使用方法第五部分&#xff1a;场景应用第六部分&#xff1a;常见Bug及解…

Unity射击游戏开发教程:(2)实例化和销毁游戏对象

现在我们有了“飞船”,我们可以在屏幕上移动它,现在我们需要发射一些激光!与宇宙飞船一样,我们将让事情变得简单并使用 Unity 自己的基本形状。舱体的效果很好,所以我们来创建一个。 我们保存了有关位置、旋转和缩放的信息。我们想要缩小这个对象,假设每个轴上缩小到 0.2…

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

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

git远程分支强制覆盖本地分支

目录 第一章、问题1.1&#xff09;报错提示&#xff1a;没有为分支主机或分支配置被跟踪的分支1.2&#xff09;报错分析与解决 第二章、2.1&#xff09;本地误删代码后想要git pull拉取覆盖&#xff1a;失败2.2&#xff09;报错分析和解决 友情提醒: 先看文章目录&#xff0c;…

Java多线程-API

常见API一览 Thread t1 new Thread(() -> {System.out.println("我是线程t1");System.out.println("Hello, World!"); }); t1.start(); // 获取线程名称 getName() // 线程名称默认是Thread-0, Thread-1, ... System.out.println(t1.getName());// 通过…

SpringCloud系列(8)--将服务提供者Provider注册进Eureka Server

前言&#xff1a;上一章节我们介绍了Eureka服务端的安装与配置&#xff0c;本章节则介绍关于微服务如何入职Eureka Server Eureka架构原理图 1、修改provider-payment8001子模块的pom.xml文件&#xff0c;引入Eureka Clinet的依赖&#xff0c;然后reolad一下&#xff0c;下载依…

windows驱动开发-WDM框架(一)

在前面的文章中解释过&#xff0c;NT5.0之后windows确定了新的架构Windows Driver Model (WDM)&#xff0c;在Vista之后又推出了Windows Driver Framework(WDF)&#xff0c;这两个都属于驱动程序框架&#xff0c;那么它们的之间的关系是怎样的&#xff1f; WDF是对WDM进行的封…

学习空间转换-3D转换

1.什么是空间转换&#xff1f; 使用的是transform属性实现元素在空间内的位移&#xff0c;旋转&#xff0c;缩放等效果。 空间&#xff1a;是从坐标轴角度定义的。x,y,z三条坐标轴构成的一个立体空间&#xff0c;Z轴位置与视线方向相同。 所以空间转换也被叫做3D转换 语法&a…

本地消息表模式保障分布式系统最终一致性

系统架构说明 状态转换说明 订单表消息表process_queue库存系统return_queue说明成功失败///订单库回滚成功成功失败//订单系统重发消息成功成功成功失败/Broker自动重试&#xff0c;注意接口幂等成功成功成功库存不足退回/Broker通知回掉&#xff0c;订单/消息作废成功成功成…

【做一名健康的CSDNer】《脱单恋爱秘籍》 —— 让爱情不再是难题

在这个快节奏的数字时代&#xff0c;程序员们以其独特的智慧和专业技能&#xff0c;为世界带来了翻天覆地的变化。然而&#xff0c;当代码和逻辑成为日常&#xff0c;爱情和人际关系的编程似乎变得复杂起来。为了帮助程序员们在爱情的道路上也能取得成功&#xff0c;我们精心打…

统一SQL-支持unpivot列转行

统一SQL介绍 https://www.light-pg.com/docs/LTSQL/current/index.html 源和目标 源数据库&#xff1a;Oracle 目标数据库&#xff1a;TDSQL-MySQL 操作目标 在Oracle中&#xff0c;可以使用unpivot将列转换成行&#xff0c;在TDSQL-MySQL中没有对应的功能&#xff0c;由…

Jenkins和gitlab实现CICD

1 背景 在开发TracerBackend服务的时候&#xff0c;每次更改代码之后需要推送到gitlab&#xff0c;然后ssh登录到Ubuntu的服务器上部署新的代码。服务成功启动之后&#xff0c;在本地执行测试用例&#xff0c;觉得这一套操作流程还是挺复杂的。想起公司的代码发布流程&#xf…

拓展网络技能:利用lua-http库下载www.linkedin.com信息的方法

引言 在当今的数字时代&#xff0c;网络技能的重要性日益凸显。本文将介绍如何使用Lua语言和lua-http库来下载和提取LinkedIn网站的信息&#xff0c;这是一种扩展网络技能的有效方法。 背景介绍 在当今科技潮流中&#xff0c;Lua语言以其轻量级和高效的特性&#xff0c;不仅…