首页 > 编程语言 >IO流(Java)

IO流(Java)

时间:2025-01-16 12:56:59浏览次数:3  
标签:字符 Java 字节 处理 IO 序列化

一、IO体系的核心概念

1.什么是IO

Java应用程序与外部环境(如文件系统、网络等)之间的数据交换。

2.流

(1)什么是

  • 数据传输的抽象体现

3. 类型

(1)字节流

  • 以字节为单位处理数据,主要处理原始二进制数据,比如说图像、声音。
  • 主要类包含InputStream和OutputStream。

(2)字符流

  • 以字符为单位处理数据,适用于处理文本处理。
  • 主要类包含Reader和Writer。

二、主要类和接口

1.InputStream/Reader:所有输入流的基类。InputStream是字节输入流,Reader是字符输入流。

2.OutputStream/Writer:所有输出流的基类。OutputStream是字节输出流,Writer是字符输出流。

3.File:用于表示文件和目录路径名的抽象表示形式。

4.RandomAccessFile:允许对文件的任何位置进行读写操作。 

三 、详细分类

1.按流向分类

  • 输入流:用于从数据源读取数据。例如,从文件中读取内容等操作都会用到输入流。
  • 输出流:用于将数据写入到目的地。比如把数据写入文件等操作需要使用输出流。

2.按数据处理方式分类

  • 字节流:以字节为单位进行数据的读写操作。字节流可以处理任何类型的数据,因为所有的数据在计算机底层都是以字节的形式存储的。
  • 例如,读取或写入二进制文件(如图像文件、音频文件等)、进行网络字节数据传输等都需要使用字节流。
  • 字符流:以字符为单位进行读写操作。字符流主要用于处理文本数据,它会根据字符编码(如UTF-8、GBK等)将字符转换为字节进行存储或传输。
  • 例如,在处理文本文件(如.txt文件)、读取配置文件等场景中非常有用。

3.按常用流类分类

  • FileInputStream/FileOutputStream:用于从文件读取字节或向文件写入字节。
  • FileReader/FileWriter:用于从文件读取字符或向文件写入字符。
  • BufferedInputStream/BufferedOutputStream:为字节输入/输出流添加缓冲功能。
  • BufferedReader/BufferedWriter:为字符输入/输出流添加缓冲功能。
  • DataInputStream/DataOutputStream:允许应用程序以与机器无关方式从底层输入流中读取基本Java数据类型和字符串,或将这些数据写入输出流中。

四、高级操作

1.缓冲流

  • 使用缓冲流可以减少实际的读写操作次数,从而提高性能。
  • Java IO提供了BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWriter等缓冲流类。

2.转换流

  • InputStreamReader和OutputStreamWriter是字符流和字节流之间的桥梁。
  • 它们分别用于将字节输入流转为字符输入流,将字符输出流转为字节输出流。
  • 在处理文本数据时,需要指定正确的字符编码,以避免出现乱码问题。

3.序列化流 

  • ObjectInputStream和ObjectOutputStream允许将Java对象序列化为字节流,或从字节流中反序列化出Java对象。
  • 这对于对象的持久化存储和网络传输非常有用。

 五、最佳实践

1.使用try-with-resources语句:自动管理资源,确保流在使用完毕后能够正确关闭,避免资源泄露。

2.选择合适的字符编码:在处理文本数据时,需要指定正确的字符编码,以避免出现乱码问题。

3.使用缓冲流提高性能:对于大文件或频繁的IO操作,使用缓冲流可以显著提高性能。

4.注意异常处理:IO操作可能会抛出IOException,需要通过try-catch块进行捕获和处理。

六、其他知识点

1.节点流与处理流

  • 节点流:直接从数据源或目的地读写数据。例如,FileInputStream和FileOutputStream就是节点流,它们直接从文件中读写数据。
  • 处理流:不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。例如,BufferedInputStream和BufferedOutputStream就是处理流,它们为节点流提供了缓冲功能。 

2.流的链接

  • 一个流对象可以经过其他流的多次包装,形成流的链接。这样,可以通过多个处理流对数据进行多次处理。 

3.NIO(New IO)

(1)什么是

  • Java NIO是Java 1.4及后续版本引入的一个新的IO API,它提供了与标准IO不同的IO工作方式。
  • NIO是基于通道(Channel)和缓冲区(Buffer)的IO方式,它可以使用非阻塞IO操作,这对于高性能的网络应用程序来说非常有用。 

(2) 相关术语

  • Buffer:缓冲区,用于存储数据。
  • Channel:通道,用于读写数据。
  • Selector:选择器,用于多路复用I/O操作。
  • ByteBuffer:字节缓冲区,支持读写操作。
  • FileChannel:文件通道,用于文件的读写操作。
  • SocketChannel:套接字通道,用于网络通信。

4. 序列化与反序列化

  • 序列化:将对象的状态信息转换为可以存储或传输的形式的过程。在Java中,可以通过实现Serializable接口来使对象可序列化。
  • 反序列化:将序列化后的对象状态信息恢复为对象的过程。

七、面试常考的八股文

1.Java IO流分为哪两大类?它们之间的主要区别是什么?

  • Java IO流分为字节流和字符流。
  • 字节流以字节为单位处理数据,适用于处理二进制数据;字符流以字符为单位处理数据,适用于处理文本数据。

2.请解释节点流和处理流的区别。

  • 节点流直接从数据源或目的地读写数据,如FileInputStream和FileOutputStream;
  • 处理流不直接连接到数据源或目的地,而是“连接”在已存在的流之上,通过对数据的处理为程序提供更为强大的读写功能,如BufferedInputStream和BufferedOutputStream。

3.什么是流的链接?在Java中如何实现流的链接?

  • 流的链接是指一个流对象经过其他流的多次包装。
  • 在Java中,可以通过将多个处理流连接到一个节点流上来实现流的链接。例如,可以将BufferedInputStream和DataInputStream连接到一个FileInputStream上,以实现对文件的缓冲和按数据类型读取。

4.请解释Java NIO中的Channel和Buffer的作用,以及它们与标准IO的区别。

  • Channel是一个连接到数据源或目的地的通道,可以读取数据到Buffer中或将Buffer中的数据写入到数据源或目的地。
  • Buffer是一个内存块,用于临时存储数据。
  • 与标准IO相比,NIO基于Channel和Buffer的IO方式更加灵活和高效,支持非阻塞IO操作。

5.请解释Java中的序列化与反序列化,并给出实现序列化的步骤。

  • 序列化是将对象的状态信息转换为可以存储或传输的形式的过程;
  • 反序列化是将序列化后的对象状态信息恢复为对象的过程。在Java中,可以通过实现Serializable接口来使对象可序列化
  • 实现序列化的步骤包括:将需要序列化的类实现Serializable接口(无需实现任何方法),然后使用一个输出流(如FileOutputStream)来构造一个ObjectOutputStream对象,并通过该对象的writeObject()方法将对象写入到输出流中。

6.如何处理大文件的读写?

  • 处理大文件时,可以使用缓冲流(如BufferedInputStream和BufferedOutputStream)来提高读写效率。对于非常大的文件,还可以考虑使用NIO中的FileChannel和MappedByteBuffer进行内存映射。 

7.在使用 IO 流时,如何有效地捕获和处理异常?

在使用 IO 流时,应该使用 try-catch-finally 语句块来捕获和处理可能发生的异常。具体做法如下:

  • 在 try 块中编写使用 IO 流的代码。
  • 在 catch 块中捕获可能发生的 IOException 及其子类异常,并进行相应的处理,如打印异常信息、释放资源等。
  • 在 finally 块中释放 IO 流所占用的资源,如关闭文件、网络连接等。这可以确保无论是否发生异常,资源都能得到正确的释放。

标签:字符,Java,字节,处理,IO,序列化
From: https://blog.csdn.net/m0_73757039/article/details/145178131

相关文章

  • 东软云医院HIS系统-药房管理系统【Swing窗口+MySQL】(Java课设)
         客官进来看一眼呗,有惊喜!【帮你解决烦恼】:Java课设和计Java毕设太难不会做怎么办?系统类型Swing窗口类型+Mysql数据库存储数据使用范围适合作为Java课设!!!部署环境jdk1.8+Mysql8.0+Idea或eclipse+jdbc运行效果本系统源码地址:东软云医院HIS系统-药房管理系统【Sw......
  • JAVA-Exploit编写(5)--http-request库使用
    目录1.http-request简介2.依赖导入3.GET请求方式3.1test.php3.2基本使用代码实现 3.2请求时请求参数URL编码实现 3.3携带多参数请求3.Post请求方式3.1基本使用3.2携带单个参数请求 3.3携带多个参数请求4.设置代理请求 4.1方式一4.2方式二1.ht......
  • [2834]基于JAVA的著作权登记智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的著作权登记智慧管理系统的设计与实现指导老师(一)选题的背景和意义随着科技的发展,数字化技术在各个领域的应用越来越广泛。特别是在知识产权领域,著作权登记、管理、保护等方面的工作也面临着数字化转型的挑战。然而......
  • [2823]基于JAVA的药店销售智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的药店销售智慧管理系统的设计与实现指导老师(一)选题的背景和意义在当今社会,药店作为医疗保健服务的重要组成部分,其日常运营管理和药品销售管理对于保障公众健康具有重要意义。随着科技的不断发展和信息化水平的提高......
  • 【附源码】JAVA大学生竞赛管理系统源码+SpringBoot+VUE+前后端分离
    学弟,学妹好,我是爱学习的学姐,今天带来一款优秀的项目:大学生竞赛管理系统 。本文介绍了系统功能与部署安装步骤,如果您有任何问题,也请联系学姐,偶现在是经验丰富的程序员!一.系统演示系统测试截图   系统视频演示 https://githubs.xyz/show/343.mp4 二.系统概述 ......
  • sessionStorage储存对象
    sessionStorage和localStoragesessionStorage(会话存储):暂时储存,浏览器关闭之后会清除localStorage(本地存储):本地储存,浏览器关闭之后依旧不会清除,只能人为删除平时储存的话建议使用sessionStorage;sessionStorage存储一个对象letobj={name:'zs',age:'18'}sessio......
  • 【附源码】JAVA课程管理系统源码+SpringBoot+VUE+前后端分离
    学弟,学妹好,我是爱学习的学姐,今天带来一款优秀的项目:课程管理系统 。本文介绍了系统功能与部署安装步骤,如果您有任何问题,也请联系学姐,偶现在是经验丰富的程序员!一.系统演示系统测试截图     系统视频演示 https://githubs.xyz/show/342.mp4 二.系统概述......
  • Java 21 (JDK 21):长期支持版本的重大飞跃
    虚拟线程(VirtualThreads):核心亮点: 虚拟线程是JDK21中最受关注的新特性之一。它是一种轻量级的并发线程,由JVM管理,而不是操作系统。优势:高并发: 可以创建大量的虚拟线程,而不会消耗大量的系统资源。易用性: 虚拟线程的创建和管理非常简单,降低了并发编程的复杂......
  • 【0388】Postgres内核 SQL function 删除 physical replication slot 底层实现( 4 )
    文章目录1.概述2.`SQLfunction`2.1待删除`physicalreplicationslot`2.2检查当前用户权限2.3检查`Postgres`服务配置3.删除`physicalreplicationslot`3.1获取先前创建的`slot`3.1.1获取`slot`3.1.1初始化`active_pid`3.2永久删......
  • 如何在网站中安全有效地修改Java变量,确保功能正常且不影响用户体验?
    修改网站中的Java变量是确保功能正常和用户体验的重要步骤。以下是详细的指南,帮助您顺利完成这一任务:确定修改需求:明确具体的修改需求,例如更新变量值、添加新变量或删除旧变量。制定详细的修改计划,确保每个改动都有明确的目标。备份现有文件:在进行任何更改之前,请确保......