IO流 总结

IO体系结构和基础应用

1、什么是流(Stream)?
 将输入和输出抽象为叫做流的概念。流是程序和外界进行数据交换的通道在OOP中的实现。
 简单来说,可以把流比作水管,从一个地方流出,在流入另一个地方。

2、流的分类:
 ①按方向分:
  I、输入流
  II、输出流
 ②按性质分:
  I、基础字节流:InputStream和OutputStream流
  II、过滤流:用来包装基础流以提供更好的特性,BufferedInputStream和BufferedOutputStream流
  III、基与具体数据类型的流:DataInputStream和DataOutputStream流
  IV、基与对象读写:ObjectInputStream和ObjectOutputStream流

3、使用FileInputStream读取数据,使用FileOutputStream写入数据
 代码如下:
 

/**
	 * 文件拷贝的方法(用File流)
	 * @param path 读取文件的路径
	 * @param path_2 写入文件的路径
	 */
	public void Filecopy_File(String path,String path_2){
		
		try {
			//实例化一个File输出流对象
			InputStream is = new FileInputStream(path);
			//实例化一个File输入流对象
			OutputStream os = new FileOutputStream(path_2);
			//获取文件的长度
			int length = is.available();
			//写入文件
			int v;
			for(int i = 0;i<length;i++){
				v = is.read();
				os.write(v);
			}
			//关闭流
			System.out.println("拷贝成功");
			is.close();
			os.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

 4、使用BufferedInputStream和BufferedOutputStream流读取写入数据
 代码如下:

/**
	 * 文件拷贝的方法(用Buffered流)
	 * @param path 读取文件的路径
	 * @param path_2 写入文件的路径
	 */
	public void Filecopy_Buffered(String path,String path_2){
		
		try {
			//实例化一个File输出流对象
			InputStream is = new FileInputStream(path);
			//实例化一个Buffered输出流对象
			BufferedInputStream bis = new BufferedInputStream(is);
			
			//实例化一个File输入流对象
			OutputStream os = new FileOutputStream(path_2);
			//实例化一个Buffered输入流对象
			BufferedOutputStream bos = new BufferedOutputStream(os);
			//获取文件的长度
			int length = is.available();
			//写入文件
			int v;
			for(int i = 0;i<length;i++){
				v = bis.read();
				bos.write(v);
			}
			System.out.println("拷贝成功");
			//关闭流
			bis.close();
			is.close();
			bos.close();
			os.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

 5、使用DataInputStream和DataOutputStream流读取写入数据

画板的保存:

     写入数据:

/**
	 * 保存的方法
	 * @param array  存储像素点的数组
	 * @param path	存储路径
	 * @return
	 */
	public boolean save(int[][] array,String path){
		boolean x = false;
		try {
			// 实例化File输出流的对象
			OutputStream os = new FileOutputStream(path);
			//实例化Buffered输出流对象
			BufferedOutputStream bos = new BufferedOutputStream(os);
			//实例化Data输出流对象
			DataOutputStream dos = new DataOutputStream(bos);

			dos.writeInt(array.length);// 写入图片的宽度,写入类型为整形
			dos.writeInt(array[0].length);// 写入图片的高度,写入类型为整形
			// 写文件内容
			for (int i = 0; i < array.length; i++) {
				for (int j = 0; j < array[i].length; j++) {
					//把像素点写入文件
					dos.writeInt(array[i][j]);
				}
			}
			//关掉输出流
			dos.close();
			bos.close();
			os.close();
			x = true;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

 读取数据

	/**
	 * 读取的方法
	 * @param array  存储像素点的数组
	 * @param path	存储路径
	 * @return
	 */
	public int[][] open(String path){
		try {
			// 实例化File输入流的对象
			InputStream os = new FileInputStream(path);
			//实例化Buffered输入流对象
			BufferedInputStream bos = new BufferedInputStream(os);
			//实例化Data输入流对象
			DataInputStream dos = new DataInputStream(bos);

			int wigth =dos.readInt();// 读取图片的宽度,写入类型为整形
			int length = dos.readInt();// 读取图片的高度,写入类型为整形
			
			int[][] array = new int[wigth][length];
			// 写文件内容
			for (int i = 0; i < wigth; i++) {
				for (int j = 0; j < length; j++) {
					//把像素点读取文件
					array[i][j] =dos.readInt();
				}
			}
			
			//关掉输出流
			dos.close();
			bos.close();
			os.close();
			return array;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		int[][] a = null;
		return a;
	}

 !File流和Buffered流的区别:File流是写入一个字节就读取一个字节,而Buffered流会申请一个缓冲区,当这个缓冲区被写满后才会被读取,这样就大大的加快了运行速度,这也是File流和 Buffered流最主要的区别。

!也许会有人说为什么有了Buffered流还要用File流?
 因为Buffered流是建立在File流的基础上的,如果没有File流就没有Buffered流,在使用Buffered流的时候必须实例化一个File流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值