Java IO:简述字节流、字符流、缓冲流

Java的字节输入输出与字符的其实大同小异,区别主要在于一个是字节是字符,但是类比较多,本文主要就是整理一下我在学习过程中遇到的类。

字节流

字节输入流

在这里插入图片描述
各种字节输入流的含义如下
在这里插入图片描述
它们的常用方法有:
在这里插入图片描述
在这些输入流类中,比较常见的要属文件输入流FIleInputStream了
在这里插入图片描述
常用read(byte[])来以一个字节数组为单位的读取数据。下面用代码举例说明:

第一种写法(比较常用的):

static void input() throws IOException {
		//创建文件对象
		File f=new File("D:\\pra\\1.txt");
		//创建字节输入流对象
		FileInputStream in=new FileInputStream(f);
		String str1="";
		byte [] b=new byte[1024];//字节数组用于接收读入到的数据
		int temp;
			while((temp=buf.read(b))!=-1) {
				String str =new String(b,0,temp);//将读进字节数组的数据从0开始temp个字节转换为字符串str
				str1+=str;//每读一次就追加到str1上
			}
		System.out.println(str1);
		in.close();//关闭流
	}

第二种写法:

static void input() throws IOException {
		//创建文件对象
		File f=new File("D:\\pra\\1.txt");
		//创建字节输入流对象
		FileInputStream in=new FileInputStream(f);
		int temp;
			while((temp=in.read())!=-1) {
			    System.out.print(char(temp));//逐字节的转换
			}
		System.out.println(str1);
	}

字节缓冲输入流

在这里插入图片描述

static void input() throws IOException {
		//创建文件对象
		File f=new File("D:\\pra\\1.txt");
		//创建字节输入流对象
		FileInputStream in=new FileInputStream(f);
		//创建字节输入缓冲流对象
		BufferedInputStream buf=new BufferedInputStream(in);
		String str1="";
		byte [] b=new byte[1024];//字节数组用于接收读入到的数据
		int temp;
			while((temp=buf.read(b))!=-1) {
				String str =new String(b,0,temp);//将读进字节数组的数据从0开始temp个字节转换为字符串str
				str1+=str;//每读一次就追加到str1上
			}
		System.out.println(str1);
		buf.close();//关闭流时从内向外
		in.close();
	}

字节输出流

在这里插入图片描述
各种输出流类:
在这里插入图片描述
字节输出流的常用方法
在这里插入图片描述
其中常用的FileOutputStream
在这里插入图片描述

代码示例:
第一种:

	static void out() throws IOException{
		File f=new File("D:\\pra\\1.txt");
		FileOutputStream out=new FileOutputStream(f,true);//设置true表示追加
		out.write("\n字节缓冲输出流".getBytes());
		out.flush();
		out.close();
	}

第二种:

	static void out() throws IOException{
		File f=new File("D:\\pra\\1.txt");
		FileOutputStream out=new FileOutputStream(f,true);
		Byte[] b={1,2,3}
		for(Byte i:b)
		   out.write(i);//逐字节写入
		out.flush();
		out.close();
	}

字节缓冲输出流

在这里插入图片描述
代码示例:

	static void out() throws IOException{
		File f=new File("D:\\pra\\1.txt");
		FileOutputStream out=new FileOutputStream(f,true);
		BufferedOutputStream buf=new BufferedOutputStream(out);
		buf.write("\n字节缓冲输出流".getBytes());
		out.flush();
		buf.flush();
		buf.close();
		out.close();
	}

字符流

  • 字符流是针对字符型数据的特点而设计,提供一些面向字符的有用特性。主要的操作类是Writer和Reader。
  • Reader和Writer类:是所有字符流的超类,是直接继承Object类的抽象类,可读写16位的字符流。
  • 在错误的情况下抛出IOException异常。

有了字节输入输出流的基础,字符流也就不难了,写法上与字节流大同小异

字符输入流

在这里插入图片描述
代码示例:

static void cRead() throws IOException {
		File f=new File("D:\\pra\\1.txt");
		FileReader rea=new FileReader(f);
		char[] ch=new char[1024];
		int temp;
		String str1="";
		while((temp=rea.read(ch))!=-1) {
			String str=new String(ch,0,temp);
			str1+=str;
		}
		System.out.println(str1);
		
	}

字符缓冲输入流

static void cbRead() throws IOException {
		File f=new File("D:\\pra\\1.txt");
		FileReader rea=new FileReader(f);
		BufferedReader buf=new BufferedReader(rea);
		char c[]=new char[1024];
		int sum;
		String str1="";
		while((sum=buf.read(c))!=-1) {
			String str=new String(c,0,sum);
			str1+=str;
		}
		System.out.println(str1);
		buf.close();
	}

字符输出流

在这里插入图片描述
代码示例:

	static void cWrite() throws IOException {
		File f=new File("D:\\pra\\1.txt");
		FileWriter wri=new FileWriter(f,true);
		wri.write("\n字符输出流");
		wri.flush();
		wri.close();
	}

字符缓冲输出流

	static void cbWrite() throws IOException {
		File f=new File("D:\\pra\\1.txt");		
		FileWriter wri=new FileWriter(f,true);
		BufferedWriter buf=new BufferedWriter(wri);
		buf.write("\n字符缓冲输出流");
		buf.flush();
		buf.close();
	}

补充

缓冲流:

所谓的缓冲流,就是为某个固定的流配备一个缓冲区(就是一块内存区域),提高读写操作的效率。缓冲区要结合流才能使用,在流的基础上对流的功能进行了增强。

缓冲区:

缓冲区就是一段特殊的内存区域。
某些情况下,如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。

针对文件的操作提供的有字节缓冲流和字符缓冲流:

字节缓冲流

  • BufferedOutputStream
  • BufferedInputStream

字符缓冲流

  • BufferedWriter
  • BufferedReader

字节流与字符流区别
字节流与字符流的使用非常相似,两者除了操作代码上的不同之外,还存在一些差别:

  • 字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的。
    字符流主要用在处理文本文件数据,它是按照字符来处理的。
  • 字节流在操作时本身不会用到缓冲(内存),是对文件本身直接操作的。而字符流在操作时使用了缓冲区,通过缓冲区再操作文件的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Amonlisa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值