IO流

对流的理解:
流是输入设备与输出设备之间数据序列的传输,二进制数据。
分类:
按流向分:
输入流:程序可以从中读取数据的流。
输出流:程序能向其中写入的流在这里插入图片描述

  • 输入流,字节流:

InputStream:是所有输入流,字节流的超类;
流使用的基本思路:
1.构建路径
如果不存在则会出现异常

 String name = "d:" + File.separator + "b" + File.separator + "b.txt";

2.获取流对象
流会自动(内部创建File对象)
利用构造方法创建流对象,但是基础都是是File对象
new FileInputStream(String name);
InputStream in=new FileInputStream(name);
也可以是 new FileInputStream(File file);

   String name = "d:" + File.separator + "b" + File.separator + "b.txt";
	File file=new File(name);
	InputStream in1=new FileInputStream(file);

3.读写操作,读数据
方法:read() ;
read(byte[] b);
read()方法是一个字节一个字节的读,从输入流中读取一个数据,当下一个数据字节达到流的末尾时则会返回-1,因此可以利用它来作为while语句的条件,然后来读取整个文件

String name = "d:" + File.separator + "b" + File.separator + "b.txt";
	InputStream in = new FileInputStream(name);
	int b;
	while ((b = in.read()) != -1) {
		System.out.println((char) b);
	}
	in.close();

而read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中直至文件末尾.当读到文件末尾,文件中没有完全数据字节时,该方法会返回-1.。如果没完,则不是-1.会返回读取的有效数字,数据存放在缓冲数组bytep[] b 中,然后再去操作这个数组。当然byte数组的长度可以随便定,但是read(byte[] b)方法会一次读b.length个,如果数组长度小于文件个数则会分批次读取,当数组满了,还没有读取完文件,read会将剩下的字节覆盖存在缓冲区。所以在对数组(缓冲区)的数组来操作时注意抽取新更新的那一部分。
在这里插入图片描述

	String name = "d:" + File.separator + "b" + File.separator + "b.txt";
		InputStream in = new FileInputStream(name);
		byte[] b = new byte[5];

		int num;
		while ((num = in.read(b)) != -1) {// 每读取读取一次数据,数据读到Byte数组中
			// num判断是否读取完毕条件以及每次读取字节数
			System.out.println("每次读取字节:" + num);
			String str = new String(b, 0, num);
			//利用String 中构造方法,在对数组(缓冲区)的数组来操作时注意抽取新更新的那一部分。
			System.out.println("读取数据:" + str);
		}
		// 关闭资源
		in.close();
		System.out.println("操作完毕");

在这里插入图片描述两个方法后者效率高因为利用了缓冲方法

4.关闭资源
关闭资源是为了释放内存是必然步骤
in.close();

  • 输出流 字节流
    输出流对应的是写操作,从程序中向目标文件写入数据
    基本思路与输入流一致:

    // 1.构建路径
     String name = "d:" + File.separator + "a" + File.separator + "b.txt";
     // 2.获取流对象
     OutputStream out = new FileOutputStream(name, true);// 默认指向文件头部,出现清除效果
     // 3.读写操作,读数据
     String str = "hello大家world";
     // out.write(256);// int 但是 单位 是 字节
     out.write(str.getBytes());
     // 4.关闭资源
     // out.close();
    

注意OutputStream是所有输出字节流的超类,有bug,只要每new一次他就会从文件头部开始写,因此为了避免清除效果,可以使用两个参数的构造方法 OutputStream out = new FileOutputStream(name, true),另外write(int),参数类型为int,但每次写入数据时为一个字节。因此int数据不能超出字节范围,否则会失真。

利用输入输出流可以对文件进行拷贝:

// 文件拷贝
	// 构建路径
	String src = "d:" + File.separator + "a" + File.separator + "a.txt";
	String dest = "d:" + File.separator + "b" + File.separator + "b.txt";
		InputStream in = null;
		OutputStream out = null;
		try {
			// 获取流对象
			in = new FileInputStream(src);
			out = new FileOutputStream(dest, true);
			// 读写操作
			byte[] b = new byte[7];
			int num;
			while ((num = in.read(b)) != -1) {
				out.write(b, 0, num);
			}

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();

		} finally {
			try {
				out.close();
				in.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				throw new RuntimeException(e);
			}

		}

异常最好利用Trycatch语句来执行,当然要合理利用Throwl来终止程序,其次遵循关闭原则,先开的后关

按数据传输单位分:
字节流:以字节为单位传输数据的流
字符流:以字符为单位传输数据的流

按功能来分
节点流: 用于直接操作目标设备的流
处理流: 是对一个已存在的流的链接和封装,通过对数据 进行处理为程序提供功能强大、灵活的读写功能。
**.**怎样区分节点流和处理流,处理流是以字节流为基础的。
在这里插入图片描述
BufferedInputStream bufferedIn = new BufferedInputStream(in);其实与节点流的区别不大但是因为他是基于数组缓存。所以效率高
BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。

public static void main(String[] args) throws IOException {
		test1();
		System.out.println("操作完毕");
	}

public static void test1() throws IOException {
	String src = "d:" + File.separator + "a" + File.separator + "b.txt";
	String dest = "d:" + File.separator + "a" + File.separator + "c.txt";

	// 节点(低级流)
	InputStream in = new FileInputStream(src);
	// 装饰者模式
	// 处理(高级流,缓冲流)
	BufferedInputStream bufferedIn = new BufferedInputStream(in);
	// 取数据,从数组中获取,和从磁盘中获取?
	// 取数据,从内存中,从硬盘中?
	// int num = bufferedIn.read();
	// System.out.println((char) num);

	OutputStream out = new FileOutputStream(dest);
	BufferedOutputStream bufferedOut = new BufferedOutputStream(out);
	byte[] b = new byte[1024];
	int num;
	while ((num = bufferedIn.read(b)) != -1) {
		bufferedOut.write(b, 0, num);
		// bufferedOut.flush();
	}

	bufferedOut.close();// flush
	bufferedIn.close();// close

}

关闭资源时注意只关处理流不关节点流
因为在处理流的close()里就包含了对节点流的关闭操作
在这里插入图片描述
未完待续。。。
处理流与节点流的区别?
处理流和节点流区别,以及如何区分?字节流和字节流区别?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值