每日一道面试题之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来关联,我们在实际开发中经常遇到的汉字乱码问题,实际上就是由于字符流和字节流之间转化不统一而造成的

相关文章
|
21天前
|
安全 架构师 Java
Java大厂面试高频:Collection 和 Collections 到底咋回答?
Java中的`Collection`和`Collections`是两个容易混淆的概念。`Collection`是集合框架的根接口,定义了集合的基本操作方法,如添加、删除等;而`Collections`是一个工具类,提供了操作集合的静态方法,如排序、查找、同步化等。简单来说,`Collection`关注数据结构,`Collections`则提供功能增强。通过小王的面试经历,我们可以更好地理解这两者的区别及其在实际开发中的应用。希望这篇文章能帮助你掌握这个经典面试题。
37 4
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
121 2
|
9天前
|
Java 程序员
Java社招面试中的高频考点:Callable、Future与FutureTask详解
大家好,我是小米。本文主要讲解Java多线程编程中的三个重要概念:Callable、Future和FutureTask。它们在实际开发中帮助我们更灵活、高效地处理多线程任务,尤其适合社招面试场景。通过 Callable 可以定义有返回值且可能抛出异常的任务;Future 用于获取任务结果并提供取消和检查状态的功能;FutureTask 则结合了两者的优势,既可执行任务又可获取结果。掌握这些知识不仅能提升你的编程能力,还能让你在面试中脱颖而出。文中结合实例详细介绍了这三个概念的使用方法及其区别与联系。希望对大家有所帮助!
103 60
|
8天前
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
45 16
|
5天前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
36 9
|
10天前
|
安全 Java 程序员
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
42 12
|
21天前
|
监控 Dubbo Java
Java Dubbo 面试题
Java Dubbo相关基础面试题
|
21天前
|
SQL Java 数据库连接
Java MyBatis 面试题
Java MyBatis相关基础面试题
|
21天前
|
存储 监控 算法
Java JVM 面试题
Java JVM(虚拟机)相关基础面试题
|
21天前
|
SQL 监控 druid
Java Druid 面试题
Java Druid 连接池相关基础面试题

热门文章

最新文章