Java-----IO流(BIO)

一、IO的定义

                         我们经常会操作磁盘上的资源,这个过程中实现了数据的输入和输出操作,磁盘上的文件和内存进行交互,数据的

                          交互需要有一个媒介或者管道,我们把这个媒介或者管道就称之为IO流,或者输入、输出流。

                 输入:从外部设备到内存称为输入(读数据);

                 输出:从内存到外部设备称为输出(写数据);

二、流的作用和原理

                          流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称和抽象。即数据在两设备间的传输称为流,流

                          的本质是数据的传输。

三、IO流的种类

                 1、按流向分:输入流、输出流 (抽象类,不能实例化)

                       输入流:表示将数据读取到Java程序(内存)中使用的流    InputStream

                       输出流:表示从java程序(内存)向外传输使用的流            OutputStream

                       FileInputStream(字节输入流)  --------》read()读操作

//创建被操作文件:此文件必须存在,否则读取时,抛出文件找不到异常
		File file = new File("test\\hello.txt");
		//声明流,不初始化
		FileInputStream fis = null;
		try {
			//初始化流
			fis = new FileInputStream(file);
			//准备数组用来存储数据
			byte[] b = new byte[3];
			//先定义一个变量,初始值是-1
			int i = -1;
			//定义一个计数循环的变量
			int count = 0;
			//while循环读取
			while((i=fis.read(b))!=-1) {
				count++;
				for(int j=0; j<i; j++) {
					System.out.print((char)b[j]);
				}
			}
			System.out.println(count);//计数:计算循环读取的次数
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if(fis!=null) {
				try {
					fis.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}	

                       FileOutputStream(字节输出流)--------》write()写操作  写完之后需要flush() 刷新流

//向文件中写入数据
		//在工程中创建一个test文件夹
		//设计程序,向test\\hello.txt中写入hello world
		//第一步:创建被操作文件对象
		//当向一个文件中写入数据时,若文件不存在,程序会自动创建
		File file = new File("test\\hello.txt");
		FileOutputStream fos = null;
		try {
			//第二步:创建流对象
			fos = new FileOutputStream(file, true);
			//第三步:准备数据
			String str = "hello world";
			byte[] b = str.getBytes();
			System.out.println(b.length);
			//第四步:使用流写入
			fos.write(b);
		}catch(IOException e) {
			e.printStackTrace();
		} finally {
			if(fos!=null) {
				try {
					//第五步:刷新流,关闭流
					fos.flush();
					fos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

                 2、按照处理数据单位分:字节流、字符流

                         字节流:一次性传输一个字节数据,将数据以字节的形式传输。 (通常处理视频,音乐,图片等字节文件)

                         字符流:一次性传输一个字符(utf-8编码1、2或3个字节)数据,将数据以字符的形式传输。(处理含有中文的文件)

                                       Reader类   Writer类

                 3、按照功能分:节点流、处理流

                          节点流:可以从或向一个特定的地方(节点)读写字节数据。

                          处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。

                  字节流复制文件     (用数组传输字节一定得注意最后一此访问,填入字节数不一定正好填满数组)

// 1 使用字节流复制文件
	public static void copy1() throws Exception{
		//1创建字节文件输入输出流
		InputStream is=new FileInputStream("d:\\003.jpg");
		OutputStream os=new FileOutputStream("d:\\004.jpg");
		//2读、写
		byte[] buf=new byte[1024*4];
		int len=0;
		while((len=is.read(buf))!=-1){
			//buf缓冲区,0从第一个位置写,len写的长度
			os.write(buf,0,len);
		}
		//3关闭
		is.close();
		os.close();
		System.out.println("复制完成");
	}

                   字符流复制文件

//2使用字符流复制文件
	
	public static void copy2() throws Exception{
		//1创建字符输入输出流
		Reader reader=new FileReader("d:\\003.jpg");
		Writer writer=new FileWriter("d:\\005.jpg");
		//2读写
		char[] buf=new char[1024*4];
		int len=0;
		while((len=reader.read(buf))!=-1){
			writer.write(buf, 0, len);
		}
		//3关闭
		reader.close();
		writer.close();
		System.out.println("复制完成");
		
	}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值