详述java中的字符流、字节流与缓冲流

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/YJT180/article/details/100011119

在java中,文件的输入和输出通过流(stream)来实现,而输入的英文为Input,输出的英文为Output,因此,java中传输文件的途径又叫做IO流。流按照处理数据的单位,可以分为字节字符流;按照流向分为输入流输出流注意:输入流和输出流都是站在程序的角度参照的)。

  • 字节流

字节流用于处理字节为单位二进制文件(如音乐、图片等)

  • 字节流的输入流

InputStream抽象类是所有输入字节流类的直接或间接父类,FileInputStream是其重要子类

FileInputStream常用构造方法:

FileInputStream(File file) 通过File对象创建FileInputStream对象

②FileInputStream(String name) :通过文件(非“目录”)路径创建FileInputStream对象

这两个方法与之前File类的构造方法大同小异。

FileInputStream常用方法:

int read()从输入流中读取单个字节的数据;如果已到达文件末尾,则返回 -1

int read(byte[] b)从输入流中将最多b.length个字节的数据读入一个byte数组中,以整数形式返回存入数组中的实际字节个数;如果已到达文件末尾,则返回 -1

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

  • 字节流的输出流

OutputStream抽象类是所有输出字节流类的直接或间接父类,FileOutputStream是其重要子类:

FileOutputStream常用构造方法:

FileOutputStream(File file) 通过File对象创建FileOutputStream对象。

FileOutputStream(String name) :通过文件(非“目录”)路径创建FileOutputStream对象。

FileOutputStream(File file, boolean append)通过File对象创建FileOutputStream对象;第二个参数如果为true ,则字节将被写入文件的末尾而不是开头。

FileOutputStream常用方法:

void write(int b)将指定的单个字节数据写入此文件输出流。

void write(byte[] b, int off, int len)byte数组中从off开始的len个字节写入此文件输出流。

void flush():刷新字节输出流并强制写出缓冲内所有字节数据。

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

概念与方法都先罗列在这里,为了方便理解如何使用,我们来写一段代码,将指定文件中的数据写入到另一个文件中:

首先我们有两个文件,分别为待读取文件和待输入文件

此时2号记事本为空。

执行程序: 

public class Test{
	
	public static void main(String[] args) {
		try {
			FileInputStream fileInputStream = new FileInputStream("C:\\Users\\www10\\Desktop\\1.txt");//创建字节输入流对象
			FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\www10\\Desktop\\2.txt");//创建字节输出流对象
			int data = 0;//创建属性并且初始化
			while((data= fileInputStream.read())!=-1){//输入流调用read方法读取指定文件中的数据
				fileOutputStream.write(data);//输出流调用write方法将读取到的data写入指定文件中                
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

在这里,因为文件中的数据可能不仅仅只是一个字节而已,所以我们创建了一个循环来实现将文件中的全部数据读取与输出\写入,而我们之前写到,read方法返回的就是所读取文件中的数据,但如果到了文件末尾,已经没有数据的话,就会返回-1,所以循环继续的条件为read返回值不为-1,一旦返回值为-1,说明到达文件末尾,数据全部读取完毕,不再继续。

效果:程序开始运行的时间

由大小可以判断文件数据已经完成了输入,但是我们可以看到,只有8mb的文件,却用了接近一分钟来传输,效率十分之低,

然而这并不是编译器和机器本身的问题,而是在我们让输入流读取数据时,一直是按单个字节来的,这就好比快递公司在收取货源时,一个一个搬过来,速度当然慢。因此我们可以换成“货车”来装数据,提高效率:

public class Test{
	
	public static void main(String[] args) {
		FileInputStream fileInputStream =null;   
		FileOutputStream fileOutputStream = null;
		try {
			fileInputStream = new FileInputStream("C:\\Users\\www10\\Desktop\\1.txt");
			fileOutputStream = new FileOutputStream("C:\\Users\\www10\\Desktop\\2.txt");

			byte [] car = new byte[1024];//创建容量为1024字节的数组来放置数据
			int length=0;//定义length变量,决定read,write方法读取\输出的数据长度
			while((length=fileInputStream.read(car))!=-1) {//一次读取一个数组的数据
				fileOutputStream.write(car,0,length);//一次写入一个数组的数据
			}
        	} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

现在我们换成一次运一车数据,再来看看效果:

开始时间

结束时间

仅仅只用了一秒就完成了,因此我们要想提高数据传输的效率,最好用数组来储存数据。

  • 字符流

Java虚拟机将字节转化为2个字节的Unicode字符就形成了字符流,字符流用于处理以Unicode字符为单位的文本文件(如记事本文件等)。

  • 字符流的输入流

Reader抽象类是所有输入字符流类的直接或间接父类, FileReader是其重要子类

FileReader常用构造方法:

FileReader(File file) 通过File对象创建FileReader对象

FileReader(String fileName) 通过文件(非“目录”)路径创建FileReader对象

FileReader常用方法:

int read()从输入流中读取单个字符的数据,如果已到达流的末尾,则返回 -1

int read(char[] cbuf):从输入流中将最多cbuf.length个字符的数据读入一个char数组中,以整数形式返回存入数组中的实际字节个数,如果已到达流的末尾,则返回 -1

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

  • 字符流的输出流

Writer抽象类是所有输出字符流类的直接或间接父类,FileWriter是其重要子类:

FileWriter常用构造方法:

FileWriter(File file) :通过File对象创建FileWriter对象。

FileWriter(String fileName) 通过文件(非“目录”)路径创建FileWriter对象。

FileWriter(File file, boolean append):通过File对象创建FileWriter对象;第二个参数如果为true ,则字节将被写入文件的末尾而不是开头。

FileWriter常用方法:

void write(int c)将指定的单个字符数据写入此文件输出流。

void write(char[] cbuf, int off, int len)char数组中从off开始的len个字符写入此文件输出流。

void flush():刷新字符输出流缓冲。

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

其实字符流和字节流的方法大同小异,只不过字符流传输的数据最小单位是字符,而不是字节

package venus;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;

public class IO {

	public static void main(String[] args) {
		// 缓冲字符流
		BufferedReader bufferedReader = null;
		BufferedWriter bufferedWriter = null;
		try {
			bufferedReader = new BufferedReader(new FileReader("D:\\1.txt"));
			bufferedWriter = new BufferedWriter(new FileWriter("D:\\2.txt"));
			char[] cbuf = new char[1024];//因为记事本为字符型文件,所以这里采用字符数组
                	int length = 0;
                        while ((length = bufferedReader.read(cbuf)) != -1) {
                        bufferedWriter.write(cbuf, 0, length);
			}
			bufferedWriter.flush();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (bufferedReader != null) {
				try {
					bufferedReader.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if (bufferedWriter != null) {
				try {
					bufferedWriter.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/YJT180/article/details/100011119