字节流字符流傻傻分不清
对于字节流跟字符流,及其他们的子类总是感觉模糊不清,于是找视频又大致看了一遍,(我的区分方法是:后缀带有reader和writer的便是字符流,没有的便是字节流)于是有了下面的一些总结。
字节流:分为字节输入流(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/PrintWriter,SequenceInputStream,ObjectInputStream / ObjectOutputStream,RandomAccessFile,PipedOutputStream/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"));
相关推荐
Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。 Java 内用 Unicode 编码存储字符,字符流...
在Java编程语言中,输入/输出(I/O)操作是处理数据流的关键部分,而字符流与字节流则是实现这些操作的两种基本方式。理解它们的区别和应用场景对于任何Java开发者来说都是至关重要的。 ### 字节流 字节流是最基本...
在Java编程语言中,字节流(Byte Stream)和字符流(Character Stream)是处理输入输出数据的两种基本方式。它们构成了Java I/O系统的核心,用于读写文件、网络通信等场景。字节流和字符流的区别在于处理数据的基本...
除此之外,InputStreamReader和OutputStreamWriter是字节流与字符流之间的桥梁,它们允许我们在字节流和字符流之间转换,以适应不同编码格式的需求。 在Java IO中,还有一套转换流(Wrapper Stream),即...
Java IO系统分为两大类:字节流和字符流。字节流主要用于处理任何类型的原始数据,如图片、音频文件或者二进制文件,而字符流则专注于处理基于文本的数据。本文将深入探讨这两类流的原理、用途以及它们之间的关联。 ...
### Java字符流和字节流详解 #### 一、引言 在Java中,I/O流主要用于处理输入输出操作,包括文件读写等。根据处理数据类型的不同,Java I/O流主要分为字节流和字符流两大类。字节流处理的是8位的字节数据,而字符流...
总的来说,IO流是Java编程中不可或缺的一部分,理解和熟练运用字节流、字符流和文本流能帮助我们高效地处理数据输入和输出,为各种复杂的应用场景提供支持。在实际开发中,要根据数据类型和需求选择合适的流,并利用...
Java中的字节流和字符流是IO操作中的两种基本类型,它们主要用于数据的输入和输出。字节流处理的数据单位是字节,而字符流处理的是Unicode字符。 字节流: 字节流主要由两个核心类构成:`InputStream`和`...
在Java编程语言中,`字节流`和`字符流`是进行输入/输出操作的基础,主要用于处理数据的传输。这两个概念是Java IO系统的核心,它们允许程序与外部设备(如硬盘、网络、内存等)交换信息。在这个压缩包中,你将找到...
### Java IO字符流和字节流详解 #### 一、引言 在Java编程中,输入输出(简称IO)操作是十分重要的一个方面。通过IO操作,我们可以读取文件、网络数据、用户输入等,也可以将数据写入到文件、网络、控制台等。Java...
转换流:在字节流和字符流之间,Java提供了解决两者不兼容问题的转换流,即InputStreamReader和OutputStreamWriter。InputStreamReader是字节输入流到字符输入流的桥梁,而OutputStreamWriter则是字节输出流到字符...
Java 字节流与字符流的介绍 Java 中的流操作可以分为两种:字节流和字符流。字节流是指以 byte 为单位进行读写操作的流,而字符流是指以 char 为单位进行读写操作的流。 字节流的介绍 字节流的所有读操作都继承自...
在Java中,IO流分为两大类:字节流和字符流,每种流又有输入流和输出流之分,分别用于数据的读取和写入。 1. **字节流**: - 字节流处理的是8位的字节数据,是最基本的流类型。Java中的`InputStream`和`...
在学习Java基础时,掌握字节流和字符流是必不可少的。字节流主要包括OutputStream和InputStream两个基类,它们分别是所有字节输出流和输入流的超类。字符流则包括Writer和Reader两个基类,用于实现字符数据的读写。 ...
本文件包“io流详解,字符流和字节流代码”显然是针对Java IO流的深入学习资源,包含了代码示例和可能的可视化解释。 IO流分为两大类:字节流(Byte Stream)和字符流(Character Stream)。字节流处理的是8位的数据...
在Java中,流分为字节流和字符流两大类,它们都是抽象的概念,用于表示数据流动的方向。字节流处理的数据单位是字节,而字符流处理的是Unicode编码的字符。 一、字节流 字节流分为输入流和输出流,Java中最基础的...
本教程将详细介绍Java IO中的字节流、字符流、缓冲流以及转换流,并通过IODemo实例来展示它们的用法。 ### 1. 字节流 字节流是Java中最基础的流类型,用于处理以字节为单位的数据。字节流分为输入流(InputStream...
在处理文本数据时,如果使用字节流,需要考虑到字符编码问题,因为字节流不关心字符编码,而字符流默认使用平台的默认字符集。 实验中,练习六要求使用字节流复制文件,这通常涉及到读取源文件的字节数据,然后将其...
在Java编程语言中,字节流(Byte Stream)和字符流(Character Stream)是处理输入输出数据的两种基本方式。字节流主要用于处理任何类型的二进制数据,如图片、音频、视频等,而字符流则专为处理基于Unicode编码的...
Java文件流知识点梳理总结,IO文件流,包含了File类、缓冲流、字节流、字符流、转换流等