高级API——【第二章】 输入输出流

2022-11-22 14:31:10 浏览数 (1)

1初识JavaIO

IO,即in和out,也就是输入和输出,指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接。

Java 中是通过流处理IO 的,那么什么是流?

流(Stream),是一个抽象的概念,是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道。 当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。

一般来说关于流的特性有下面几点:

先进先出:最先写入输出流的数据最先被输入流读取到。 顺序存取:可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile除外) 只读或只写:每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。

2.IO流分类

IO流主要的分类方式有以下3种:

  1. 按数据流的方向:输入流、输出流
  2. 按处理数据单位:字节流、字符流
  3. 按功能:节点流、处理流

1、输入流与输出流

输入与输出是相对于应用程序而言的,比如文件读写,读取文件是输入流,写文件是输出流,这点很容易搞反。

2、字节流与字符流

字节流和字符流的用法几乎完成全一样,区别在于字节流和字符流所操作的数据单元不同,字节流操作的单元是数据单元是8位的字节,字符流操作的是数据单元为8 8位的字符或者8 8 *的字符。

为什么要有字符流?

Java中字符是采用Unicode标准,Unicode 编码中,一个英文为一个字节,一个中文为两个字节。

而在UTF-8编码中,一个中文字符是3个字节。例如下面图中,“云深不知处”5个中文对应的是15个字节:-28-70-111-26-73-79-28-72-115-25-97-91-27-92-124

那么问题来了,如果使用字节流处理中文,如果一次读写一个字符对应的字节数就不会有问题,一旦将一个字符对应的字节分裂开来,就会出现乱码了。为了更方便地处理中文这些字符,Java就推出了字符流。

代码案例如下:

代码语言:javascript复制
public class Test {
	public static void main(String[] args) throws Exception {
		/*
		 * IO流:流数据的,传输数据
		 * 	按照方向分类:
		 * 		输入流:InputStream
		 * 				FileInputStream
		 * 		输出流:OutputStream
		 * 				FileOutputStream
		 * 
		 * 	按照类型分类:
		 * 		字节流:所有的流 都属于字节流
		 * 		字符流:字节流中包含字符流
		 * 
		 * 	按照功能分类:
		 * 		节点流:所有的流都又叫做节点流
		 * 		过滤流:给流增强功能的
		 * 
		 * 	使用流步骤:
		 * 		1、创建流
		 * 		2、[包装过滤流]
		 * 		3、操作流:读取/写出
		 * 		4、关闭流
		 * 	
		 * 	水流:
		 * 	电流:
		 * 	人流:
		 */
		
		//创建一个输入流
//		FileInputStream fis = new FileInputStream("d://T416/T416.txt");
//		File file = new File("d://T277/T277.txt");
//		FileInputStream fis = new FileInputStream(file);
//		
//		//读取数据,读取一个数据字节
//		int i = fis.read();
//		while(i!=-1) {
//			System.out.print((char)i);
//			i = fis.read();
//		}
//		//关闭流
//		fis.close();
		
		//输出流
//		String str = "mingtianyeshigehaorizi";
//		FileOutputStream fos = new FileOutputStream("d://T416/T416.txt");
//		byte[] b = str.getBytes();
//		fos.write(b);
//		fos.close();
//		System.out.println("写出完成");
		
//		System.out.println("============对象序列化===========");
//		Student stu = new Student(1, "哇噻", 18);
//		//创建输出流
//		FileOutputStream fos = new FileOutputStream("d://T416/T416.txt");
//		//包装过滤流
//		ObjectOutputStream oos = new ObjectOutputStream(fos);
//		oos.writeObject(stu);
//		//关闭流
//		oos.close();
//		fos.close();
//		System.out.println("备份完成");
//		
//		System.out.println("=============反对象序列化(读取对象的数据文件)==============");
//		FileInputStream fis = new FileInputStream("d://T416/T416.txt");
//		//包装过滤流
//		ObjectInputStream ois = new ObjectInputStream(fis);
//		//读取数据
//		Object obj = ois.readObject();
//		ois.close();
//		fis.close();
//		Student s = (Student)obj;
//		System.out.println("读取到:" s);
		
		System.out.println("================序列化对象(集合版)==================");
		ArrayList<Student> slist = new ArrayList<>();
		for(int i=1;i<=100;i  ) {
			slist.add(new Student(i, "张" i, i));
		}
		
		//创建输出流
		FileOutputStream fos = new FileOutputStream("d://T416/T416.txt");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(slist);
		oos.close();
		fos.close();
		System.out.println("备份完成");
		
		//创建输入流
		FileInputStream fis = new FileInputStream("d://T416/T416.txt");
		//包装过滤流
		ObjectInputStream abc = new ObjectInputStream(fis);
		//读取数据
		Object obj = abc.readObject();
		abc.close();
		fis.close();
		//强转数据类型
		ArrayList<Student> list = (ArrayList<Student>)obj;
		for (Student s : list) {
			//调用dao的添加方法
			System.out.println(s);
		}
		
		
	}

}

今天就分享到这里啦!

0 人点赞