首页 > 编程语言 >Java的IO流

Java的IO流

时间:2024-02-25 18:11:27浏览次数:28  
标签:字符 Java 字节 输出 int len IO 读取

夯实基础的第三篇:IO流

1、流的概念

流就是一连串的连续动态数据的集合,在Java的IO流中我们可以将其看做一个管道,将其包含输入输出流,Sourcet通过输入流将数据信息传给程序,而程序又通过输出流将数据信息传给目的地。就类似于我们从外部将东西传给程序就要输入流,我们从程序传给外部就要输出流。

 2、四大IO抽象类

我们可以通过字节流和字符流来区分这四大IO抽象流。

字节流分为 InputStream 和 OutputStream :操作数据单位以字节 byte 为基础单位

字符流分为 Reader 和 Writer : 负责输出、写入数据,操作单位以字符 char 为基础单位

这里有疑问了,为什么有了字节流读取数据还要字符流这种方式呢:

由于存在不同的编码方式,不同编码方式字符对应不同的字节(如Java字符是采用 Unicode编码,一个英文为1byte,一个中文对应2byte,而在UTF-8编码中,一个英文为1byte,一个中文为3byte),因此为了方便处理如文中文这类字符数据时,会更优先考虑使用字符流。所以这也是Java针对不同情况进行考虑从而设计的结果。所以一般操作文件(如copy  file ,music,video这种二进制文件),会考虑使用字节流。而操作文本、字符串(如读取、写入中文字符串),会考虑使用字符流。

3、关于字节输入流与字节输出流  InputStream 、 OutputStream

3.1字节输入流  InputStream

InputStream是所有输入字节流的父类,常用到的三个不同输入参数的读取方法:

  • int  read():读取一个字节数据,并返回读到的数据,如果返回-1,表示已经读到了数据流的末尾
  • int  read(byte[] b):将数据读入一个字节数组,同时返回实际读取的字节数,如果返回-1表示已经读到了输入流的末尾
  • int  read(byte[] b, int  off,  int len):将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾,off指定在数组b中存放数据的起始偏移位置;len指定读取的最大字节数。
  • read() 方法有一个共同点,就是当读取到末尾则会返回-1,表示已经读取完毕。

关于InputStream,用的最多的是FileInputStream、BufferedInputStream。

  • FileInputStream 是文件字节输入流,一般操作文件(copy  file ,music,video这种二进制文件),会考虑使用FileInputStream字节流
  • BufferedInputStream 内部实现了一个缓冲区数组,可以一次性读取defaultBufferSize个字节,先缓存至数组(默认defaultBufferSize = 8192),BufferedInputStream 读文件性能高于 FileInputStream

3.2字节输出流 - OutputStream

OutputStream 是对应InputStream 的输出流,是所有输出字节流的父类

  • write(int  b):往输出流中写入一个字节
  • write(byte[] b):往输出流中写入数组b中的所有字节
  • write(byte[] b, int off, int len):往输出流中写入数组b中从偏移量中off开始的len个字节的数据
  • flush():刷新输出流,强制缓存区中的输出字节被写入(写入时要记得刷新一下,不然可能存在于缓冲区位写入)
  • close():关闭输出流,释放和这个流相关的系统资源

和OutputStream一样,用的较多的是FileInputStream、BufferedOutputStream

4、关于字符输出流与字节输出流-Reader、Writer

4.1字符输入流 Reader

Reader 是所有字符流的父类,是一个抽象类,与上面的字节流是一样的,不同的是它是以字符为单位读取,他有三个不同输入参数的读方法:

  • int  read():读物一个字符,返回值为读取的字符。
  • int  read(char  cbuf[]):读取一系列字符到数组cbuf[]中,返回值为实际读取的字符的数量
  • int read(char  cbuf[], int off, int len):读取len个字符,从数组cbuf[]的下标off处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现

关于Reader,用的最多的是BufferedReader、InputStreamReader

  • InputStreamReader  将字节流转变为字符流,作为连接字节流和字符流的桥梁
  • BufferedReader 加了缓存数组的方法,提高了性能。

4.2字符输出流 writer

Reader是所有输出字符流的父类,是一个抽象类,有5个不同输入残水的写法:

  • write(int c):写入单子字符
  • write(char cbuf[]):将字符数组cbuf[]写到输出流
  • write(char cbuf[], int off, int len):将字符数组cbuf[]中从索引为off的位置处开始的len个字符写入输出流
  • write(string str):将字符串str中的字符写入输出流
  • write(string str, int off, int len):建字符串str中从索引off开始处的len个字符写入输出流

关于writer,用的最多的是bufferwriter、OutputStreamwriter

  • OutputStreamWriter  将字节流转变为字符流是OutputStream 到write转换的桥梁
  • BufferedWriter  加了缓冲数组方法,提高了写性能。

标签:字符,Java,字节,输出,int,len,IO,读取
From: https://www.cnblogs.com/ChenRicky/p/18032576

相关文章

  • DVWA-Javascript
    Javascript漏洞指的是通过某种方式绕过前端的javascript逻辑进行服务器访问。 --low级别:服务器端代码:提交token无效的结果如下:因为这里要求是在文本框中提交success内容,并且获取到最新token信息,才能提交成功。因此,先在文本框中输入success,然后再console控制台中,手动调用g......
  • Graph-Skeleton: ~1% Nodes are Sufficient to Represent Billion-Scale Graph
    目录概符号说明EmpiricalAnalysisSkeletonGraphNodeFetchingGraphCondensation代码CaoL.,DengH.,WangC.,ChenL.andYangY.Graph-skeleton:~1%nodesaresufficienttorepresentbillion-scalegraph.WWW,2024.概本文提出了一种图压缩的方法,这些方法基......
  • Java学习笔记(1)
    常用DOS指令helloworld勾选文件扩展名创建.txt文件去掉.class后缀,运行java的执行原理组成跨平台使用IDEA创建项目之后直接编写代码使用Scanner接收输入数组静态初始化形式要注意数组的访问代码演示:publicclassMain{publicstaticvoidmain(......
  • Computer vision 计算机视觉 北邮
    Definition图像→感知设备(眼睛/摄像头)→解释器(大脑/笔记本电脑)→解释(花园、树、水……)HistoryDavidMarr1.计算理论计算的目的?这个问题已知的或可施加的约束是?2.表达和算法输入、输出和中间信息如何表达?用哪些算法可以计算期望的结果?3.硬件实现表达和算法如何映射到实际......
  • opencv android studio build.gradle修改为build.gradle.kts 文件示例
    注意将openCVersionName,openCVersionCode,compileSdk,minSdk进行相应的修改即可.plugins{id("com.android.library")id("org.jetbrains.kotlin.android")}valopenCVersionName="4.9.0"valopenCVersionCode=((4*100+9)*1......
  • Jakarta与javax的替换
    从JDK11开始,JavaSE平台开始逐步淘汰javax.*包,并逐渐将其替换为jakarta.*包。这是因为JavaEE从Oracle转移到了Eclipse基金会,并改名为JakartaEE,因此相关的API也相应地进行了迁移和重命名。这一变化对Java开发者的影响主要体现在以下几个方面:1.包名替换:在J......
  • IOC简单理解
    IOCrefreshBeanFactory()0、实例化IOC容器(就是一个Map<String,BeanDefinition>)1、资源加载器加载解析配置文件资源加载器接口ResourceLoader资源的抽象和访问接口ResourceFileSystemResource,文件系统资源的实现类ClassPathResource,classpath下资源的实现类UrlReso......
  • 依赖注入(Dependency Injection, DI)是一种设计模式,例如,在React中,父组件可以通过props向
    依赖注入renderprops其实就是React世界中的“依赖注入”(DependencyInjection)。所谓依赖注入,指的是解决这样一个问题:逻辑A依赖于逻辑B,如果让A直接依赖于B,当然可行,但是A就没法做得通用了。依赖注入就是把B的逻辑以函数形式传递给A,A和B之间只需要对这个函数......
  • Java基础07:基本运算符
    运算符1.Java语言支持如下运算符:1.1算术运算符:+,-,*,/,%,++,--1.2赋值运算符:=1.3关系运算符:>,<,>=,==,!=instanceof1.4逻辑运算符:&,|,^,~,>>,<<,>>>(了解)1.5条件运算符?:1.6扩展赋值运算:+=,-=,*=,/= ......
  • Android Studio 引入 OpenCV 之后 出现 Plugin was not found in any of the followin
    网上看了各种方法,什么设置代理啊,清缓存啊,重启啊之类的都试过了,都不行,后来看到帖子说OpenCV的包用的是Groovy的,即build.gradle文件而不是Kotlin的build.gradle.kts文件,然后我改了还是会报错后来我发现我遗漏了一个重点!!!要将项目根目录下的setting.gradl......