Java 流

一、明确要操作的数据是读还是写


InputStream  Reader

OutputStream  Writer

二、明确要操作的设备上的数据是字节还是文本


字节: InputStream
文本: Reader

字节: OutputStream
文本: Writer

三、明确数据所在的具体设备

源设备:
硬盘:文件File开头
内存:数组,字符串
键盘:System.in
网络:Socket

对应目的设备
硬盘:文件 File开头
内存:数组,字符串
屏幕:System.out
网络:Socket

四、明确是否需要额外功能

需要转换—— 转换流 InputStreamReader 、OutputStreamWriter
需要高效—— 缓冲流Bufferedxxx
多个源—— 序列流 SequenceInputStream
对象序列化—— ObjectInputStream、ObjectOutputStream
保证数据的输出形式—— 打印流PrintStream 、Printwriter
操作基本数据,保证字节原样性——DataOutputStream、DataInputStream

五、File类

至于IO流,也就是输入输出流,从文件出发到文件结束,至始至终都离不开文件,所以IO流还得从文件File类讲起。
File类是专门对文件进行操作的类,只能对文件本身进行操作,不能对文件内容进行操作。File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。File跟流无关,File类不能对文件进行读和写也就是输入和输出

六、初探IO流

按照流动的方向,以内存为基准,分为输入input 和输出output ,即流向内存是输入流,流出内存的输出流。
Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据
根据数据的流向分为:输入流 和 输出流。

  • 输入流 :把数据从其他设备上读取到内存中的流。
  • 输出流 :把数据从内存 中写出到其他设备上的流。

根据数据的类型分为:字节流 和 字符流。

  • 字节流 :以字节为单位,读写数据的流。
  • 字符流 :以字符为单位,读写数据的流
七、字节流OutputStream与InputStream

OutputStream是字节输出流的所有类的超类

1public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
2public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
3public void write(byte[] b):将 b.length个字节从指定的字节数组写入此输出流。
4public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。 也就是说从off个字节数开始读取一直到len个字节结束
5public abstract void write(int b) :将指定的字节输出流

InputStream是字节输入流的所有类的超类

1public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
2public abstract int read(): 从输入流读取数据的下一个字节。
3public int read(byte[] b): 该方法返回的int值代表的是读取了多少个字节,读到几个返回几个,读取不到返回-1

FileInputStream

  • java.io.FileInputStream类是文件输入流,从文件中读取字节。

FileOutputStream

  • 使用FileOutputStream写出字节数据主要通过Write方法,而write方法分如下三种
1public void write(int b)  写出字节,每次可以写出一个字节数据
2public void write(byte[] b)  写出字节数组,每次可以写出数组中的数据
3public void write(byte[] b,int off,int len)  //写出指定长度字节数组,从`off`索引开始,`len`个字节
八、字符流Reader和Writer的

字符流的由来:因为数据编码的不同,因而有了对字符进行高效操作的流对象,字符流本质其实就是基于字节流读取时,去查了指定的码表,而字节流直接读取数据会有乱码的问题(读中文会乱码,中文一个汉字占个2个字节,不能1个字节1个字节去读,而是应该一个字符一个字符去读)

字符输入流(Reader

1public void close() :关闭此流并释放与此流相关联的任何系统资源。
2public int read(): 从输入流读取一个字符。
3public int read(char[] cbuf): 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中

FileReader
java.io.FileReader类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

字符输出流(Writer

1void write(int c) 写入单个字符。
2void write(char[] cbuf)写入字符数组。
3abstract void write(char[] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
4void write(String str)写入字符串。
5void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
6void flush()刷新该流的缓冲。
7void close() 关闭此流,但要先刷新它。

FileWriter
java.io.FileWriter类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

注意:字符流,只能操作文本文件,不能操作图片,视频等非文本文件。当我们单纯读或者写文本文件时 使用字符流 其他情况使用字节流

九、缓冲流

字节缓冲流:BufferedInputStream,BufferedOutputStream
字符缓冲流:BufferedReader,BufferedWriter

十、转换流

众所周知,计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码 。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码 。比如说,按照A规则存储,同样按照A规则解析,那么就能显示正确的文本符号。反之,按照A规则存储,再按照B规则解析,就会导致乱码现象。

编码:字符(能看懂的)–字节(看不懂的)
解码:字节(看不懂的)–>字符(能看懂的)

String(byte[] bytes, String charsetName):通过指定的字符集解码字节数组
byte[] getBytes(String charsetName):使用指定的字符集合把字符串编码为字节数组
  • 编码:把看得懂的变成看不懂的 String – byte[]
  • 解码:把看不懂的变成看得懂的 byte[] – String

InputStreamReader类-----(字节流到字符流的桥梁)
OutputStreamWriter类-----(字符流到字节流的桥梁)

本来引自:https://www.cnblogs.com/yichunguo/p/11775270.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值