Java字节流battle字符流

news2025/1/20 12:13:50

目录

Java字节流(Byte Stream)

FileInputStream和FileOutputStream

Java字符流(Character Stream)

FileReader和FileWriter

如何在使用是区分什么时候用输出什么时候用输入

Write方法

close方法

Java中的close方法本身抛出的异常是什么

FileOutputStream(文件输出流)

FileInputStream(文件输入流)

FileInputStream文件输入流,参数中的文件不存在时会直接抛出异常不会尝试创建新文件;

read方法和Write方法


        

Java中的流(stream)是数据传输的一种方式,可以将输入或输出数据从一个地方传递到另一个地方。Java的I/O库提供了两种类型的流:字节流和字符流。

Java字节流(Byte Stream)

        Java字节流以字节为单位进行读写操作,是处理所有类型的二进制数据的推荐方式。它们在I/O基础设施中使用最广泛,因为它们处理原始的二进制数据。

FileInputStream和FileOutputStream

        Java中最基本的字节流类是FileInputStream和FileOutputStream。文件输入流(FileInputStream)用于从文件中读取数据,而文件输出流(FileOutputStream)用于向文件中写入数据。这两个类可以用来移动二进制数据,比如图像和声音等。

  • 优点

    • 字节流对于任何类型的文件都可以使用,包括文本和二进制文件。
    • 字节流通常比字符流更快,在处理大量数据时性能更好。
  • 缺点

    • 不适合处理文本数据,可能会导致编码问题。
    • 在处理文本文件时需要手动进行编解码。
  • 使用案例

    • 图片和视频的读写操作
    • 数据压缩和加密

Java字符流(Character Stream)

        Java字符流以字符为单位进行读写操作,是处理文本数据的首选方式。它们使用Unicode编码并在内存中使用16位字符集表示。

FileReader和FileWriter

        Java中最基本的字符流类是FileReader和FileWriter。文件读取器(FileReader)用于从文本文件中读取数据,而文件写入器(FileWriter)用于向文本文件中写入数据。

  • 优点

    • 处理文本文件时,字符流通常比字节流更方便。
    • 自动进行编解码,无需手动进行转换。
  • 缺点

    • 在处理二进制数据时不如字节流效率高。
    • 不能处理所有类型的文件,比如图片或视频等。
  • 使用案例

    • 文本文件的读写操作
    • 网络传输中的文本数据的读写操作

        总的来说,字节流适合处理任何类型的文件,但在处理文本数据时需要手动进行编解码。字符流适合处理文本文件,并且自动进行编解码。因此,根据具体的使用场景和需求选择合适的流非常重要。

如何在使用是区分什么时候用输出什么时候用输入

这个问题困扰我很长时间啊,关键时刻就会搞混,为此痛书下文:(以文件的读写流举例)

FileInputStream:文件输入流,从文件中读出数据,方法read();

FileOutputStream:文件输出流,向文件中写入数据,方法write();

记住以上两句话,不要去问为什么,记住就好了,等你彻底记住了在问为什么;

Write方法

        这里为什么把这个方法单独拿出来呢?因为这个方法本身会抛出受检异常,你必须在编译之前对他做出处理;

在Java中,write()方法用于将数据写入输出流。这个方法本身可能会抛出多种异常,包括以下几种:

  1. IOException
    • 描述:当发生I/O错误(如文件系统错误或网络错误)时抛出。
  2. NullPointerException
    • 描述:当参数为null时抛出。
  3. IndexOutOfBoundsException
    • 描述:当指定的偏移量和长度超出了有效数据范围时抛出。

        需要注意的是,如果使用带缓冲区的流对象(例如BufferedOutputStream),则调用write()方法不一定会触发I/O操作。相反,它会将数据存储在缓冲区中,并且只有当缓冲区已满或手动刷新缓冲区时才会执行实际的I/O操作。在这种情况下,如果发生I/O错误,则可能会在刷新缓冲区时抛出异常,而不是在调用write()方法时抛出异常。

close方法

为了加深联想记忆,我们在单独把close方法拿出来,同样它本身也会抛出异常我之前一直以为他的异常只是null异常(就是流对象值为null时,仍旧调用close时才抛出异常),但实则不然,以下代码为例(注意下面代码有错误):

if(fin!=null){
    fin.close();
 }       

        因为我单独写出 fin.close()时会报异常,所以我在fin.close()外面加入了if判断,之后他仍旧会抛出异常,之后我就发觉不对,重新查了下资料得:

Java中的close方法本身抛出的异常是什么

        在Java中,close()方法是用于关闭流的方法。当调用close()方法时,可能会发生异常并抛出异常。具体来说,close()方法本身可能会抛出IOException异常。

        IOException是Java中的一个checked exception(受检异常),表示在输入/输出过程中发生了一般性错误。因为close()方法涉及到I/O操作,所以它可能会在关闭流的过程中抛出IOException异常。例如,在使用文件输入/输出流时,如果在关闭流之前尚未完成读取/写入操作,则可能会出现IOException异常。同样,在使用网络套接字时,如果在从套接字中读取或写入数据时发生错误,则可能在关闭套接字之前出现IOException异常。

        因此,当使用close()方法时,需要使用try-catch语句来捕获可能抛出的IOException异常,并进行适当的异常处理。通常情况下,在finally块中调用close()方法是良好的编程习惯,以确保资源得以正确释放。例如:

FileInputStream in = null;
try {
    in = new FileInputStream("example.txt");
    // ...
} catch (IOException e) {
    // 处理异常
} finally {
    if (in != null) {
        try {
            in.close();
        } catch (IOException e) {
            // 处理异常
        }
    }
}

FileOutputStream(文件输出流)

        然后我们来谈一谈FileOutputStream,这个流对象很牛逼啊,有些不为人知的操作:

在Java中,FileOutputStream有两种构造函数来创建一个文件输出流对象,这两个构造函数的参数如下:

  1. FileOutputStream(File file)

    • 参数类型:File
    • 描述:创建一个将数据写入指定文件的文件输出流对象。如果指定的文件不存在,则会尝试创建该文件。
  2. FileOutputStream(String name, boolean append)

    • 参数类型:
      • String name: 文件名(包括其路径)。
      • boolean append: 如果为true,则此文件输出流将被打开以进行追加写入;否则文件将被覆盖。
    • 描述:创建一个将数据写入指定文件的文件输出流对象。如果指定的文件不存在,并且append参数为false,则会尝试创建该文件。

        需要注意的是,如果使用第二种构造函数来创建FileOutputStream对象,还可以使用另一种重载形式的构造函数来设置缓冲区大小。例如:

FileOutputStream fos = new FileOutputStream("example.txt", true);
BufferedOutputStream bos = new BufferedOutputStream(fos, 4096);

        上述代码中,BufferedOutputStream的构造函数接收一个FileOutputStream对象和一个整数参数作为输入。该整数表示缓冲区的大小。通过使用带有缓冲区大小参数的构造函数,可以提高输出性能并减少系统调用次数

FileInputStream(文件输入流)

相对于输出流,输入流比较简单:在Java中,FileInputStream有三个构造函数用于创建一个文件输入流对象,这三个构造函数的参数如下:

  1. FileInputStream(File file)

    • 参数类型:File
    • 描述:创建一个从指定文件读取数据的文件输入流对象
  2. FileInputStream(String name)

    • 参数类型:String
    • 描述:创建一个从指定路径名(包括文件名)读取数据的文件输入流对象
  3. FileInputStream(FileDescriptor fdObj)

    • 参数类型:FileDescriptor
    • 描述:创建一个从指定文件描述符读取数据的文件输入流对象

需要注意的是,FileInputStream类没有设置缓冲区的构造函数。如果需要使用带有缓冲区的输入流对象,则可以将FileInputStreamBufferedInputStream一起使用。例如:

FileInputStream fis = new FileInputStream("example.txt");
BufferedInputStream bis = new BufferedInputStream(fis, 4096);

        上述代码中,BufferedInputStream构造函数接收一个FileInputStream对象和一个整数参数作为输入。该整数表示缓冲区的大小。通过使用带有缓冲区大小参数的构造函数,可以提高输入性能并减少系统调用次数。

FileInputStream文件输入流,参数中的文件不存在时会直接抛出异常不会尝试创建新文件;

        在Java中,FileInputStream的构造函数用于创建一个从文件读取数据的输入流对象。如果指定的文件不存在,则会抛出FileNotFoundException异常,而不是尝试创建该文件。

因此,如果要使用FileInputStream从文件读取数据,并且不确定文件是否存在,可以通过以下步骤来避免出现异常:

  1. 使用Java中的File类或其他文件操作API来检查文件是否存在。
  2. 如果文件存在,则使用FileInputStream构造函数来创建输入流对象;否则,进行相应的错误处理。

例如,下面的代码演示了如何检查文件是否存在并使用FileInputStream从文件读取数据:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileInputStreamExample {

    public static void main(String[] args) {
        File file = new File("example.txt");
        if (file.exists()) {
            try {
                FileInputStream fis = new FileInputStream(file);
                // 从输入流中读取数据...
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            System.err.println("File not found: " + file.getAbsolutePath());
        }
    }

}

        上述代码中,首先检查文件是否存在,如果存在则使用FileInputStream构造函数创建输入流对象并从中读取数据。如果文件不存在,则输出错误信息并终止程序。

        需要注意的是,FileInputStream只能用于读取已存在的文件,并不能用于创建新的文件。如果需要创建新的文件,应该使用FileOutputStream(或其他文件操作API)来创建输出流并写入数据。

read方法和Write方法

这个部分里面我们主要强调的是,read和write方法的参数以及返回值,你可以从下图中看出,

  • 返回值

    • int:返回实际读取的字节数。如果已经到达文件的末尾,则返回-1。在实际应用中我们通过返回的值来判断是否读取完数据;
  • 参数
  • 空参表示一次读出一个字节数据,然后其他上面都有;

 

 对于Write方法,他没有返回值,主要是参数,可以一次写入一个字节,或者一个字节数组的数据;

 fou = new FileOutputStream("./2.txt");
 fin = new FileInputStream("");
 String str = new String("qwertyuiop");
 fou.write(2);//write方法本身会抛出异常;一次写入一个字节
 fou.write(str.getBytes());//一次写入一个字节数组

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

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

相关文章

基本定时器工作模式

计数和定时 BasicTimer支持8位或16位向上计数模式。当计数值大于等于比较寄存器(CMPH、CMPL),会产生计数中断标志,并从自动重载寄存器(LOADH、LOADL)加载新的比较值。这样可以实时调整每个计数周期的计数长…

python自动化测试-最常用的自动化测试框架

在开始学习python自动化测试之前,先了解目前市场上的自动化测试框架有哪些? 随着技术的不断迭代更新,优胜劣汰也同样发展下来。从一开始工具型自动化,到现在的框架型;从一开始的能用,到现在的不仅能用&…

Qt6.5 grpc组件使用 + golang grpc server示例

1. 资料 1) Protobuf 开发文档 https://protobuf.dev/ 2) protobuf安装指南 https://grpc.io/docs/protoc-installation/ 3) protoc 下载 https://github.com/protocolbuffers/protobuf/releases/tag/v23.1 2. Qt grpc 组件 & 工具 1) Qt6.5 安装目录下 xx\Qt\6.5.…

实验7 多用户界面、菜单以及对话框程序设计

实验内容 1.设计一个具有两个页面的程序,第一个页面显示一张封面的图片,第二个页面显示“欢迎进入本系统”,这两个页面之间能相互切换。    2.设计一个具有3个选项的菜单程序,当单击每个选项时,分别跳转到3个不同的页面。 3.设…

快速搭建一个 Kubernetes+Crane 环境,以及如何基于 Crane 优化你的集群和应用初体验

文章目录 一、活动介绍二、环境搭建三、安装本地的 Kind 集群和 Crane 组件四、界面截图五、主要功能六、整体架构七、Crane的优势八、总结参考文献 一、活动介绍 Crane 是由腾讯云主导开源的国内第一个基于云原生技术的成本优化项目,遵循 FinOps 标准,…

零基础如何入门网络安全?一般人还真不行

前景 很多零基础朋友开始将网络安全作为发展的大方向,的确,现如今网络安全已经成为了一个新的就业风口,不仅大学里开设相关学科,连市场上也开始大量招人。 那么网络安全到底前景如何?大致从市场规模、政策扶持、就业…

信息收集-目录信息

(一)目录结构 网页的目录结构跟整个网站的布局有关,收集到的信息可以包括目录名称、目录结构、目录所包含的文件、文件类型、文件大小等。收集到的信息有助于评估网站的安全性、了解网站的架构和目录结构,甚至可能有助于发现敏感…

3个月出国|材料科学老师自费赴韩国访学

K老师指定韩国为访学的目标国家,希望专业匹配,尽快出国。最终我们获得了韩国庆北大学的邀请函,其学校名气、专业匹配度及导师影响力都符合K老师的要求。本案例从开始委托我们申请到最终出国,仅仅用时3个月。 K老师背景&#xff1a…

基于pytest的接口测试框架详解,一定有你想知道的

目录 需求一:一套用例可以测试多套环境 需求二: 可以被jenkins调度执行 需求三 拥有测试报告 需求四:接口中某些字段值在每次请求中不重复 需求五: 可以多接口关联测试 需求六 构造的表数据可以和接口字段数据关联 需求七 pytest用例和…

java内部类和异常类1

文章目录 一、Java内部类二、Java匿名类总结 一、Java内部类 成员变量和方法,实际上,类还有一种成员:内部类。在一个类中定义另一个类,我们把这样的类称作内部类,包含内部类的类称作内部类的外嵌类。 内部类和外嵌类…

编辑距离00

题目链接 爬楼梯 题目描述 注意点 word1 和 word2 由小写英文字母组成返回将 word1 转换成 word2 所使用的最少操作数 解答思路 本题本质上的操作只有三种:在单词 A 中插入一个字符;在单词 B 中插入一个字符;修改单词 A 的一个字符&…

OpenGL之元素缓冲对象

文章目录 EBO(元素缓冲对象)创建元素缓冲对象创建两个相邻不同颜色的三角形 EBO(元素缓冲对象) 素缓冲对象(Element Buffer Object,EBO),也叫索引缓冲对象(Index Buffer Object,IBO)。要解释元素缓冲对象的工作方式最好还是举个例子&#xf…

【Python redis】零基础也能轻松掌握的学习路线与参考资料

Python redis是一种非常流行的缓存数据库,对于Python Web应用程序开发非常有用,能快速地处理大量的数据请求。Python redis的学习路线需要对Python语言有深刻的理解,并了解使用redis的API。在掌握了Python redis的基本知识后,就可…

这个 希尔排序详解过程 我能吹一辈子!!!

文章目录 希尔排序概念希尔排序算法思路希尔排序实现 希尔排序概念 希尔排序(Shellsort)也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。希尔(Donald Shell)于1959…

关系数据库设计理论

关系数据库设计理论 目录 关系数据库设计理论是什么函数依赖完全函数依赖(Full Functional Dependency)部分函数依赖(Partial Functional Dependency)传递函数依赖(Transitive Functional Dependency) 异常插入异常(Insertion Anomaly)更新异常(Update Anomaly)删除异常(Deleti…

Mit6.006-problemSession04

4-1 序列旋转 下面是一个序列AVL树T。执行操作T.delete_at(8),该操作期间,每次旋转操作执行完后,画出该树。 4-2 Fick Nury Fick Nury领导n名超级英雄组成了精英团队——复仇者联盟。他听说:超人Sanos正在一个遥远星球上制造麻烦…

【JVM】7. 方法区

文章目录 7. 方法区7.1. 栈、堆、方法区的交互关系7.2. 方法区的理解7.2.1. 方法区在哪里?7.2.2. 方法区的基本理解7.2.3. HotSpot中方法区的演进 7.3. 设置方法区大小与OOM7.3.1. 设置方法区内存的大小7.3.2. 如何解决这些OOM 7.4. 方法区的内部结构7.4.1. 方法区&…

《汇编语言》- 读书笔记 - 第3章-寄存器(内存访问)

《汇编语言》- 读书笔记 - 第3章-寄存器(内存访问) 3.1 内存中字的存储问题 3.1 3.2 DS 和 [address]问题 3.2 3.3 字的传送问题 3.3问题 3.4 3.4 mov、add、sub 指令3.5 数据段问题 3.53.1~3.5 小结检测点 3.1 3.6 栈3.7 CPU 提供的栈机制问题 3.6 3.8 …

【数据结构】顺序表---C语言版(数据结构开篇小菜,全网最详细!小白看一遍就学会!!!)

文章目录 🍔一、前言🍟1. 什么是数据结构 🍔二、顺序表的概念----线性表🍟1. 什么是线性表🍟2. 顺序表与数组的区别 🍔三、顺序表详解💧 静态顺序表💧 动态顺序表🍎创建动…

C语言_VS系列编译器写C语言或C++代码产生的一些错误与警告的解决方法(VS2010/VS2019)

本次来分享在用VS系列编译(VS2010/VS2019)写C语言或C代码时会遇到的一些警告和错误,提供博主的一些解决方法,若有更好的解决方法,大家也可以在评论区发表自己的意见噢,话不多说,开始上菜: 此博主在CSDN发布…