字节流字符流傻傻分不清_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 字节流字符流傻傻分不清

字节流字符流傻傻分不清

 2016/11/29 5:31:56  Sunflower-13  程序员俱乐部  我要评论(0)
  • 摘要:字节流字符流傻傻分不清对于字节流跟字符流,及其他们的子类总是感觉模糊不清,于是找视频又大致看了一遍,(我的区分方法是:后缀带有reader和writer的便是字符流,没有的便是字节流)于是有了下面的一些总结。字节流:分为字节输入流(InputStream)和字节输出流(OutputStream)。而输入流和输出流相对于内存设备而言:输入:将外设中的数据读取到内存中输出:将内存的数写入到外设字节输入流:InputStream常用方法:available():输入流中的字节数close()
  • 标签:

class="MsoNormal" style="text-align: center;">字节流字符流傻傻分不清

????对于字节流跟字符流,及其他们的子类总是感觉模糊不清,于是找视频又大致看了一遍,(我的区分方法是:后缀带有readerwriter的便是字符流,没有的便是字节流)于是有了下面的一些总结。

字节流:分为字节输入流InputStream)和字节输出流 OutputStream)。

而输入流和输出流相对于内存设备而言:

输入:将外设中的数据读取到内存中

输出:将内存的数写入到外设

字节输入流:InputStream

??常用方法

? ? available() :输入流中的字节数

???close() :关闭数据流

???read() :从流中读取一个字节 ?如果到达文件末尾,则返回-1

???read(byte[] b):从流中读取字节填充b数组,一直到填满为止,如果到达文件末尾,则返回-1

read(byte[] b,int off, int len) :从流中读取字节填充b数组,从off位置开始填充,填充len个字节,如果到达文件末尾,则返回-1

skip(int t): 跳过并丢弃流中的n个字节

字节输出流 OutputStream

? ??常用方法

? ? ? ? ? ? close() :关闭数据流

? ? ? ? ? ? flush() :刷新此输出流并强制写出所有缓冲的输出字节

? ? ? ? ? ? write(int b) : 将参数以字节[只写8个低位]的方式写到流中

? ? ? ? ? ? write(byte[] b)将参数数组中的所有字节写到流中

? ? ? ? ? ? write(byte[] b,int off,int len):将参数数组中的从off位置开始,len个字节写到流中

?

?

字节流的部分子类:

??文件字节输入流:FileInputStream ——用于读取诸如图像数据之类的原始字节流

文件字节输出流:FileOutputStream——用于写入诸如图像数据之类的原始字节的流

缓冲字节输入流:BufferedInputStream——缓冲输入以及支持 mark reset 方法的能力

缓冲字节输出流:BufferedOutputStream——实现缓冲的输出流

基本类型数据输入流:DataInputStream——读取基本 Java 数据类型

基本数据类型输出流:DataOutputStream——将基本 Java 数据类型写入输出流中

??对象输出流:ObjectOutputStream——将 Java 对象的基本数据类型和图形写入 OutputStream

? ?对象输入流:ObjectInputStream ——对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化

??管道输入流:PipedInputStream——管道输入流提供要写入管道输出流的所有数据字节

管道输出流:PipedOutputStream——是管道的发送端

序列输入流:SequenceInputStream——表示其他输入流的逻辑串联

字节打印流:PrintStream——能够方便地打印各种数据值表示形式

?

?

?

?

??

字符流:分为字符输入流 InputStreamReader)和字符输出流? OutputStreamWriter

????字符流简单的来说是:字节流+编码

? ? ?字符输入流 InputStreamReader——是字节流通向字符流的桥梁

? ? ? ? ? ? ? ?FileReader : 文件字符输入流——用于读取字符流

? ? ? ? ? ? ? ?BufferedReader ?: 缓冲字符输入流——从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取

????????????

????字符输出流? OutputStreamWriter——是字符流通向字节流的桥梁

? ? ? ? ? ? ? ? FileWriter : 文件字符输出流—— 用于写入字符流

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

??

转换流:

?字节——字符

? ? InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//将字节流包装成字符流

? ? InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"gbk");//将字节流包装成带gbk编码格式的字符流

? ? FileReader fr = new FileReader("a.txt");//读取包装成字符流的字节流文件

?

? 字符——字节

? ? FileWriter fw = new FileWriter("b.txt");//创建文件字符输出流文件

? ? OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"));//将文件字符输出流文件写入文件字节输出流文件中

? ? OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"),"gbk");//将文件字符输出流文件写入带编码格式的文件字节输出流文件中

?注:

? ? 如果操作文本文件使用的本地默认编码表完成编码。可以使用FileReader,或者FileWriter

? ? 如果对操作的文本文件需要使用指定编码表进行编解码操作,这时必须使用转换流来完成。

?

用文件通道读写文件

? ?RandomAccessFile: 随机访问文件——支持对随机访问文件的读取和写入

? ?FileChannel文件通道——用于读取、写入、映射和操作文件的通道

? ?E.g

? ? ? ?File src= new File(path);//获取文件路径

? ? ? ?long count = src.length();//获取文件长度

?

? ? ? ? RandomAccessFile raf = new RandomAccessFile(src, "r");//只读文件

? ? ? ? RandomAccessFile raf2 = new RandomAccessFile(src2, "rw");//读写文件

?

? ? ? ? FileChannel fromChannel = raf.getChannel();//创建读取文件的通道

? ? ? ? FileChannel toChannel = raf2.getChannel();//创建读写文件的通道

?

? ? ? ? fromChannel.transferTo(0, count, toChannel);//将字节从fromChannel 通道的文件传输到给定的可写入字节通道toChannel

? ? ? ?//toChannel.transferFrom(fromChannel, 0, count);//将字节从给定的可读取字节通道toChannel 传输到fromChannel 通道的文件中

? ? ? ?raf.close();//关闭只读文件

? ? ? ?raf2.close();//关闭可读写文件

?

那么如何操作io流呢?

1、明确体系:

数据源:输入:InputStream /Reader

数据汇:输出:OutputStream/Writer

?

2、明确数据:字节/字符。

数据源:是纯文本数据Reader

数据源:不是纯文本数据InputStream

?

数据汇:是纯文本数据write

数据汇:不是纯文本数据OutputStream

3、明确设备:

数据源:

键盘:System.in

硬盘FileXXX

内存:数组。

网络:socket ?socket.getInputStream();

?

数据汇:

控制台:System.out

硬盘:FileXXX

内存:数组

网络:socket socket.getOutputStream();

?

4、明确额外功能:

1)、需要转换?是,使用转换流。InputStreamReader /OutputStreamWriter

2)、需要高效?是,使用缓冲区。

???????BufferedReader/BufferedWrite ; BufferedInputStream/BufferedOutputStream

3)、需要其他?PrintStream/PrintWriterSequenceInputStreamObjectInputStream / ObjectOutputStreamRandomAccessFilePipedOutputStream/PipedInputStream……

?

?

E.g

1、复制一个文本文件。?

1)、明确体系:

源:InputStream/Reader

目的:OutputStream /Writer

2)、明确数据:

源:是纯文本吗?是 Reader

目的;是纯文本吗?是 Writer

3)、明确设备:

源:硬盘上的一个文件。FileReader

目的:硬盘上的一个文件。FileWriter

FileReader fr = new FileReader("a.txt");

FileWriter fw = new FileWriter("b.txt");

4)、需要额外功能吗?

需要,高效,使用buffer

BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));

BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));

?

?

?

2、读取键盘录入,将数据存储到一个文件中。

1)、明确体系:

源:InputStream /Reader

目的:OutputStream /Writer

2)、明确数据:

源:是纯文本吗?是 Reader

目的;是纯文本吗?是 Writer

3)、明确设备:

源:键盘,System.in

目的:硬盘,FileWriter

InputStream in = System.in;

FileWriter fw = new FileWriter("a.txt");

4)、需要额外功能吗?

需要,因为源明确的体系时Reader。可是源的设备是System.in

所以为了方便于操作文本数据,将源转成字符流。需要转换流。InputStreamReader

InputStreamReader isr = new InputStreamReader(System.in);

FileWriter fw ?= new FileWriter("a.txt");

需要高效不?需要。Buffer

BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

BufferedWriter bufw = new BufferedWriter(new FileWriter("a.txt"));

?

?

3、读取一个文本文件,将数据展现在控制台上。

1)、明确体系:

源:InputStream /Reader

目的:OutputStream/Writer

2)、明确数据:

源:是纯文本吗?是 Reader

目的;是纯文本吗?是 Writer

3)、明确设备:

源:硬盘文件,FileReader

目的:控制台:System.out

FileReader fr = new FileReader("a.txt");

OutputStream out = System.out;

4)、需要额外功能?

因为源是文本数据,确定是Writer体系。所以为了方便操作字符数据,

需要使用字符流,但是目的又是一个字节输出流。

需要一个转换流,OutputStreamWriter

FileReader fr = new FileReader("a.txt");

OutputStreamWriter osw = new OutputStreamWriter(System.out);

?

需要高效吗?需要。

BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));

BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

?

?

?

4、读取键盘录入,将数据展现在控制台上。

1)、明确体系:

源:InputStream /Reader

目的:OutputStream/Writer

2)、明确数据:

源:是纯文本吗?是 Reader

目的;是纯文本吗?是 Writer

3)、明确设备:

源:键盘:System.in

目的:控制台:System.out

InputStream in = System.in;

OutputStream out = System.out;

4,需要额外功能吗?

因为处理的数据是文本数据,同时确定是字符流体系。

为方便操作字符数据的可以将源和目的都转成字符流。使用转换流。

为了提高效率,使用Buffer

BufferedReader bufr ?=new BufferedReader(new InputStreamReader(Systme.in));

BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

?

?

?

?

5、读取一个文本文件,将文件按照指定的编码表UTF-8进行存储,保存到另一个文件中。

1)、明确体系:

源:InputStream /Reader

目的:OutputStream /Writer

2)、明确数据:

源:是纯文本吗?是 Reader

目的;是纯文本吗?是 Writer

?

3)、明确设备:

源:硬盘:FileReader.

目的:硬盘:FileWriter

?

FileReader fr = new FileReader("a.txt");

FileWriter fw = new FileWriter("b.txt");

4)、额外功能:

注意:目的中虽然是一个文件,但是需要指定编码表。

而直接操作文本文件的FileWriter本身内置的是本地默认码表。无法明确具体指定码表。

这时就需要转换功能。OutputStreamWriter,而这个转换流需要接受一个字节输出流,而且

对应的目的是一个文件。这时就使用字节输出流中的操作文件的流对象。FileOutputStream.

FileReader fr = new FileReader("a.txt");

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"),"UTF-8");

?

需要高效吗?

需要,使用Buffer

BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));

BufferedWriter bufw =

new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt"),"UTF-8"));

?

?

?

  • 相关文章
发表评论
用户名: 匿名