初步了解IO流

一、流:可以理解为数据的流动,数据流是一串连续不断的数据集合。
二、IO流:用于处理设备上的数据,在流中一般存放的是字节型的数据,IO流最终要以对象来体现,对象都是存在于IO包中。
Java中的IO流是实现输入、输出的基础,它可以方便地事项数据的输入、输出操作,在Java中把不同的输入、输出源(键盘、文件、网络连接等)抽象表述为‘流’(stream),通过流的方式允许java程序使用相同的方式来访问不同的输入输出源。stream是从起源(source)到接收(sink)的有序数据。Java把所有传统的流类型(类或抽象类)都放在java.io包中,用以实现输入输出功能。
三、操作流的步骤
1、使用File类找到一个文件对象,获取到IO操作的源或目标
2、通过字节流或字符流的子类创建对象(得到IO操作的通道)
3、进行读取或写入的操作(IO操作)
4、关闭输入、输出资源(由于流的操作属于资源操作,所以用完之后一定要关闭,释放资源)
四、流的分类
图示:
在这里插入图片描述
1、 输入流和输出流:按流的流向来分的,输入、输出都是从程序运行所在内存的角度来划分的
输入流:只能用来读取数据,不能向其写入数据。由InputStream和 Reader作为基类
字节输入流InputStream :

public class InputStreamDemo {
	public static void main(String[] args) {		
		try {
			//创建字节流 放入要读取的文件的目录
			InputStream in = new FileInputStream("E:/z/Array.java");
			//创建缓存数组
			byte[] bs=new byte[1026];
			//声明一个变量,用来存放实际读取的字节数
			int count=0;
			//读取数据
			while((count=in.read(bs, 0, bs.length))!=-1){//如果存在数据,就输出
				System.out.print(new String(bs, 0, count));
			}
			//用完要记得关闭流
			In.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	 }
}

字符输入流Reader:

public class ReaderDemo {
			public static void main(String[] args) {
			try {//创建字符流
				Reader reader=new FileReader("E:/z/Array.java");
				char[] cs=new char[200];
				int count=0;
				while((count=reader.read(cs, 0, cs.length))!=-1){
					System.out.print(new String(cs, 0, count));
				}
				//关闭流
				reader.close();
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}	
		  }
}

执行结果是一样的:
在这里插入图片描述
输出流:只能用来写入数据,不能从中读取数据。由OutputStream和 Writer作为基类
InputStream和Reader都是抽象类,本身不能创建实例,但它们分别有一个用于读取文件的输入流:FileInputStream和FileReader,它们都是节点流需要直接和指定文件关联
字节输出流:

public class OutputStreamDemo {
	public static void main(String[] args) {
			String str="OutputStream和Write是所有输出流的基类,它们的方法也是非常类似的,它们的方法是所有输出流都可使用的方法";
		try {
	 		//创建输出流
			OutputStream out=new FileOutputStream("E:/z/OutputStream.txt");
	 		//将str的byte数组数据写入到输出流
	 		out.write(str.getBytes());
	 		out.flush();
			out.close();//关闭输出流
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

执行结果:
在这里插入图片描述
字符输出流:

public class WriterDemo {
	public static void main(String[] args) {
		String str="OutputStream和Write是所有输出流的基类,它们的方法也是非常类似的,它们的方法是所有输出流都可使用的方法";
		try {
			//创建输出流
			Writer writer=new FileWriter("E:/z/WriterDemo.txt");
			//将str写入到writer
			Writer.writer(str);
			//相比OutputStream,Writer多了append方法
			Writer.append("\r\n");
			writer.append('A');
			writer.flush();
			writer.close();//关闭流
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

执行结果:
在这里插入图片描述
2、 字节流和字符流:由于处理的数据单元不同,可分为字节流和字符流
字节流:是处理字节数据的流对象,无论是图片还是文字,它们都是以二进制的形式来存储的。二进制是一个以8位字节为数据单元的,计算机中的最小数据单元就是字节,也就意味着字节流可以处理设备上的所有数据,因此字节流是可以处理字符类型的数据的。
字符流:java中的字符是Unicode编码,是双字节的,1个字符等于2个字节,字符流主要是用来处理char类型数据

字节流和字符流的区别
两者的用法几乎完全一样,区别在于它们所操作的数据单元不同,在进行字符流操作时会使用到缓冲区,而字节流操作是不会使用到缓冲区的。
在输出的时候,OutputStream 类即使最后没有关闭内容也可以输出。但是如果是Writer 的话,则如果不关闭,最后一条内容是无法输出的,因为所有的内容都是保存在了缓冲区之中,每当调用了close()方法就意味着清空缓冲区了。那么可以证明字符流确实使用了缓冲区。

3、 节点流和处理流:按照功能的不同,可分为节点流和处理流
节点流:理解为直接操作目标设备,可以从向一个特定的IO设备(如磁盘、网络)读/写数据的流,也被称为低级流。
处理流:通过操作节点流,从而间接完成输入或输出功能的流。处理流是的存在是建立在一个已经存在的输入流或输出流的基础之上的,用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能,也称为高级流。
处理流可以隐藏底层设备上节点流的差异,并对外提供更加方便地输入/输出方法,让程序员只需关心高级流的操作。使用处理流时的典型思路是使用处理流来包装节点流,程序通过处理流来执行输入输出功能,让节点流与底层的IO设备、文件交互。只要流的构造器参数不是一个物理节点,而是已经存在的流,那么这种流就一定是处理流;而所有节点流都是直接以物理IO节点作为构造器参数的。

public class PrintStreamDemo {
	public static void main(String[] args) throws IOException {
		Writer writer=new FileWriter("E:/z/PrintWriter.txt");
		PrintWriter printWriter=new PrintWriter(writer);
		String str="可以隐藏底层设备上节点流的差异,并对外提供更加方便地输入/输出方法,让程序员只需关心高级流的操作";
		String str1="使用处理流时的典型思路是,使用处理流来包装节点流,程序通过处理流来执行输入输出功能,让节点流与底层的IO设备、文件交互。";
		String str2="只要流的构造器参数不是一个物理节点,而是已经存在的流,那么这种流就一定是处理流;而所有节点流都是直接以物理IO节点作为构造器参数的。";
		printWriter.println(str);//println()自动换行
		printWriter.println(str1);
		printWriter.println(str2);
		//关闭处理流
		printWriter.flush();
		printWriter.close();
	}
}

执行结果:
在这里插入图片描述
使用处理流的优势
对开发人员来说,使用处理流进行输入/输出操作更简单
使用处理流的执行效率更高

注意:在使用处理流包装了底层节点流之后,关闭输入/输出流资源时,只要关闭最上层的处理流就可以了,系统会自动关闭被该处理流包装的节点流。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值