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

news2024/11/27 4:20:34

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.coloradmin.cn/o/1903492.html

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

相关文章

fork创建子进程详解

一.前言 在上一篇文章-进程的概念,最后我们提到了创建进程的方式有两种方式,一种是手动的创建出进程,还有一种就是我们今天要学习的使用代码的方式创建出子进程-fork。 而学习fork创建出进程的过程中,我们会遇到以下问题&#x…

[数据结构] 基于选择的排序 选择排序堆排序

标题:[数据结构] 基于选择的排序 选择排序&&堆排序 水墨不写bug (图片来源于网络) 目录 (一)选择排序 实现:(默认从小到大排序) 优化后实现方法: (二)堆排序…

【帧中继实验-ensp】

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

微软正在放弃React

最近,微软Edge团队撰写了一篇文章,介绍了微软团队如何努力提升Edge浏览器的性能。但在文中,微软对React提出了批评,并宣布他们将不再在Edge浏览器的开发中使用React。 我将详细解析他们的整篇文章内容,探讨这一决定对…

QML:Settings介绍

用途 提供持久的独立于平台的应用程序设置。 用户通常希望应用程序在会话中记住其设置(窗口大小、位置、选项等)。Settings能够以最小的工作量保存和恢复此类应用程序设置。 通过在Settings元素中声明属性来指定各个设置值。仅支持由QSettings识别的值…

Gemma2——Google 新开源大型语言模型完整应用指南

0.引言 Gemma 2以前代产品为基础,提供增强的性能和效率,以及一系列创新功能,使其在研究和实际应用中都具有特别的吸引力。Gemma 2 的与众不同之处在于,它能够提供与更大的专有模型相当的性能,但其软件包专为更广泛的可…

《梦醒蝶飞:释放Excel函数与公式的力量》9.3.1PV 函数

9.3.1 函数简介 PV函数用于计算一系列未来付款的现值,考虑了一定的利率。现值是未来金额的贴现值,表示在当前时刻相当于未来某一时间点的总价值。 9.3.2 语法 PV函数的语法如下: PV(rate, nper, pmt, [fv], [type]) rate:每期…

JavaEE初阶-网络原理1

文章目录 前言一、UDP报头二、UDP校验和2.1 CRC2.2 md5 前言 学习一个网络协议,最主要就是学习的报文格式,对于UDP来说,应用层数据到达UDP之后,会给应用层数据报前面加上UDP报头。 UDP数据报UDP包头载荷 一、UDP报头 如上图UDP的…

中英双语介绍美国苹果公司(Apple Inc.)

中文版 苹果公司简介 苹果公司(Apple Inc.)是一家美国跨国科技公司,总部位于加利福尼亚州库比蒂诺。作为全球最有影响力的科技公司之一,苹果以其创新的产品和设计引领了多个科技领域的变革。以下是对苹果公司发展历史、主要产品…

算法刷题笔记 滑动窗口(C++实现,非常详细)

文章目录 题目描述基本思路实现代码 题目描述 给定一个大小为n ≤ 10^6的数组。有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到k个数字。每次滑动窗口向右移动一个位置。以下是一个例子: 该数组为 [1 3 -1 -3 5 3 6 7]&…

SAP PS学习笔记02 - 网络,活动,PS文本,PS文书(凭证),里程碑

上一章讲了PS 的概要,以及创建Project,创建WBS。 SAP PS学习笔记01 - PS概述,创建Project和WBS-CSDN博客 本章继续讲PS的后续内容。包括下面的概念和基本操作,以及一些Customize: - 网络(Network&#xf…

CC工具箱使用指南:【相交占比分析】

一、简介 需求场景如下,有【待分析地块】和【面积占比参考】2个图层。2个图层之间存在空间上的重叠。工具的目的是为了分析出【待分析地块】的每1个图斑中,和【面积占比参考】相交的面积,以及和总面积的占比。 举一个应用场景为例&#xff0…

java信号量(Semaphore)

Java中的信号量(Semaphore)是一种用于控制多个线程对共享资源的访问的同步工具。它可以用来限制可以同时访问某些资源的线程数量。Semaphore 提供了一个计数器来管理许可证的获取和释放,每个许可证代表对资源的一次访问权限。 import java…

阶段三:项目开发---搭建项目前后端系统基础架构:任务11:搭建项目后台系统基础架构

任务描述 1、了解搭建民航后端框架 2、使用IDEA创建基于SpringBoot、MyBatis、MySQL、Redis的Java项目 3、以原项目为参照搭建项目所涉及到的各个业务和底层服务 4、以原项目为例,具体介绍各个目录情况并参照创建相关文件夹 任务指导 1、讲框架的选择和原理 …

解决Unable to Correct Problems ‘You have Held Broken Packages’

进入 Software & Updates 后下拉 Download from,点击 Other… 点击 Select Best Server 等待测试服务器 测试完成后会默认标红测试出的最好的那个服务器,直接点击 Choose Server,可能需要输入系统用户密码5. 输入然后返回上级界面 点击 C…

实现ubuntu的任务计划反弹shell

1.实验目的 使用Ubuntu定时任务反弹shell 2实验环境 ubuntu:ip地址:192.168.80.133 kali:ip地址:192.168.80.134 3.编写crontab计划任务 在ubuntu的系统中使用crontab -e命令编写计划任务 作用:是将一个交互式的…

STM32利用FreeRTOS实现4个led灯同时以不同的频率闪烁

在没有接触到FreeRTOS时,也没有想过同时叫两个或两个以上的led灯闪烁的想法,接触后,发现如果想叫两个灯同时以不同的频率闪烁,不能说是不可能,就算是做到了也要非常的麻烦。但是学习了FreeRTOS后,发现要想同…

26 华三防火墙安全区域

防火墙区域规划 配置网络网卡的地址在同一网段 第一个问题 为什么防火墙直连在同一个网段ping不通? 配置IP地址 local区域: 将local区域的所有接口启用 华三防火墙的local区域是指设备本地接口所在的区域,也称为局域网(LAN)或内部网络 Int…

机器学习与深度学习:区别(含工作站硬件推荐)

一、机器学习与深度学习区别 机器学习(ML:Machine Learning)与深度学习(DL:Deep Learning)是人工智能(AI)领域内两个重要但不同的技术。它们在定义、数据依赖性以及硬件依赖性等方面…

硬件开发笔记(二十四):贴片电容的类别、封装介绍,AD21导入贴片电容、原理图和封装库3D模型

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140241817 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…