每日一道面试题之java 中 IO 流分为几种?

简介: 每日一道面试题之java 中 IO 流分为几种?

IO流是什么?

流是数据在数据源(文件)和程序(内存)之间经历的路径。

这样解释似乎是很抽象不易理解的,因此我们拿生活中的例子来说,我们可以把流看成流动的自来水,打开水阀,自来水就会通过水管从水源流到各个用户家中,同样的道理,水库中的水也会通过水管流入到水源。从水源流出到用户家为自来水的输出流,而从水库流入到水源为自来水的输入流,只有构成这样一个循环,自来水才能源源不断的被人们利用。


从java的角度分析,由于Java对数据的操作是通过流的方式,而IO流能够处理设备之间的数据传输,例如:文件的上传和下载,Java用于操作流的对象都在IO包中。

IO流的分类:

关于java中IO流的分类,我们可根据或者单位进行划分。

按流划分:

首先我们先来谈谈以流划分,以流划分可以分为两类,分别为输入流[数据的读取]和输出流[数据的写入]

从Java的角度分析,引入IO流的作用为:如果要实现从文件中读取数据,需要在程序和文件之间建立一条数据输入的通道,这样java程序才能从文件中读取数据;反之,如果要实现在Java程序中把数据写入文件,也需要在程序和文件之间建立一条数据输出的通道,这样才能通过java程序将数据写入文件中。


但这两条通道并不需要人为的去创建,而是我们在java程序中,一旦创建输入流对象,那么Java会自动建立数据输入通道,同理创建输出流时,Java也会自动建立数据输出通道,如下图所示的解释更为直观:

简单点来说:输入流是数据从数据源(文件)到程序(内存)的路径,是一个读取数据的过程,输出流是数据从程序(内存)到数据源(文件)的路径,是一个创建数据的过程。

按单位划分:

根据单位进行划分,可以分为字节流和字符流。


java中的字节流有InputStream、OutputStream,字节流处理的单元为1个字节(byte),操作的对象为字节和字节数组,文件存储的形式为二进制,对于音频文件、图片、歌曲,我们推荐使用字节流


java中的字符流有Reader、Writer;它处理的单元为2个字节的Unicode字符,操作的对象为字符、字符数组或字符串,字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,对于文本文件,我们推荐使用字符流


那么它们之间有什么关系呢?


我们知道计算机中的所有文件储存都是以字节的形式进行的,在磁盘上保留的并不是文件的字符,而是先把字符编码成字节,再储存这些字节到磁盘。当读取文件(特别是文本文件)时,也是一个字节地读取便于形成字节序列。


字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。


字节流是最基本的,主要用在处理二进制数据,它是按字节来处理的,但在实际应用中,很多的数据都是文本类型,因此又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化,这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联,我们在实际开发中经常遇到的汉字乱码问题,实际上就是由于字符流和字节流之间转化不统一而造成的

相关文章
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
87 2
|
2月前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
83 14
|
2月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
2月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
2月前
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
55 9
|
2月前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
2月前
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
37 6
|
2月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
76 4
|
2月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
137 4
|
3月前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
128 1
Java面试题之Java集合面试题 50道(带答案)