Java的io流与Java中的“指针”

Java的io流

基本问答

问:Java的io流是干什么的?
答:是输入输出的基础·。可方便实现输入/输出操作。
问:什么是“流”?
答:Java中不同的输入/输出源,像键盘,文件,网络连接等,抽象表述为流。通过流的方式允许java程序使用相同的方式来访问不同的输入/输出源。
Java把所有传统的流类型(类或抽象类)都放在java.io包中,来实现输入输出功能。

流的分类

按流的流向分:

  1. 输入和输出流
    输入流:只能读取数据,不能写入数据
    输出流:只能向其写入数据,而不能从中读取数据

:此处的数据流向方向不是固定的。从内存的角度划分,数据从内存到硬盘,通常为输出流。 但数据从服务器到客户端,服务器的内存负责将数据输入到网络中,所以Server端的程序使用输出流,Client端的内存负责从网络中读取数据,为输入流。
在这里插入图片描述

Java的输入流:InputStream和Reader作为基类。
Java的输出流:主要由OuputStream和Writer作为基类
以上均为抽象基类,无法直接创建实例。

关于Stream:

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据,是一个来自数据源的元素队列并支持聚合操作
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
元素流在管道中经过中间操作的处理,最后由最终操作得到前面处理的结果。

  1. 字节流和字符流
    两者区别:所操作的数据单元不同。字节流操作的数据单元是8位的字节,字节流操作的数据单元为16位的字节

  2. 节点流和处理流
    按照流的角色来分
    定义
    节点流:(又称为低级流)。可以向或从某个特定的io设备(磁盘,网络等这个亚字的)写/读数据的流。
    处理流:(又称为高级流,包装流)。对于一个已经存在的流进行连接和封装,通过封装的流来实现数据的读/写。

另外:Java使用处理流包装节点是一种典型的装饰器设计模式,通过处理流,来包装不同的节点流。这样做的好处就是消除了不同节点流的实现差异,也可以很方便的完成输入/输出工作

关于装饰器设计模式:
允许像一个现有对象添加新的功能且同时其结构不变。作为现有类的一个包装。

流的概念模型

Java的io流涉及40多个类,都是从四个抽象基类(上面输入输出介绍的InuputStream,Reader,OutputStream,Writer)派生而来。字符流和字节流处理方式十分相似,一下流程图供参考:
在这里插入图片描述
对于输入流基类而言,输入设备就像是水管,水滴就是最小的输入输出单位。输入流用隐式的记录指针来表示从哪一出开始读取,当多一个字节或字符单位后,记录指针自动发生移动。
处理流的功能体现优点:
1.提高了性能:主要以增加缓冲的方式来提高输入输出效率。
2.操作便捷:处理流可以使用到任何已存在的流的基础上。是Java程序采用相同的代码,透明的方式来访问不同设备的输入/输出流。

输入/输出流简述

处理流的模型图如图所示
在这里插入图片描述
处理流既可以隐藏底层设备上节点流的差异,并对外提供更加方便地输入/输出方法,编程者只需关心高级流的操作。
使用的思路:
用处理流来包装节点流,程序通过处理流来执行输入/输出功能,让节点流与底层的I/O设备,文件交互。
识别处理流:
满足条件:流的构造器参数是一个已经存在的流,而不是一个物理节点。这种流一定是处理流,而所有节点流都是直接以物理IO节点为构造器参数的。

下面是一个例子:
使用PrintStream处理流来包装输出流OutputStream,是的输出是比原先更加的方便。

import java.io.FileOutputStream;
import java.io.IOException;

public class Stream{
	public static void main(String[] args)
	{
		try(
		FileOutputStream fos = new FileOutputStream("text.txt");   //先定义了一个节点输出流,然后程序使用了PrintStream包装了该节点输出流
		var ps = new PrintStream(fos));
		{
			ps.println("普通的字符串");      //输出字符串
			ps.println(new Stream());      //输出对象
		}
		catch (IOException ioe)
		{
			ioe.printStackTrace();
		}
	}

上面的代码参考课件,程序使用处理六非常的简单,在创建处理流时传入一个节点流作为构造器参数即可。这样创建的处理流就是包装了该节点流的处理流。

关于Java中的“指针”

大二开了数据结构课,就再次扎堆到C语言当中,对比自己私下慢吞吞学的Java,awsl我太难了
正文:
在c语言中,指针就是内存中的地址,该地址所存储变量的值是goon公有的(对于拥有该地址的对象而言)。都可以访问与修改该地址的内容。
在Java语言中,对象的使用就充当了指针的角色。将一个对象传给不同的变量

Student s1=new Student();
Student s2 =s1;
//此时s1和s2是指向同一个对象的

Java中创建一个对象是存放在堆中的,当我们用new创建一个对象的时候,其实是在堆中开辟了一块存储该对象的空间,返回的是存储该对象的位于堆中的地址。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值