这一篇搞懂Java中的IO流

本文详细介绍了Java中的IO流和NIO流,包括字节流与字符流的区别、IO流的分类及其应用场景,以及NIO的核心组件:Channel、Buffer和Selector。通过对比IO的阻塞与NIO的非阻塞特性,展示了NIO如何提高并发处理能力。此外,还讨论了网络通信的三种模型:IO、NIO和AIO,以及在Java NIO中常用的Channel实现和Buffer类型。
摘要由CSDN通过智能技术生成

本篇是Java基础中的IO和NIO的讲解,IO和NIO在Java中可以说是必不可少,涉及到硬盘文件读写、网络文件读写等,只要是和文件打交道基本少不了IO和NIO的陪伴,那么接下来我们一起来学习IO和NIO吧,博主会持续更新更多文章,觉得不错的可以点个关注

IO流的学习

我们都知道在IO中,IO的超类有字节流InputStream和OutputStream、字符流Reader和Writer,我们先来从整体认识一下IO流

字节流的输入和输出对照图:

字符流的输入和输出对照图: 按操作对象分类结构图:

IO流指的是Input/Output,即输入和输出,以内存为中心

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

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

为什么要把数据读取到内存中呢?

因为我们的Java代码是运行在内存中的,因此数据也必须读取到内存中 ,最终的表现形式是字符串、byte数组等

字节流和字符流的区别又是什么呢,为什么要出现这两种流?

首先明确字节和Byte和字符Character的大小:

  • 1 byte = 8 bit

  • 1 char = 2 byte = 16 bit (Java默认UTF-16编码)

虽然1 bit才是数据真正的最小单位,但1 bit 的信息量太少了。

要表示一个有用的信息,需要好几个bit一起表示。所以除了硬件层面存在1个比特位的寄存器,大多数情况下,字节是数据最小的基本单位。

我们熟知的基本型的大小都是8 bit(也就是1字节)的整数倍:short是2byte,int是4byte,long是8byte等

原本对于西方世界来说,可能根本用不到字符,一个字节问题全部解决了,因为一个字节8bit,最多有256个字符编码,英语26个字母,再加几个常用符号,标点,256个码位足够了,这就熟悉的ASCII码。

但是无法解决更多的国家的语言,伴随这问题出现了各种类型的编码ISO-8859-1、GBK、UTF-8、UTF-16等多种编码类型(这里不一一介绍了),总而言之,一切都是字节流,可以说其实没有字符流这个东西,字符只是根据编码集对字节流翻译之后的产物。

也就是字节流的InputStream和OutputStream是一切的基础,实际总线中流动的只有字节流,需要对字节流做特殊解码才能得到字符流

  • 字节流读取的时候,读到一个字节就返回一个字节;字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在 UTF-8 码表中是 3 个字节)时

  • 字节流没有缓冲区,是直接输出的,而字符流是输出到缓冲区的。因此在输出时,字节流不调用colse()方法时,信息已经输出了,而字符流只有在调用close()方法关闭缓冲区时,信息才输出。要想字符流在未关闭时输出信息,则需要手动调用flush()方法

  • 字节流是最基本的,所有的InputStrem和OutputStream的子类都是字节流,主要用在处理二进制数据,它是按字节来处理的。而字符流是Writer和Reader作为超类来操作字符、字符数组或字符串,可以将字节转换成 2 个字节的 Unicode 字符为单位的字符

  • 字节流和字符流这两个之间通过InputStreamReader,OutputStreamWriter(转换流)来关联,实际上是通过 byte[]和 String来关联的

接下来我们学习使用字节流和字符流

在此之前,我需要先介绍一下File对象和Path对象的使用。在计算机系统中,文件是非常重要的存储方式,Java的标准库java.io提供了File对象来操作文件和目录。我们通过传入文件的路径(可以传入相对路径或者绝对路径)来构造一个File对象,Windows平台使用\作为路径分隔符,在Java字符串中需要用\表示一个\,Linux平台使用/作为路径分隔符

 File f = new File("d:\test.txt");

File对象既可以表示文件,也可以表示目录。

特别要注意的是,构造一个File对象,即使传入的文件或目录不存在,代码也不会出错,因为构造一个File对象,并不会导致任何磁盘操作。只有当我们调用File对象的某些方法的时候,才真正进行磁盘操作。我们可以通过File对象创建和删除文件、遍历文件和目录等。Java标准库还提供了一个Path对象,它位于java.nio.file包。Path对象和File对象类似,但操作更加简单:

Path p1 = Paths.get(".", "a", "b"); // 构造一个Path对象Path
p2 = p1.toAbsolutePath(); // 转换为绝对路径Path
p3 = p2.normalize();<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值