文件与IO

news2024/11/18 10:53:14

一.文件的定义

什么是文件?

文件分为狭义上的文件和广义上的文件

狭义上的文件:文件夹中的文件:包括视频、图片、文本、可执行文件等等......

其中有些文件是有后缀名的,而有一些文件是没有后缀名的

广义上的文件:在Linux系统中,所有的设备都是文件,包括键盘、网卡、硬盘.......

java中存在一个File类,通过File类创建出来的对象时java中的一个普通对象,这个文件对象在系统中不一定存在。

二.File类中常用的方法

①构造方法

②常用方法

三.文件内容的读写

我们可以观察发现:这些方法都是对文件信息进行操作:包括创建,查找,查看,删除,列表,重命名等等....,但是并没有对文件内容进行操作:对文件内容的读写则包括:(Input和Output)(读取和写出)

3.1流和数据输送:

数据传输的过程,我们可以抽象化为流传输(数据流)Stream的过程:通过下图进行理解:

我们进行文件的输入和输出的过程,我们可以理解为数据流传输的过程:比如是从原水池中传输水源到目标水池,我们中间通过缓冲站进行传输,其中,缓冲站的大小是我们可以自己定义的:比如我们传输100L的水,但是缓冲站大小为10L,那就需要分10次运输才能完成(10次IO),如果运输1000L,那么则需要100次运输才能完成

而计算机中关于这个模型的应用场景如下:

比如我们需要30G的内存加载到显示器,那么我们需要将内存先输入到内存,然后通过内存加载到显示器:而我们每次只能往内存中输入(Input)100M的数据,每次内存需要将这100M的数据输出(output)到显示器,再这样多次重复下,最终30G的电影最终被播放在显示器上

通过以上两个例子我们进行总结:对于计算机而言,输入和输出是相对于内存而言的,其它设备将数据送往内存叫数据的输入(input),内存将设备输送到别的地方叫数据的输出(output)。

在java中,将input和output提供了两个抽象类:InputStream(将数据输入到内存)和outPutStream(将数据从内存输出)

而系统中存在着不同类型的文件,包括:文本文件和二进制文件,针对不同的文件类型,java也提供了不同的处理类

①FileInputStream

我们有两种输入方式,一种是直接用int数据接收从文件中读取到的值,另一种是利用数组进行暂时储存

我们通过代码进行说明:

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

/**
 * @author tongchen
 * @create 2023-02-12 21:48
 */
public class PutStream {
    public static void main(String[] args) throws IOException {
        //创建文件输入流
        InputStream fileInputStream = new FileInputStream("D:/360安全浏览器下载/test/aa/bb/test.txt");

        while(true){
            //每次读一个二进制字符
            int read = fileInputStream.read();
            if(read==-1){
                break;
            }
            System.out.print((char)read);

        }
           

            fileInputStream.close();
    }
}
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * @author tongchen
 * @create 2023-02-12 21:53
 */
public class exer02 {
    public static void main(String[] args) throws IOException {
        //创建输入流对象
        FileInputStream fileInputStream = new FileInputStream("D:\\360安全浏览器下载\\test\\aa\\bb\\test.txt");
        //每次使用字符数组对的方式进行读取
        byte[] reads=new byte[1024];
        while(true){
            int read = fileInputStream.read(reads);
            if(read==-1){
                break;

            }
            for (int i = 0; i <read ; i++) {
                System.out.print((char) reads[i]);
            }

        }

    }
}

当我们采用一个一个数据进行读取时,我们发现其源码给出的范围是:-1-255,这个二进制数字是对应着

ASCII码值的,一旦超出这个范围,就有可能出现乱码问题。(由于编码方式的问题,汉字采用的是utf-8的编码方式,ASCII码的编码方式无法对汉字进行输入和输出)

②FileOutputStream

写出的时候同样如此,我们既可以一个一个数据进行写入,同时我们也可以通过数组的方式进行写入

我们依然通过代码的方式对这两种方式进行举例:

public class exer03 {
    public static void main(String[] args) throws IOException {
        //创建文件输出流
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\360安全浏览器下载\\test\\aa\\bb\\test.txt");
        //每次读入一个二进制文件
        fileOutputStream.write(69);
        fileOutputStream.write(70);
        fileOutputStream.write(71);
        //一定要注意的是:我们在写入时会将原来的数据全部清除
       
        fileOutputStream.flush();
       
        fileOutputStream.close();
    }
}
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author tongchen
 * @create 2023-02-12 22:04
 */
public class exer04 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\360安全浏览器下载\\test\\aa\\bb/test.txt");
        byte[]inserts=new byte[1024];
        for (int i = 0; i <127 ; i++) {
            inserts[i]=(byte) i;
        }
        fileOutputStream.write(inserts);
    }
fileoutputStream.flush();
fileoutputStream.close();

}

我们在往文件中写入数据时,会将文件之前的内容进行覆盖。

写入的时候我们需要注意的一个点:flush()方法,该方法用于刷新缓存区:一般而言,我们每次进行write()操作,并不是直接将数据写入硬盘中,而是先写入缓存区(避免过多次数的IO,提高效率),将缓存区写满之后再将数据存入硬盘,但是很多情况下我们需要把数据立即写入硬盘,所以需要我们手动进行刷新,将缓存区中的数据写到硬盘中。

我们再介绍一个点:关于文件手动关闭的重要性:我们都知道的是,每个进程的启动都会开辟一些资源,其中有一项是文件描述符表,我们在操作进程时打开的任何文件都是一个文件描述符,会被存入文件描述符表,我们可以将文件描述符表理解为一个数组:如果我们仅仅只是不断地往数组中加元素(文件描述符),而不进行及时地销毁,那么必然无法避免一种情况的发生:文件描述符表被填满了,这时会导致进程卡死,这时只能通过重启进程来解决,这时会导致很多数据的丢失或者其他情况,问题很严重,所以我们需要在用完一个文件之后进行关闭(将文件在文件描述符表中删除)

在write()方法中我们虽然发现源码中没有对数值范围的限制,但是事实上当我们输出的字符一旦超过ASCII码的数值范围,编码格式就会发生改变,则会产生乱码等问题,所以一般我们很少直接使用二进制流的方式向文件中输入内容,而是使用print()使用字符串和指定编码格式进行输入,从而降低出现乱码问题的可能性。

③FileReader

filereader和filewriter都是基于字符的输入输出方式,通过这种方式我们可以进行汉字的输入和输出

我们通过代码将其的使用方式进行举例:

import java.io.FileReader;
import java.io.IOException;

/**
 * @author tongchen
 * @create 2023-02-12 22:10
 */
public class exer07{
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("D:\\360安全浏览器下载\\test\\aa\\bb/test.txt");
        char[] chars = new char[1024];
        while(true){
            int read = fileReader.read(chars);
            if (read==-1){
                break;
            }
            System.out.print(chars);
        }
    }
}

④FileWriter

我们通过代码将其的使用方式进行举例:

import java.io.FileWriter;
import java.io.IOException;

/**
 * @author tongchen
 * @create 2023-02-12 22:07
 */
public class exer05 {
    public static void main(String[] args) throws IOException {
        //创建字符写入流

        FileWriter fileWriter = new FileWriter("D:\\360安全浏览器下载\\test\\aa\\bb/test.txt");
        fileWriter.write("你爱我");
        fileWriter.write("我爱你");
        fileWriter.write("相亲相爱一家人");

        fileWriter.flush();
        fileWriter.close();
    }
}

关于利用Scanner个和PrintWriter简化读写操作:

通过这两种方式依然可以实现对汉字的是输入和输出

public class PutStream {
    public static void main(String[] args) throws IOException {
        //创建文件输入流
        InputStream fileInputStream = new FileInputStream("D:/360安全浏览器下载/test/aa/bb/test.txt");
        Scanner scan=new Scanner(fileInputStream,"UTF-8");
        System.out.println(fileInputStream.read());
        //在文件中读取下一行
        while(scan.hasNextLine()){
            String s = scan.nextLine();
            System.out.println(s);

        }
           scan.close();

            fileInputStream.close();
    }
}
public class exer03 {
    public static void main(String[] args) throws IOException {
        //创建文件输出流
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\360安全浏览器下载\\test\\aa\\bb\\test.txt");
        PrintWriter printWriter = new PrintWriter(fileOutputStream);
        //每次读入一个二进制文件
        fileOutputStream.write(69);
        fileOutputStream.write(70);
        fileOutputStream.write(71);
        //一定要注意的是:我们在写入时会将原来的数据全部清除
        printWriter.println("hdsjhdak");
        printWriter.println("死锁");
        fileOutputStream.flush();
        printWriter.flush();
        printWriter.close();
        fileOutputStream.close();
    }
}

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

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

相关文章

Unix Linux、MAC、Window 如何安装配置环境?都在这里啦~

嗨害大家好鸭&#xff01;我是小熊猫~ 这次将向大家介绍如何在本地搭建Python开发环境。 Python可应用于多平台包括 Linux 和 Mac OS X。 你可以通过终端窗口输入 “python” 命令来查看本地是否已经安装Python以及Python的安装版本。 源码资料电子书:点击此处跳转文末名片获…

PHP代码审计神器——RIPS个人汉化版(2017年老文)

一、RIPS简介 RIPS是一款PHP开发的开源的PHP代码审计工具&#xff0c;由国外的安全研究者Johannes Dahse开发&#xff0c;目前开源的最新版本是0.55。 程序小巧玲珑&#xff0c;仅有不到500kb&#xff0c;其中的PHP语法分析非常精准&#xff0c;可以实现跨文件变量和函数追踪…

Virtualbox安装Windows11教程,提供虚机专用镜像下载。

微软在Windows11安装过程中增加了TPM2.0安全验证&#xff0c;所以一些老旧的电脑或者不带TPM认证协议的虚拟机都无法安装系统镜像。 这给我们体验尝鲜带来了一些小小的困扰。其实有2种解决方法可以在虚拟机中体验到Windows11带来的变化。 方法一 虚拟机启动时先加载PE系统镜…

Python 版本的常见算法模板(一)

文章目录前言排序模板排序算法归并排序KMP图邻接表Floyd 算法DijkstraBellMan-Ford 算法SPFA 算法Prim 算法Kruskra 算法染色法Hunger算法前言 翻了翻自己以前写的一些博文&#xff0c;发现的话&#xff0c;还是有一些误区没有写好的&#xff0c;所以的话这里的重新写一下&…

年薪40W的测试工程师被裁,回怼的一番话,令人沉思...

腾讯一位测试工程师被炒&#xff0c;回怼到:“反正我有技术&#xff0c;在哪不一样” 在腾讯上班的朋友给我分享了今天在他公司遇到的事情&#xff0c;他部门一位测试工程师被炒&#xff0c;具体原因好像就是跟上司闹矛盾&#xff0c;部门的都觉得非常可惜&#xff0c;因为他算…

本地修改的文件,使用git stash暂存之后不小心将暂存区清空,重新找回之前被暂存的文件

概述 问题 日常使用git 时&#xff0c;将本地所做的修改使用git stash暂存&#xff0c;使用git pull拉取代码之后&#xff0c;之间用git stash clear将git stash暂存的内容删除掉了。本文讲述如何恢复git stash clear掉的暂存区代码。 解决方法 执行指令 git log --graph -…

银行存取款程序设计(JAVA基础案例教程-黑马程序员编著-第三章-课后作业)

【案例3-2】银行存取款程序设计 【案例介绍】 案例描述 银行存取款的流程是人们非常熟悉的事情&#xff0c;用户可在银行对自己的资金账户进行存款、取款、查询余额等操作&#xff0c;极大的便利了人民群众对资金的管理。 本任务要求&#xff0c;使用所学知识编写一个银行存…

spring项目中使用策略模式

小白看了Java设计模式一书&#xff0c;晕晕乎乎&#xff0c;好像懂了&#xff0c;又好像啥都没懂。对照着书本一行行手打代码&#xff0c;完毕&#xff0c;执行&#xff0c;ok&#xff0c;设计模式已掌握。但到了项目中却又茫然。 小白我啊&#xff0c;今天尝试一下在自己的dem…

【思科设备,最常用的命令是下面这些吗!】

​在调试思科设备时&#xff0c;我们会经常使用各种命令去实现&#xff0c;但是使用最为频繁的有哪些&#xff1f;我们来看看下面频繁出现但是又非常有用且常用的命令&#xff01; 1、&#xff1f; 在使用命令行时&#xff0c;我们不可能记住所有的命令&#xff0c;有时候只能…

git的一些常用指令

1&#xff09;拷贝一个 Git 仓库到本地&#xff0c;让自己能够查看该项目&#xff0c;或者进行修改。 git clone 远程git仓库地址2&#xff09;初始化本地git仓库。 git init 3&#xff09;监控工作区的状态树&#xff0c;会把工作时的所有变化提交到暂存区&#xff0c;这里…

(七)、首页列表数据渲染【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

1&#xff0c;获取首页列表数据 1.1在index页面中编写从数据库中获取首页列表数据的方法 //获取首页列表数据getData() {let artTemp db.collection("quanzi_articles").getTemp();let userTemp db.collection("uni-id-users").field("_id,usernam…

智慧校园人脸识别系统源码

智慧校园人脸识别系统源码 技术架构&#xff1a; 后端&#xff1a;Java 框架&#xff1a;springboot 前端页面&#xff1a;vue element-ui 小程序&#xff1a;小程序原生开发 电子班牌&#xff1a;Java Android 源码有演示&#xff0c;可正常上线运营可授权。 随着智慧校…

在成都的哪个培训机构学习Java好呢?

自从小课06年进入成都这个IT培训市场以来&#xff0c;短短十几年&#xff0c;招过很多学员&#xff0c;也见证过很多机构的起起落落。心中有万分的感慨&#xff0c;总结下来有这几点分享给大家&#xff0c;在选择培训机构时能看清本质&#xff0c;找到适合自己靠谱的机构学Java…

Go大道至简之抓取网页

目录前期准备环境教程浏览器启动命令启动Rod启动浏览器Rod自动查找浏览器路径并启动输入和点击、Enter动作多页面抓取前期准备 环境 Go版本大于等于1.18Go模块源更换&#xff0c;加速模块下载go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,directRod模块 Rod…

4年经验来面试20K的测试岗,连基础都不会,还不如招应届生。

公司前段时间缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在10-20k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。 看简历很多都是3、4年工作经验&#xf…

chatGPT做了这么一道数学题,我陷入了沉思

已知 2cos23cosasina−3sin2a1,并且a∈(−32π,−π)2cos^{2}3cosasina-3sin^{2}a1 ,并且a\in(-\frac{3}{2}\pi,-\pi) 2cos23cosasina−3sin2a1,并且a∈(−23​π,−π) 求 2sin(π−a)−3sin(π2a))4sina−9cosa\frac{2sin(\pi-a)-3sin(\frac{\pi}{2}a))}{4sina-9cosa} 4sina−…

Sage X3 ERP的称重插件帮助食品和化工企业实现精细化管理

目录 需要称重插件管理的行业客户 Sage X3 ERP称重插件管理的两个关键单位 Sage X3 ERP称重插件的特色 Sage X3 ERP称重插件管理的重要性 需要称重插件管理的行业客户 术语“实际重量”表示在销售和运输时捕获的物品重量。生产销售家禽、肥料、钢材或任何其他需要跟踪实…

【Spark分布式内存计算框架——Spark SQL】4. DataFrame(上)

3.1 DataFrame是什么 在Spark中&#xff0c;DataFrame是一种以RDD为基础的分布式数据集&#xff0c;类似于传统数据库中的二维表格。DataFrame与RDD的主要区别在于&#xff0c;前者带有schema元信息&#xff0c;即DataFrame所表示的二维表数据集的每一列都带有名称和类型。 使…

chatGPT 配合excel /maxscript使用_初试

EXCEL 配合chatGPT方法一&#xff1a;利用excel的開發工具1打開excel的VB编辑器&#xff1a;如果頂部菜單上沒有看到開發工具&#xff0c;需要先按下面步驟打開開發工具&#xff1a;這樣按上面步驟就可以打開excel的開發工具~ 然後點擊VB~ 2让chatGPT帮忙写脚本在chatGPT上提问…

Tomcat是如何隔离Web应用的

Tomcat通过自定义的类加载器WebAppClassLoader打破了双亲委托机制&#xff0c;目的就是为了优化加载Web应用目录下的类。Tomcat 作为 Servlet 容器&#xff0c;它负责加载我们Servlet 类&#xff0c;此外它还负责加载 Servlet 所依赖的 JAR 包。并且Tomcat 本身也是也是一个 Ja…