IO-字节流

7 篇文章 0 订阅

IO流的简介

         I/O类库中使用“流”这个抽象概念。Java对设备中数据的操作时通过流的方式。

表示任何有能力产出数据的数据源对象,或者是有能力接收对象。“流”屏蔽了实际的I/O设备中处理数据的细节。IO流用来处理设置之间的数据传输。设备是指硬盘、内存、键盘录入、网络等。

流按操作数据类型的不同分为两种:字节流与字符流。

流按流向分为:输入流,输出流。

字节流

         字节流的抽象基类

                   输入流:InputStream

                   输出流:OutputStream

InputStream是抽象类,需要通过实现类FileInputStream来创建对象。

package Demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class Demo {

	public static void main(String[] args) throws IOException {
		showContent("c:"+File.separatorChar+"test.txt");
	}
	
	private static void showContent(String path) throws IOException
	{
		//打开流
		FileInputStream fis=new FileInputStream(path);
		int len;
		//循环读取
		while((len=fis.read())!=-1)
		{
			System.out.print((char)len);
		}
		//关闭流
		fis.close();
	}
}

上面的demo的读取效率是比较慢的,因为它是一个一个字节读的,读完一个字节写一个字节。那么我们可以使用缓冲,进行循环读取,来提高效率。

我们新建一个byte数组,将数据先缓冲到数组中,然后读取数组中的数据。

package demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class io {
	public static void main(String[] args) throws IOException {
		//读取指定路径的文件
		File file=new File("c:\\test.txt");
		//构建输入流
		FileInputStream input=new FileInputStream(file);
		
		//定义缓冲数组
		byte[] byt=new byte[1024];
		
		int len=0;
		
		//将文件内容写入数组中并循环读取文件中的内容
		while((len=input.read(byt))!=-1)
		{
			System.out.println(new String(byt,0,len));
		}
		//关闭输入流
		input.close();
	}
}


OutputStream

OutputStream是抽象了,需要通过实现类FileOutputStream来创建对象。

package demo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class io {
	public static void main(String[] args) throws IOException {
		//读取指定路径的文件
		File file=new File("c:\\test.txt");
		
		//构建输出流
		FileOutputStream fos=new FileOutputStream(file,true);
		
		fos.write('a');
		fos.write('b');
		fos.write(99);
		fos.close();
	}
}

上面的是一个简单的字节输出的demo。注意:文件输出流的文件,如果文件已经存在,则不再创建该文件,如果存在,则不再创建(多级目录创建不成功)。FileOutputStream的第二个参数,是来控制新输出的字节是进行覆盖还是在文件末尾进行输出。true表示在文件末尾输出。write(int b)方法中,虽然接收的是int类型参数,但是输出的仍然是一个字节。

 

上面的demo是通过一个一个的进行字符输出,这样做事很繁琐的,那么为了提高效率,我们可以使用缓冲。

 

我们可以将数据保存到数组中,然后通过操作数组来提高效率。API文档中有一个write(byte[] b)方法,将字节数组中的内容写入输出流中

package demo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class io {
	public static void main(String[] args) throws IOException {
		//读取指定路径的文件
		File file=new File("c:\\test.txt");
		
		//构建输出流
		FileOutputStream fos=new FileOutputStream(file,true);
		
		//将输出内容转成字节数组
		byte[] byt="abcdefg".getBytes();
		
		fos.write(byt);
		
		fos.close();
	}
}


字节缓冲流

         在上面的demo中,为了提高流的使用效率,自定了字节数组作为缓冲区,java专门提供了字节流缓冲来提高效率。BufferedInputStream和BufferedOutputStream。

BufferedInputStream和BufferedOutputStream类可以通过减少读写次数来提高输入和输出速度。它们内部有一个缓冲区,用来提高处理效率,起始内部也是封装了字节数组。

package demo;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class io {
	public static void main(String[] args) throws IOException {
		FileInputStream input=new FileInputStream("c:\\test.txt");
		FileOutputStream out=new FileOutputStream("c:\\test1.txt",true);
		
		BufferedInputStream inputstream=new BufferedInputStream(input);
		BufferedOutputStream outputstream=new BufferedOutputStream(out);
		int len=0;
		while((len=inputstream.read())!=-1)
		{
			outputstream.write(len);
		}
		inputstream.close();
		outputstream.close();
	}
}

评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值