Skip to content

节点流和处理流

1554字约5分钟

javaio

2024-10-24

节点流和处理流

节点流

对应资源的流

文件资源(File)

内存资源(char、string、byte)

进程间的通讯

网络通讯

键盘输入

控制台输出

处理流

采用装饰器模式

1.缓冲流(Buffered-xxxx-In/OutputStream)

特点:带缓冲(读写效率高)它依托于字符输入输出流

1.创建流

它依托于字符输入输出流

Reader reader = new FileReader("./test/test4.txt"); BufferedReader bufferedReader = new BufferedReader(reader);

2.操作流

1.bufferedReader.readLine()读取一行

2.循环读取整个内容

3.bufferedReader.skip(2)跳过一行中的n个字符

	private static void test1() {
		try(
			Reader reader = new FileReader("./test/test4.txt");
			BufferedReader bufferedReader = new BufferedReader(reader);
			) {
			// 读取一行
//			System.out.println(bufferedReader.readLine());// 第一行
//			System.out.println(bufferedReader.readLine());// 第二行
//			System.out.println(bufferedReader.readLine());// 第三行......
			// 读取整个内容
//			String s = "";
//			while((s = bufferedReader.readLine()) != null) {
//				System.out.println(s);
//			}
			// 跳过一行中的n个字符
			bufferedReader.skip(2);
//			System.out.println(bufferedReader.read());
			System.out.println(bufferedReader.readLine());
//			bufferedReader.skip(3);
//			System.out.println(bufferedReader.readLine());
//			bufferedReader.skip(3);
//			System.out.println(bufferedReader.readLine());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}

2.转换流(一定是字符流)

它依托于字节输入输出流

作用:字节流转换为字符流

字节流一般不需要转字符流(除非需要显式控制输)

字符集:

ISO-8859-1:西欧文字

中文:GB2312、GBK(简体中文国标)、BIG5(繁体中文,台湾)

UTF-8(1-4字节变长字符集)兼容世界各国语言,支持中文

1.输入转换流(InputStreamRander)

1.创建流

InputStream inputStream = new FileInputStream("./test/test.txt"); InputStreamReader inputStreamReader = new InputStreamReader(inputStream);

2.操作流

1.inputStreamReader.read()读取一个字符

2.inputStreamReader.read(char[] chs)读取字符数组

3.System.in.read()从系统输入流读取

4.指定字符编码读取

构造方法第二个参数可以指定字符编码

inputStreamReader = new InputStreamReader(inputStream, "GBK");

	public static void test1() throws IOException {
		InputStream inputStream = new FileInputStream("./test/test.txt");
		InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
		
		//  	
//			System.out.println(inputStreamReader.read());
		// 读取字符数组
		char[] chs = new char[10];
//			inputStreamReader.read(chs);
//			System.out.println(Arrays.toString(chs));
		// 从系统输入流读取
//			System.out.println(System.in.read());
//			byte[] bytes = new byte[10];
//			System.in.read(bytes);
//			System.out.println(Arrays.toString(bytes));
//		inputStreamReader = new InputStreamReader(s
		// 指定字符编码读取
		inputStream = new FileInputStream("./test/test3.txt");
//		inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
		inputStreamReader = new InputStreamReader(inputStream, "GBK");
		inputStreamReader.read(chs);
		System.out.println(Arrays.toString(chs));
		inputStreamReader.close();
		inputStream.close();
	}

2.输出转换流(OutputStreamRander)

1.创建流

OutputStream outputStream = new FileOutputStream("./test/test5.txt"); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);

2.操作流

1.outputStreamWriter.write("你好")写出到文件

2.以指定编码写入

构造方法第二个参数可以指定字符编码

outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");

	private static void test1() throws IOException {
		OutputStream outputStream = new FileOutputStream("./test/test5.txt");
		OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
		// 写出到文件
//		outputStreamWriter.write("你好");
		// 以指定编码写入
		outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");
		outputStreamWriter.write("你好");
		outputStreamWriter.flush();
		outputStreamWriter.close();
		outputStream.close();
		System.out.println("ok");
	}

3.转换

使用输入转换流(InputStreamRander)以指定字符编码读入再使用输出转换流(OutputStreamRander)以指定字符编码写出即可完成文件的编码转换

3.打印流(PrintStream)

系统打印流

1.System.err

2.System.out

特点:

1.重写了大量的print()方法

2.自身处理异常,不影响显示

3.自动执行flush()方法

1.创建流

OutputStream outputStream = new FileOutputStream("./test/test6.txt"); PrintStream printStream = new PrintStream(outputStream);

2.操作流

1.printStream.println("你好时间")写入一行字符到文件

2.通过设置系统打印流实现系统函数写入文件内容

PrintStream syso = System.out;

System.setOut(printStream); System.out.println("哈哈哈哈哈"); System.setOut(syso); System.out.println("切回来");

	private static void test1() throws IOException {
		OutputStream outputStream = new FileOutputStream("./test/test6.txt");
		PrintStream printStream = new PrintStream(outputStream);
		// 写入一行字符到文件
		printStream.println("你好时间");
		// 存储系统打印流
		PrintStream syso = System.out;
		// 设置系统打印流
		System.setOut(printStream);
		System.out.println("哈哈哈哈哈");
		System.setOut(syso);
		System.out.println("切回来");
		outputStream.close();
		printStream.close();
		System.out.println("ok");
	}

4.数据流(DataInputStream)

好处:非常方便的读写各种数据类型

不需要按单个字节进行读写操作。可以按照数据类型读写

1.数据输出流(DataInput/OutputStream)

1.创建流

使用文件创建输出流OutputStream out = new FileOutputStream("./test/test7.txt"); 使用系统输出流创建输出流OutputStream out = System.out; 使用byte数组流创建输出流ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream(); DataOutputStream dataOutputStream = new DataOutputStream(out);

2.操作流

1.dataOutputStream.writeChars("DataOutputStraem测试")写入指定数据类型的数据

2.dataOutputStream.writeByte(byte[] b)写入byte数组

	private static void test1() throws IOException {
//		OutputStream out = new FileOutputStream("./test/test7.txt");
		OutputStream out = System.out;
		ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
		DataOutputStream dataOutputStream = new DataOutputStream(out);
		dataOutputStream = new DataOutputStream(arrayOutputStream);
		// 写入指定数据类型的数据
		dataOutputStream.writeChars("DataOutputStraem测试");
		// 写入byte数组
		String b = "1235698";
		dataOutputStream.writeBytes(b);
		byte[] r = arrayOutputStream.toByteArray();
		System.out.println(Arrays.toString(r));
		out.close();
		arrayOutputStream.close();
		System.out.println("ok");
	}

注:当使用系统输出流创建输出流时,进行的数据写入操作会直接显示在控制台

2.数据输入流(DataInputStream)

1.创建流

byte[] buf = {1,2,3}; ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(buf); DataInputStream dataInputStream = new DataInputStream(arrayInputStream);

2.操作流

1.dataInputStream.readByte()读取一个byte类型的数

2.dataInputStream.read(byte[] b)读取到byte数组

	private static void test1() throws IOException {
		byte[] buf = {1,2,3};
		ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(buf);
		DataInputStream dataInputStream = new DataInputStream(arrayInputStream);
		// 读取一个byte类型的数
//		System.out.println(dataInputStream.readByte());
//		System.out.println(dataInputStream.readByte());
//		System.out.println(dataInputStream.readByte());
		// 读取到byte数组
		byte[] r = new byte[20];
		dataInputStream.read(r);
		System.out.println(Arrays.toString(r));
	}

5.对象流(ObjectInput/OutputStream)

注意

需要序列化(串化)

序列化:把对象转换成数据流(一个个的字节)用来保存到磁盘或者网络上传输

反序列化:把字节流转换成内存中的对象

序列化接口:Serializable,标志性接口

表示该类的对象具有序列化和反序列化的能力不实现接口

在序列化过程中可能会产生java.io.NotSerializableException

只要实现了Serializable接口的类的对象都可以序列化

SerialVersionUID可防止读取不合适的数据

transient关键字

transient关键字修饰的变量(字段)在对象序列化时不进行序列化,可局部控制序列化的顺序

Externalizable接口

可指定某个字段序列化

	// 从文件读取对象
	private static void test1() throws IOException, ClassNotFoundException {
		InputStream inputStream = new FileInputStream("./test/studnet.dat");
		ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
//		// 读取文件中的student对象
//		Student student = (Student) objectInputStream.readObject();
//		System.out.println(student);
		Object students =  objectInputStream.readObject();
		System.out.println(students);
		objectInputStream.close();
		inputStream.close();
	}
	// 将对象写入文件
	private static void test2() throws IOException {
		OutputStream outputStream = new FileOutputStream("./test/studnet.dat");
		ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
		// 写入一个序列化的对象数据
		Student student = new Student(1001, "张三", 16);
//		objectOutputStream.writeObject(student);
		System.out.println("ok");
		// 写入一个list对象
		List<Student> students = new LinkedList<Student>();
		students.add(student);
		students.add(new Student(1002));
		students.add(new Student(1003));
		objectOutputStream.writeObject(students);
		objectOutputStream.close();
		outputStream.close();
		System.out.println("ok");
	}