Java 的 IO 很复杂?用思路带领你去battle他!

本文深入解析Java的IO流,包括IO流的定义、特点、分类及核心对象,如InputStream、OutputStream、Reader和Writer。通过实例演示了FileInputStream、FileOutputStream、BufferedInputStream和BufferedOutputStream等流的使用,强调了缓冲流的重要性以及close()和flush()的正确使用,帮助开发者理解和掌握Java IO流的实战技巧。
摘要由CSDN通过智能技术生成

所有编程语言都涉及IO,java也不例外。

初学者入门Java,难理解是正常的,包括我。

简单的说:IO就是和Java以外的文件打交道。

既然要处理文件,那么就需要Java提供的IO接口进行处理:

- Input指从外部读入数据到内存

- Output指把数据从内存输出到外部

要掌握Java的IO,核心就是:选择合适的IO流读写文件。


以下是Java硬核的IO技术文介绍,希望可以帮到学习IO的小伙伴:

1、什么是IO

I/O 是指Input/Output,即输入和输出。

  • Input指从外部读入数据到内存,例如,把文件从磁盘读取到内存,从网络读取数据到内存等等。
  • Output指把数据从内存输出到外部,例如,把数据从内存写入到文件,把数据从内存输出到网络等等。

Java程序在执行的时候,是在内存进行的,外部的数据需要读写到内存才能处理;而在内存中的数据是随着程序结束就消失的,有时候我们也需要把数据输出到外部文件。

Java中,是通过 处理IO的,这种处理模式称为 IO流,IO流是一种顺序读写数据的模式。

你可以想象它是一根水管,数据就像水一样, 起点—终点 可互相流动。

1.1、流的特点:

  1. 先进先出:最先写入输出流的数据最先被输入流读取到。
  2. 顺序存取:可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile除外)
  3. 只读或只写:每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。

1.2、IO流的分类

1.1.1、按方向分

按数据流的方向分为 输入流、输出流,是相对内存来说的。

  • 输入流:从外部(数据源)把数据输入到程序(内存)。
  • 输出流:把程序的数据(内存)输出到外部(数据源)。

1.1.2、按处理数据类型分

按处理的数据类型可分为 字节流、字符流

1字符 = 2字节 、 1字节(byte) = 8位(bit)
  • 字节流:每次读 (写)一个字节,当传输的资源文件有中文时,就会出现乱码,读写的单位是byte,在InputStream/OutputStream中单向流动
  • 字符流:每次读取(写出)两个字节,有中文时,使用该流就可以正确传输显示中文,读写的单位是char,在Reader/Writer中单向流动

字节流和字符流的原理是相同的,只不过处理的单位不同而已。后缀是Stream是字节流,而后缀是Reader,Writer是字符流。

为什么要有字符流?

Java中字符是采用Unicode标准,Unicode 编码中,一个英文为一个字节,一个中文为两个字节。但是编码不同,中文字符占的字节数不一样,而在UTF-8编码中,一个中文字符是3个字节。

如果统一使用字节流处理中文,因为读写是一个字节一个字节,这样就会对中文字符有影响,就会出现乱码。

为了更方便地处理中文这些字符,Java就推出了字符流。

字节流和字符流的其他区别:

  1. 字节流一般用来处理图像、视频、音频、PPT、Word等类型的文件。字符流一般用于处理纯文本类型的文件,如TXT文件等,但不能处理图像视频等非文本文件。
用一句话说就是:字节流可以处理一切文件,而字符流只能处理纯文本文件。
  1. 字节流本身没有缓冲区,缓冲字节流相对于字节流,效率提升非常高。而字符流本身就带有缓冲区,缓冲字符流相对于字符流效率提升就不是那么大了。

1.1.3、按功能分

按功能不同分为 节点流、处理流

  • 节点流:以从或向一个特定的地方(节点)读写数据。如FileInputStream
  • 处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装.

1.1.4、按有无缓冲分

还有一种流是缓冲流,区别于没有缓冲的流。

因为程序和内存交互很快,而程序和磁盘交互是很慢的,这样会导致程序出现性能问题。

为了减少程序与磁盘的交互,是提升程序效率,引入了缓冲流

普通流每次读写一个字节,而缓冲流在内存中设置一个缓存区,缓冲区先存储足够的待操作数据后,再与内存或磁盘进行交互。这样,在总数据量不变的情况下,通过提高每次交互的数据量,减少了交互次数。

有缓冲的流,类名前缀是带有Buffer的,比如BufferedInputStreamBufferedReader


2、Java IO 流对象详解

以上说了这么多流,看起来很复杂,但其实只需要记住以下四种流即可:

这四个都是抽象类,都位于 java.io 包目录。

我们平时使用流去处理数据,都是通过这四个流的子类展开的

挑一些常用的放在下面一一讲解。

2.1、InputStream ——字节流输入流

InputStream 这个抽象类是表示以上输入字节流的所有类的超类&#

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值