首页 > 编程语言 >Java常见流的分类及简单讲解

Java常见流的分类及简单讲解

时间:2024-05-27 13:01:17浏览次数:29  
标签:字符 Java 字节 文件 int 分类 输出 讲解 输入

目录

一、梳理总结一 

1.字节流:

2.字符流:

二、梳理总结二

什么是IO流

字符流与字节流的关系

缓冲流BufferedReader/BufferedWriter,BufferedInputStream/BufferedOutputStream


一、梳理总结一 

流在Java中是指计算中流动的缓冲区。

从外部设备流向中央处理器的数据流成为“输入流”,反之成为“输出流”。

字符流和字节流的主要区别:

 1.字节流读取的时候,读到一个字节就返回一个字节;字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8码表中是3个字节)时。先去查指定的编码表,将查到的字符返回。

 2.字节流可以处理所有类型数据,如:图片,MP3,AVI视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。

1.字节流:

字节输入流类:FileInputStream、BufferedInputStream和DataInputStream

FileInputStream:此类用于从本地文件系统中读取文件内容。

构造方法:

·FileInputStream(File file):打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象file指定。

·FileInputStream(String name):打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径名name指定。

常用方法:

·int available():返回下一次对此输入流调用的方法不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。

·void close():关闭此文件输入流并释放与该流关联的所有系统资源。

BufferedInputStream:此类本身带有一个缓冲区,在读取数据时,先放到缓冲区中,可以减少对数据源的访问,提高运行的效率。

构造方法:

·BufferedInputStream(InputStream in):创建一个BufferedInputStream并保存其参数,即输入流in,以便将来使用。

·BufferedInputStream(InputStream in,int size):创建一个具有指定缓冲区大小的BufferedInputStream并保存其参数,即输入流in,以便将来使用。

常用方法:

·int available():返回下一次对此输入流调用的方法不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。

·void close():关闭此输入流并释放与该流关联的所有系统资源。

·int read():从输入流中读取数据的下一个字节。

·int read(byte[] b,int off,int len):从此字节输入流中给定偏移量处开始将各字节读取到指定的byte数组中。

 DataInputStream:该类提供一些基于多字节读取方法,从而可以读取基本数据类型的数据。

构造方法:

·DataInputStream(InputStream in):使用指定的底层InputStream创建一个DataInputStream。

常用方法:

·int read(byte[] b):从包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组b中。

·int read(byte[] b,int off,int len):从包含的输入流中将最多len个字节读入一个byte数组中。

字节输出流类:FileOutputStream、BufferedOutputStream和DataOutputStream

FileOutputStream:此类用于从本地文件系统的文件中写入数据。

构造方法:

·FileOutputStream(File file):创建一个向指定File对象表示的文件中写入数据的文件输出流。

·FileOutputStream(String name):创建一个向具有指定名称的文件中写入数据的输出文件流。

常用方法:

·void close():关闭此文件输出流并释放与此流有关的所有系统资源。

·FileDescriptor getFD():返回与此流有关的文件描述符。

·void write(byte[] b):将b.length个字节从指定byte数组写入此文件输出流中。

·void write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入此文件输出流。

·void write(int b):将指定字节写入此文件输出流。

BufferedOutputStream:此类本身带有一个缓冲区,在写入数据时,先放到缓冲区中,实现缓冲的数据流。

构造方法:

·BufferedOutputStream(OutputStream out):创建一个新的缓冲输出流,来将数据写入指定的底层输入流。

·BufferedOutputStream(OutputStream out,int size):创建一个新的缓冲输出流,来将具有指定缓冲区大小的数据写入指定的底层输出流。

常用方法:

·void flush():刷新此缓冲的输出流。

·void write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入此缓冲的输出流。

·void write(int b):将指定的字节写入此缓冲的输出流。

DataOutputStream(OutputStream out):创建一个新的数据输出流,将数据写入指定基础输出流。

常用方法:

·void flush():清空此数据输出流。

·int size():返回计数器written的当前值,即到目前为止写入此数据输出流的字节数。

·void write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入基础输出流。

·void write(int b):将指定字节(参数b的八个低位)写入基础输出流。

2.字符流:

FileReader:用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。

构造方法:

·FileReader(File file):在给定从中读取数据的File的情况下创建一个新的FileReader。

·FileReader(String fileName):在给定从中读取数据的文件名的情况下创建一个新的FileReader。

BufferedReader类是Reader类的子类,为Reader对象添加字符缓冲器,为数据输入分配内存存储空间,存取数据更为有效。

构造方法:

·BufferedReader(Reader in):创建一个使用默认大小输入缓冲区的缓冲字符输入流。

·BufferedReader(Reader in,int sz):创建一个使用指定大小输入缓冲区的缓冲字符输入流。

操作方法:

·void close():关闭该流并释放与之关联的所有资源。

·void mark(int readAheadLimit):标记流中的当前为止。

·boolean markSupported();判断此流是否支持mark()操作。

·int read():读取单个字符。

·int read(char[] cbuf,int off,int len):将字符读入数组的某一部分。

·String readLine():读取一个文本行。

·boolean ready():判断此流是否已准备好被读取。

·void reset():将流重置到最新的标记。

·long skip(long n):跳过字符。

FileWriter:用来写入字符文件的便捷类,可用于写入字符流。

构造方法:

·FileWriter(File file):根据给定的File对象构造一个FileWriter对象。

·FileWriter(String filename):根据给定的文件名构造一个FileWriter对象。

BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。


Java输入/输出流体系中常用的流分类(表内容来自java疯狂讲义)

注:下表中带下划线的是抽象类,不能创建对象。粗体部分是节点流,其他就是常用的处理流。

流分类使用分类字节输入流字节输出流字符输入流字符输出流
抽象基类InputStream

OutputStream

ReaderWriter
节点流访问文件FileInputStreamFileOutStreamFileReaderFileWriter
访问数值ByteArrayInputStreamByteArrayOutStreamCharArrayReaderCharArrayWriter
访问管道PipedInputStreamPipedOutStreamPipedReaderPipedWriter
访问字符串StringReaderStringWriter
处理流缓冲流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter
转换流InputStreamReaderOutputStreamWriter
对象流ObjectInputStreamObjectOutputStream
抽象基类(过滤)FilterInputStreamFilterOutputStreamFilterReaderFilterWriter
打印流PrintStreamPrintWriter
推回输入流PushbackInputStreamPushbackReader
特殊流DataInputStreamDataOutputStream

———————————————————————————————————————————————————————

总结:

1.Java IO是采用的是装饰模式,即采用处理流来包装节点流的方式,来达到代码通用性。

2.处理流和节点流的区分方法,节点流在新建时需要一个数据源(文件、网络)作为参数,而处理流需要一个节点流作为参数。

3.处理流的作用就是提高代码通用性,编写代码的便捷性,提高性能。

4.节点流都是对应抽象基类的实现类,它们都实现了抽象基类的基础读写方法。其中read()方法如果返回-1,代表已经读到数据源末尾。

参考链接:https://www.cnblogs.com/lca1826/p/6427177.html

参考链接:https://www.cnblogs.com/moonpool/p/5488463.html

二、梳理总结二

什么是IO流

首先我们要明白什么是流?流是计算机用来传输文件、保存文件的一种方式。我们在开发中会经常用到IO流,如:文件的上传和下载,文件的复制等。根据流的方向,分为输入流和输出流。通常二者搭配使用完成文件上传和下载。输入流就是你要让计算机知道他要操作的是哪个文件,什么文件,要读取到这个文件,这个从外到内的过程就是输入流(InputStream),如文件下载;那么,输出流就刚好相反,它是计算机已经有了这个文件,但开发者希望把这个文件保存到另外一个地方,这种从内到外的过程就是输出流(OutputStream)如文件上传。根据流的分类,输入流又包括字符输入流(FileReader)和字节输入流(InputStream),输出流包括字符输出流(FileWriter)和字节输出流(OutputStream)。虽然也还有其他的输入输出流,但最常用的还是这几种。

如果你觉得IO流只有这些东西那你就大错特错了除了常见的这四种流的表现形式,还用一种很常用的流——缓冲流。但在介绍缓冲流之前,我们要先明白字符流和字节流的关系才能够更好的理解缓冲流

字符流与字节流的关系

说起字符流与字节流的关系,可能有的小伙伴就说了,我前面已经说过了:字符流就是按字符读取文件的形式,一般作用于文本类型的文件;而字节流就是按字节读取文件的形式,一般用来操作视频或图片等文件。但如果仅仅知道这些那就太简单了,为什么字符流通常操作String类、文本文件呢?为什么不能操作字符流操作视频和图片呢?那字节流可以操作文本类型的文件吗?为什么呢?

       其实,这是因为字符流每次按char读取文件,读取文本类型当然没有问题,但视频和图片都属于字节码文件,如果用字符流来输入或输出文件,就会造成乱码。想看效果的同学可以试一下,这就相当于我们把这个图片或视频文件直接以记事本的方式打开了,乱码是必然的。那字节流可以操作文本文件吗?答案是肯定的,为什么呢?我们都知道,计算机存储文件都是以二进制、十进制、十六进制等字节的方式存储的,包括文本文件,所以用字节流操作文本文件是没有问题的。说到这里,很多小伙伴就已经明白两者的关系了,没错,字节流包含字符流,为什么,因为字符流的底层实现也是字节流,它只不过是对字节流的封装罢了。但我们都知道,字符流是以char为单位读取文件的,这会大大影响我们程序的效率,那么怎么解决呢?没错,就是缓冲流。

缓冲流BufferedReader/BufferedWriter,BufferedInputStream/BufferedOutputStream

 我们都知道,StringBuffer的效率远比String的效率高很多,流也一样,缓冲流就是把char类型封装成为了StringBuffer类型。下面我们看一下它的用法,其实都一样。

这里就单举BufferedReader的用法,其他三种与它的方式一样,就不一一列举了。但值得注意的是:

没有经过Buffered处理的IO, 意味着每一次读和写的请求都会由OS底层直接处理,这会导致非常低效的问题。

经过Buffered处理过的输入流将会从一个buffer内存区域读取数据,本地API只会在buffer空了之后才会被调用(可能一次调用会填充很多数据进buffer)。

经过Buffered处理过的输出流将会把数据写入到buffer中,本地API只会在buffer满了之后才会被调用。

BufferedReader/BufferedWriter可以将字符流(Reader)包装成缓冲流,这是最常见用的做法。

另外,BufferedReader提供一个readLine()可以方便地读取一行,而FileInputStream和FileReader只能读取一个字节或者一个字符,

因此BufferedReader也被称为行读取器

以上笔者只是讲解了笔者认为IO流中最常用的几种表现形式。希望能给各位小伙伴提供有效的帮助。不足之处,欢迎补充。

标签:字符,Java,字节,文件,int,分类,输出,讲解,输入
From: https://blog.csdn.net/m0_59679869/article/details/139235224

相关文章

  • Java语言程序设计1 第二章:变量、数据类型、运算符、表达式
    一、变量1.概念:        计算机中的一块内存空间,存储数据的基本单元2.变量的组成部分:        数据类型、变量名、数据3.语法:        (1)先声明,再赋值:       ·数据类型变量名;//声明                变量......
  • java 实现递归方法
    递归是一种通过调用自身的函数来解决问题的方法。在Java中,编写递归可以按照以下步骤进行:确定基本情况:首先确定递归函数的基本情况,即递归终止条件。通常,这是一个简单的情况,无需进一步递归调用即可解决。定义递归方法:编写一个方法来解决问题,并在方法中判断是否需要进行递归调......
  • Java涉及的运算符
    Java涉及的运算符有以下几种:算术运算符:用于进行基本的数学运算,包括加法(+)、减法(-)、乘法(*)、除法(/)、取余(%)等。赋值运算符:用于将一个值赋给变量,包括简单赋值(=)、加法赋值(+=)、减法赋值(-=)、乘法赋值(*=)、除法赋值(/=)、取余赋值(%=)等。关系运算符:用于比较两个值之间的关系,返回一个布......
  • java 数组的常见操作
    在Java中,数组是一种特殊的对象,用于存储相同类型的多个元素。以下是一些常见的数组操作:声明数组:使用以下语法声明一个数组,其中type是数组元素的数据类型,name是数组的名称。type[]name;例如,声明一个整数数组:int[]numbers;创建数组:使用关键字new和数组的长度来......
  • javaEE—图书管理系统(基础代码版)
                           前言:本篇博客是集合了javaEE所学的知识构建的一个基础框架,讲述着面向对象的过程是如何做到多对象交互协作完成框架的构建的。利用了数组,接口,类和对象,抽象类,Object类等知识来完成。后续会加入数据库,网页......
  • 基于深度学习的图像分类的GUI界面
    欢迎大家点赞、收藏、关注、评论啦,由于篇幅有限,只展示了部分核心代码。文章目录一项目简介二、功能三、系统四.总结一项目简介  一、项目背景与意义随着深度学习技术的快速发展,图像分类技术已经取得了显著的进步,并在各个领域得到了广泛应用。然而,对于非专......
  • 计算机毕业设计springboot+vue学生档案学籍信息管理系统java
    本文所设计的学籍系统的设计与实现拥有前端和后端,前端使用Vue.js框架和创建,后端使用Springboot框架创建,开发语言采用Java,使用Mysql数据库对后台数据进行存储。将IDEA作为主要的开发工具。接着进行系统的需求分析、功能设计、数据库设计,最后进行编码实现。技术栈ide工具:IDEA......
  • Java 8 中Stream用法
    Stream是Java8新增的接口,Stream可以认为是一个高级版本的Iterator。废话不多说直接上代码 packagecom.example.demo;importorg.junit.jupiter.api.Test;importorg.springframework.boot.test.context.SpringBootTest;importjava.util.Arrays;importjava.util.L......
  • 1915springboot VUE 宠物寄养平台系统开发mysql数据库web结构java编程计算机网页源码m
    一、源码特点 springbootVUE宠物寄养平台系统是一套完善的完整信息管理类型系统,结合springboot框架和VUE完成本系统,对理解JSPjava编程开发语言有帮助系统采用springboot框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要采用B/S模式开发。springbootVUE宠物寄养......
  • java方法重写的语法要求
    ​ /* *重写要遵循"两同两小一大"原则: *1)两同: * 1.1)方法名相同 * 1.2)参数列表相同 *2)两小: * 2.1)子类方法的返回值类型小于或等于父类的 *   2.1.1)void时,必须相同 *   2.1.2)基本类型时,必须相同 *   2.1.3)引用类型时,小于或......