Java 基础--File - IO流(2)

I/O流

定义

数据从硬盘流向内存为输入流,数据从内存流向硬盘为输出流。输入也叫读取数据,输出也叫写出数据。

IO分类

1.按照数据的流向分为:输入流和输出流

①输入流:把数据从其他设备上读取到内存中的流

②输出流:把数据从内存中写出到其他设备上的流

2.按照功能类型分为:字节流和字符流

①字节流:以字节为单位,读写数据的流

②字符流:以字符为单位,读写数据的流

字节流和字符流的顶级父类

字节流:①字节输入流:InputStream

②字节输出流:OutputStream

字符流:①字符输入流:Reader

②字符输出流:Writer

注:这些都是抽象父类,不能直接使用,要使用他们的子实现类

字节输出流(OutputStream)

一切皆为字节,我们存储的数据,文件,图片等都是以二进制数字的形式保存,都是一个一个的字节,传输的时候也是一样。java.io.OutputStream抽象类是表示字节输出流的所有类的父类,将指定的字节信息写出到目的地。

1.字节输出流的基本共性功能方法:

①public void close():关闭此输出流并释放与此流相关联的任何系统资源当完成流的操作时,必须调用此方法,释放系统资源。

②public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。

③public void write(byte[] b, int off, int len)` :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。

④public abstract void write(int b):将指定的字节输出。

FileOutputStream类(文件字节输出流)

OutputStream的子类,用于将数据写出到文件

构造方法

1.public FileOutputStream(File file):创建文件输出流以写入由指定的File对象表示的文件

        // 使用File对象创建流对象
        File file = new File("a.txt");
        FileOutputStream fos = new FileOutputStream(file);

2.public FileOutputStream(String name):创建文件输出流以指定的名称写入文件

        // 使用文件名称创建流对象
        FileOutputStream fos = new FileOutputStream("b.txt");

注:如果目标文件不存在,则创建,若存在,则覆盖。

常用方法:

1.写出字节:write(int b) 方法,每次可以写出一个字节数据

        FileOutputStream fos = new FileOutputStream(“D:/test/test.txt”);
        fos.write(97);
        fos.close();//文件中会写出a

注:虽然参数为int类型四个字节,但是只会保留一个字节的信息写出,因为这是字节输出流,一个字节一个字节输出,只会保留我们输出的那个字节。

2.写出字节数组:write(byte[] b),每次可以写出数组中的数据

        File file = new File("D:/test/test.txt");
        FileOutputStream fos = new FileOutputStream(file);
        //写出一个字节数组大小的数据
        byte[] b={97,98,99,100};
        fos.write(b);
        byte[] b1="今天真好看".getBytes();
        fos.write(b1);
        fos.close();//写入abcd今天真好看

3.写出指定长度字节数组:write(byte[] b, int off, int len),每次写出从off索引开始,len个字节

        File file = new File("D:/test/test.txt");
        FileOutputStream fos = new FileOutputStream(file);
        //写出数组中指定长度的字节数据
        byte[] b={97,98,99,100};
        fos.write(b,1,2);
        fos.close();//写入bc

4.数据追加续写

public FileOutputStream(File file/String name,boolean append):这个构造方法,参数中需要传入一个boolean类型的值,true表示追加数据,false表示清空原有数据,不写的话默认是false

        File file = new File("D:/test/test.txt");
        FileOutputStream fos = new FileOutputStream(file,true);
        //追加数据
        byte[] b={97,98,99,100};
        fos.write(b,1,2);
        fos.close();//写入bcbc

5.写出换行

        File file = new File("D:/test/test.txt");
        FileOutputStream fos = new FileOutputStream(file,true);
        //换行\r\n
        byte[] b={97,98,99,100};
        for(int i:b){
            fos.write(i);
            fos.write("\r\n".getBytes());
        }
        fos.close();

注:①回车符(\r):回到一行的开头,如果在abcde中的c前回车后不做任何操作,再写数据的时候光标是在c前面

       ②换行符(\n):另起一行,如果在abcde中的c前换行后不做任何操作,再写数据的时候光标是在e后面

字节输入流(InputStream)

java.io.InputStream 抽象类是表示字节输入流的所有类的父类,可以读取字节信息到内存中。定义了字节输入流的基本共性功能方法。

1.基本共性功能方法:

①public void close():关闭此输入流并释放与此流相关联的任何系统资源。

②public abstract int read(): 从输入流读取数据的下一个字节。

③public int read(byte[] b): 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。

FileInputStream类(文件字节输入流)

构造方法:

1.FileInputStream(File file): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。

        // 使用File对象创建流对象
        File file = new File("a.txt");
        FileInputStream fos = new FileInputStream(file);

2.public FileInputStream(String name):通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。

        // 使用文件名称创建流对象
        FileInputStream fos = new FileInputStream("b.txt");

常用方法:

1.读取字节数据:read方法,从输入流中读取数据的下一个字节,自动提升为int类型,读取到文件末尾,返回-1。

 public static void main(String[] args) throws IOException {
        File file=new File("D:\\test\\test.txt");
        FileInputStream fis = new FileInputStream(file);
        int r;
        while ((r=fis.read())!=-1){
            System.out.println((char)r);//遍历文件中的全部字节
        }
        fis.close();
    }

2.使用字节数组读取:read(byte[] b),每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回-1。

 public static void main(String[] args) throws IOException {
        File file=new File("D:\\test\\test.txt");
        FileInputStream fis = new FileInputStream(file);
        //每次读一个字节数组的数据
        byte[] b=new byte[3];
        int read =fis.read(b);//返回的int值是读取的有效字节个数
        System.out.println(read);//3
        System.out.println(new String(b));//bca
        fis.close();
    }

注:

读取到的数据赋值给字节数组b,每一次读取会覆盖前一次的数据如果字符的长度不是字节数组的整数倍,比如字节数组长度为3,但是读取到最后只剩2个字符,那么这两个字符会覆盖字符数组前两位,而第三位则还是上一次读取的字符,

改进如下:

 public static void main(String[] args) throws IOException {
        File file=new File("D:\\test\\test.txt");
        FileInputStream fis = new FileInputStream(file);
        byte[] b=new byte[3];
        //定义有效字节数
        int len;
        while ((len=fis.read(b))!=-1){
            String s=new String(b,0,len);
            System.out.println(s);
        }
        fis.close();
    }

字符输入流(Reader)

java.io.Reader抽象类是表示用于读取字符流的所有类的父类,可以读取字符信息到内存中。

1.基本共性功能方法:

①public void close():关闭此流并释放与此流相关联的任何系统资源

②public int read(): 从输入流读取一个字符

③public int read(char[] cbuf): 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中

FileReader类

java.io.FileReader `类是读取字符文件的便捷类

构造方法:

①FileReader(File file): 创建一个新的 FileReader ,给定要读取的File对象

        // 使用File对象创建流对象
        File file = new File("a.txt");
        FileReader fr = new FileReader(file);

②FileReader(String fileName): 创建一个新的 FileReader ,给定要读取的文件的名称

        // 使用文件名称创建流对象
        FileReader fr = new FileReader("b.txt");

常用方法:

1.读取字符:read方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回-1,循环读取

public static void main(String[] args) throws IOException {
            //字符输入流
            FileReader fr=new FileReader(new File("F:\\test\\bbb.txt"));
            int r ;
            while ((r=fr.read())!=-1){
                System.out.println((char)r);
            }
            fr.close();
        }

2.使用字符数组读取:read(char[] cbuf),每次读取b的长度个字符到数组中,返回读取到的有效字符个数,读取到末尾时,返回-1

public static void main(String[] args) throws IOException {
            //字符输入流
            FileReader fr=new FileReader(new File("F:\\test\\bbb.txt"));
            char[] c=new char[3];
            int l;
            while ((l=fr.read(c))!=-1){
                String s=new String(c,0,l);
                System.out.println(s);
            }
            fr.close();
        }

字符输出流(Writer)

java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地

1.基本共性功能方法

①public abstract void close():关闭此输出流并释放与此流相关联的任何系统资源

②public abstract void flush():刷新此输出流并强制任何缓冲的输出字符被写出

③public void write(int b):写出一个字符

④public void write(char[] cbuf):将 cbuf.length字符从指定的字符数组写出此输出流

⑤public abstract void write(char[] b, int off, int len):从指定的字符数组写出 len字符,从偏移量 off开始输出到此输出流

⑥public void write(String str):写出一个字符串

FileWriter类

java.io.FileWriter 类是写出字符到文件的便利类。构造时使用默认字节缓冲区(之前输出流是从内存直接就写到硬盘中了,现在这个字符输出流是有一个缓冲区存在的,在向外界磁盘写数据的时候会先把数据写到缓冲区中,只有调用刷新或者关闭方法的时候,才会把当前缓冲区内的数据输出到指定文件中

构造方法:

1.FileWriter(File file): 创建一个新的 FileWriter,给定要读取的File对象

        // 使用File对象创建流对象
        File file = new File("a.txt");
        FileWriter fw = new FileWriter(file);

2.FileWriter(String fileName): 创建一个新的 FileWriter,给定要读取的文件的名称

        // 使用文件名称创建流对象
        FileWriter fw = new FileWriter("b.txt");

常用方法:

1.写出字符:write(int b) 方法,每次可以写出一个字符数据

public static void main(String[] args) throws IOException {
        //文件字符输出流
        //FileWriter fw= new FileWriter("F:\\test\\aaa.txt");

        FileWriter fw= new FileWriter(new File("F:\\test\\aaa.txt"));
        fw.write("我");
        fw.write(30000);
        //写出的数据现在存放在缓冲区中,必须刷新或者关闭才能把数据输出到文件中。
        fw.close();

    }

关闭和刷新的区别

1.flush:刷新缓冲区,流对象可以继续使用

2.close:关闭流,释放系统资源,关闭前会刷新缓冲区,但流对象不可以继续使用。

public static void main(String[] args) throws IOException {
        // 使用文件名称创建流对象
        FileWriter fw = new FileWriter("F:\\test\\aaa.txt");
        // 写出数据,通过flush
        fw.write('刷'); // 写出第1个字符
        fw.flush();//写出成功
        fw.write('新'); // 继续写出第2个字符
        fw.flush();//写出成功
      
          // 写出数据,通过close
        fw.write('关'); // 写出第1个字符
        fw.close();
        fw.write('闭'); // 继续写出第2个字符,【报错】java.io.IOException: Stream closed
        fw.close();
    }

2.写出其他数据

①写出字符数组 :write(char[] cbuf) 和 write(char[] cbuf, int off, int len),每次可以写出字符数组中的数据,同FileOutputStream的用法一样。

       FileWriter fw= new FileWriter(new File("F:\\test\\aaa.txt"));
       char[] c="今天适合吹风".toCharArray();
       fw.write(c);
       fw.write(c,3,2);
       //写出的数据现在存放在缓冲区中,必须刷新或者关闭才能把数据输出到文件中。
       fw.close();

②写出字符串:write(String str) 和 write(String str, int off, int len),每次可以写出字符串中的数据。

       FileWriter fw= new FileWriter(new File("F:\\test\\aaa.txt"));
       String s="今天太阳好大";
       fw.write(s);
       fw.write(s,2,3);
       //写出的数据现在存放在缓冲区中,必须刷新或者关闭才能把数据输出到文件中。
       fw.close();

③续写和换行:操作类似于FileOutputStream

   FileWriter fw= new FileWriter(new File("F:\\test\\aaa.txt"),true);
   fw.write("今天太阳好大");
   fw.write("\r\n");
   fw.write("今天");
   //写出的数据现在存放在缓冲区中,必须刷新或者关闭才能把数据输出到文件中。
   fw.close();

总结

凡是自己能写出来的用字符流,字符写不出来的比如图片,视频等用字节流。

IO流的异常处理

第一种方式:

public static void main(String[] args){
         FileInputStream fis=null;
        FileOutputStream fos=null;
         try{
            fis=new FileInputStream("C:\\test\\完整的页面效果图.jpg");
            fos=new FileOutputStream("C:\\test\\1.jpg");
            byte[] b=new byte[1024];
            int l=0;
            while((l=fis.read(b))!=-1){
                fos.write(b,0,l);
            }
        }catch(IOException e){
            e.printStackTrace();
        }finally {
            try {
                if(fos!=null){
                    fos.close();
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(fis!=null){
                    fis.close();
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

第二种方式:1.7之后流的简化版处理异常的方式.不再需要自己关流,这种方式会自动关流

public static void main(String[] args) throws IOException {
        //第二种方式
        try(
            FileInputStream fis=new FileInputStream("C:\\test\\完整的页面效果图.jpg");
            FileOutputStream fos=new FileOutputStream("C:\\test\\1.jpg")
            ){
            byte[] b=new byte[1024];
            int l=0;
            while((l=fis.read(b))!=-1){
                fos.write(b,0,l);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

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

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

相关文章

pdf怎么转换成图片格式文件,pdf文档怎么转换成图片格式

在数字化时代,pdf文件转换成图片格式是一种常见的操作,无论是在工作还是日常生活中,我们总会遇到需要将pdf文件转换为图片的需求。这可能是因为图片格式更易于分享、展示或编辑。那么,如何高效地将pdf转换成图片呢?本文…

240705_昇思学习打卡-Day17-基于 MindSpore 实现 BERT 对话情绪识别

240705_昇思学习打卡-Day17-基于 MindSpore 实现 BERT对话情绪识别 近期确实太忙,此处仅作简单记录: 模型简介 BERT全称是来自变换器的双向编码器表征量(Bidirectional Encoder Representations from Transformers)&#xff0c…

#数据结构 顺序表

线性表 顺序表 每种结构都有它存在意义 线性表的顺序存储实现指的是用一组连续的存储单元存储线性表的数据元素。 概念 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性表,一般情况下采用数组存储。在数组上完成数据的增查改删。 逻辑结构&#…

阶段三:项目开发---大数据开发运行环境搭建:任务8:安装配置Redis

任务描述 知识点:安装配置Redis 重 点: 安装配置Redis 难 点:无 内 容: Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可…

数据结构1:C++实现变长数组

数组作为线性表的一种,具有内存连续这一特点,可以通过下标访问元素,并且下标访问的时间复杂的是O(1),在数组的末尾插入和删除元素的时间复杂度同样是O(1),我们使用C实现一个简单的边长数组。 数据结构定义 class Arr…

【手写数据库内核组件】01 解析树的结构,不同类型的数据结构组多层的链表树,抽象类型统一引用格式

不同类型的链表 ​专栏内容: postgresql使用入门基础手写数据库toadb并发编程 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 文章目录 不同类型…

图像基础知识

图像卷积 卷积(convolution)是通过两个函数f和g生成第三个函数的一种数学算子,表征函数f与g经过翻转和平移的重叠部分的面积。 卷积概念是两个变量在某范围内相乘后求和的结果。图像处理中的卷积概念:数字图像是一个二维的离散信号,对数字图像做卷积操作其实就是利用卷积…

【帧中继实验-ensp】

实验要求 在R1上开启一个点对点子接口,用于连接 R1–R2,两端IP地址为12.1.1.x 。开启一个多点子接口 ,用于连接R1–R3,R4,两段IP地址为134.1.1.x。 具体DLCI分配和映射关系如下: R1 102 R2 201—动态映射…

华为OD机试 - 来自异国的客人(Java 2024 D卷 100分)

华为OD机试 2024D卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(D卷C卷A卷B卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测…

使用Github Actions自建Docker镜像仓库

使用Github Actions自建Docker镜像仓库 背景使用Github Actions自建Docker镜像仓库fork项目[docker_image_sync](https://github.com/xqxyxchy/docker_image_sync)获取云厂商容器镜像服务信息配置github secrets运行github action配置需要同步的镜像同步后效果华为云配置 背景 …

机器学习简介--NLP(二)

机器学习简介 机器学习简介机器学习例子机器学习分类有监督学习有监督学习的应用 无监督学习 机器学习常见概念数据集k折交叉验证过拟合欠拟合评价指标 机器学习简介 机器学习例子 问题: 2,4,6,8,?&#…

深入理解JS逆向代理与环境监测

博客文章:深入理解JS逆向代理与环境监测 1. 引言 首先要明确JavaScript(JS)在真实网页浏览器环境和Node.js环境中有很多使用特性的区别。尤其是在环境监测和对象原型链的检测方面。本文将探讨如何使用JS的代理(Proxy&#xff09…

2024亚太杯中文赛数学建模B题word+PDF+代码

2024年第十四届亚太地区大学生数学建模竞赛(中文赛项)B题洪水灾害的数据分析与预测:建立指标相关性与多重共线性分析模型、洪水风险分层与预警评价模型、洪水发生概率的非线性预测优化模型,以及大规模样本预测与分布特征分析模型 …

算法011:最大连续的1的个数

最大连续的1的个数. - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/max-consecutive-ones-iii/ 乍一看,这道题很奇怪,什么叫最多翻转k个0&a…

自动控制:反馈控制

自动控制:反馈控制 反馈控制(Feedback Control)是一种在控制系统中通过测量输出信号,并将其与期望信号进行比较,产生误差信号,再根据误差信号调整输入来达到控制目标的方法。反馈控制是自动控制系统中最常…

揭秘Conda:Python开发者必备的包管理神器

conda 简介 Conda 是一个开源的包管理系统和环境管理系统,用于安装和管理软件包以及创建和维护不同的软件环境。 它最初是为 Python 语言设计的,但现在已经支持多种编程语言,包括 R、Ruby、Lua、Scala 等。 1、Anaconda:是一个…

HCIE之IPV6和OSPFv6(十四)

IPV6 1、IPv6基础1.1 Ipv6地址静态配置、Eui 641.1.1 Ipv6地址静态配置1.1.2、Ipv6地址计算总结1.1.2.1、IEEE eui 64计算1.1.2.1.1、作用1.1.2.1.2、计算方法1.1.2.1.3、计算过程 1.1.2.2、被请求加入的组播组地址计算(三层)1.1.2.2.1、 作用1.1.2.2.2、…

在pycharm里如何使用Jetbrains AI Assistant

ai assistant激活成功后,如图 ai assistant渠道:https://web.52shizhan.cn/activity/ai-assistant 在去年五月份的 Google I/O 2023 上,Google 为 Android Studio 推出了 Studio Bot 功能,使用了谷歌编码基础模型 Codey,Codey 是…

浪潮信息元脑服务器支持英特尔®至强®6能效核处理器 展现强劲性能

如今,服务器作为数字经济的核心基础设施,正面临着前所未有的挑战和机遇。作为服务器领域的领军企业,浪潮信息始终站在行业前沿,不断推陈出新,以满足客户日益增长的需求。近日,浪潮信息再次展现技术实力&…

从零开始学习网络安全渗透测试之Linux基础篇——(六)Linux网络及防火墙配置

从零开始学习网络安全渗透测试之Linux基础篇 第六章 Linux网络及防火墙配置 1、Linux网络配置文件 查看第一张网卡的网卡信息: [rootlocalhost yum.repos.d]# cat vi /etc/sysconfig/network-scripts/ifcfg-ens33 cat: vi: 没有那个文件或目录TYPEEthernet PR…