现在的位置: 首页 > 综合 > 正文

感想随笔

2018年04月19日 ⁄ 综合 ⁄ 共 4809字 ⁄ 字号 评论关闭

计算机当中的流:

计算机中经常出现的一个词就是IO流,IO流为什么叫IO流呢,IO就是 input output 的简称,先说 IO,从计算机体系结构上来说,计算机的主板的许多芯片中有个特别的东西叫 IO 芯片(intel 的架构),或者计算机的 cpu 中集成有 IO 引脚(arm 架构、单片机之类)。这个东西主要作用就是计算机芯片和其他设备交换数据用的,特别指计算机内存和其他外围设备交换数据时使用的。再说流,stream 是 IO 设备读写的一种方法,对比内存中数据通常的读写方法,这种数据读写方法叫做流式读写,回想我们用c语言读写内存中的数据,我们都是一个单位一个单位读写的,这个单位是数据线的宽度决定的,比如
8 bits、32 bit、 64 bits。而流式方法,好比水流,我们每次读写的数据的大小是可以指定的,然后它会自动分多次持续完成数据交换,这里主要跟硬件的缓冲区和 DMA 有关系。IO 都有流的概念,流式读写的特征跟水流一样是自动的多次读一个资源的数据到内存,多次写内存的数据到资源,流解决了两个速度不同的存储设备之间传输数据的问题,速度慢的外设先把数据放到缓冲区,然后集中一小段时间占用总线把这些数据传给内存,其他时间内存和其他设备交换数据,或者内存先把数据传送给外设缓冲区,缓冲区再慢慢把数据写入设备对应位置。流式读写可以分为
节点流和处理流,字节流和字符流,输入流和输出流。

IO中的流就相当与我们日常生活中的管道,我们通过管道来把水引到用户,通过管道把石油输送到大罐.同样,我们利用流来从硬盘的文件中读数据到你的程序中,利用流来写数据到硬盘的文件,文件流 缓冲流 数据流 转换流 Print流 Object流正是为了实现这些功能的不同的类,他们具体包含了实现这些功能的方法,但如果每次都要从硬盘读取一个字节数据或写1个字节数据到硬盘,那就对硬盘损害太大了,比如电驴就损害硬盘.解决办法:在内存中建立一个缓冲区(buffer),读一次硬盘就把缓冲区装满,然后你就可以从缓冲区读取数据,写数据的时候,先在内存中把数据写到缓冲区,写满,然后把数据一次性地从缓冲区写到硬盘.这样对硬盘的访问次数大大减少了.缓存要交换的数据:就是读数据的时候把数据一次性读到缓冲区和写数据的时候先把数据写到缓冲区的意思,buffer是在内存中是通过字节数组实现的。

面向对象程序设计:

面向对象,大家都说,但是我觉得面向对象之所以最接近人类自然的思考方式,是因为面向对象真正的让计算机程序有了 “概念” 这种思想,概念才是人类思考的自然方式。面向对象不如叫面向概念更加合适。这也说明了面向对象里面 类名 对象名 函数名 变量名 这些标识符的重要作用。只有真正把这些命名取好,并且解释好,才能让使用的人真正的用得好。同样在学习面向对象的框架或者库的时候,把框架或者库里面的概念搞明白,才能真正用好这些框架或者库。也就是要把框架或者库的内容抽象为概念,这样才好理解和记忆,才能方便使用。概念才能体现逻辑。

Java IO 框架中的 Reader Writer:

和 InputStream OutputStream 相比较,Reader Wirter 之所以是字符流,是因为它们都是让读写的让人懂得字符。所以它们都加上了 er 后缀表人。这样 InputStream OutputStream 就只表示最基本含义的字节流,多么直接,InputStream 没有加上字节的含义是因为计算机读写最基本的单位就是字节,所以默认的东西没有表示出来,这表示多么直接和简洁啊。底层上来看,Reader Writer 因为加上了码表,所以可以对字节数据进行编码解码,得到人们可以读懂的字符。

Java 文件IO相关

FileWriter 中 构造函数 write flush close 函数,FileWriter 依赖于 OutputStream File 类,是 Writer 的子类。

异常处理——

回车符——\n 和 \r\n

续写——文件内部定为符相关内容

FileReader 提供了 read 文件中字符的功能,可以一个一个字符读read(),也可以读一块字符到字符数组中read(char [] charBuf),使用 read 读取文件的两种方法。

缓冲区技术 BufferedWriter BufferedReader,如果说IO有缓冲区技术,那么这个技术可以使用也可以不使用, FileWriter、FileReader 就是没有使用的情况,BufferedWriter、BufferedReader 就是使用了的情况。

什么情况下缓冲区技术不适合使用

缓冲区技术提高了流的操作效率,所以在创建缓冲区虽然是流的子类,但是缓冲区对象自身不创建流对象,所以在创建缓冲区对象之前,必须先提供给缓冲区构造函数流对象,缓冲区中提供了一个跨平台的换行符 newline(),和 readline()。readLine() 方法只返回回车符之前的类容,不带回车符,readLine 读到文件末尾返回 null。

查看源码可以发现 BufferedReader 中 readLine()  read() 方法都是使用的 BufferedReader 的 fill() 方法,而 fill() 方法则使用的是 Reader 的 read(char [] c, int offset, int len) 方法实现的。所以 BufferedReader、BufferedWriter  的优势主要就是有 readLine() 和 newLine() 方法。

装饰者模式使用的好处和弊端:当想要对已有的类进行功能增强的时候,可以再定义一个类,将已有类的对象传入,基于已有的功能,并提供加强功能,那么再定义的类就称为装饰者类。

MyReader

    |---MyTextReader

            |---MyBufferedTextReader

    |---MyMediaReader

    |---MyBufferedMediaReader

    |---MyDataReader

    |---MyBufferedDataReader

Reader

   |---FileReader

   |---。。。

   |---。。。

   |---BufferedReader

LineNumberReader 带行号的 BufferedReader 其中 getLineNumber() 可以获取从1开始的行号,setLineNumber() 可以设置行号,这是因为该类有个成员变量 lineNumber 来记录行号。

字节流,输入、输出是针对程序来说的。

FileOutputStream FileInputStream,字节流 FileOutputStream 也有 close、flush、write 函数。只是 write 之后不需要刷新,因为字节流的 write 函数没有使用缓冲区。

字节流 FileInputStream 还有一个 avilable() 函数,用来查看字节流关联的文件中,下一次调用 read 函数可以读取的总的字节数。

键盘读取

System.in 可以获取 InputStream,这个字节输入流是键盘的输入流。

转换流

字节流转字符流 

字符流转字节流

System.in System.out 都是字节流

流操作规律

3个明确:

1.明确源和目的

2.明确要操作的数据是否是纯文本

3.再明确要使用哪个具体的类是通过设备来区分,源设备:内存、硬盘、键盘;目的设备:内存、硬盘、屏幕

练习将一个图片文件中的数据存储到另一个文件中

转换流通常在字符编码转换的时候、字符字节流转换的时候要使用

File 文件对象

用来将文件和文件夹封装成对象,方便对文件与文件夹的属性信息进行操作。File 对象可以作为参数传递给流的构造函数。

构造函数 File(),可以将路径名抽象为 File 数据结构

文件相关的操作有

创建,将一个抽象路径名,创建一个为文件或者文件夹。createNewFile()、mkdir()、mkdirs()

删除

判断

获取文件属性

获取文件夹的文件列表

字符编码,主要是为了写入文件的数据能让人能看懂。所以对数据进行编码,当人使用查看文件内容的软件打开文件的时候,查软件再按照对应的编码查表把数据显示出来。

java UI

布局,容器对内部组件进行位置上的管理,叫做布局,布局都由布局器来负责,可以分为相对布局和绝对布局。

在学习类库的时候,1.首先是知道类库有什么用,怎么用。2.进一步是掌握类库中类在架构上的关系是最重要的,再一个就是查看类库的源码,知道类库实现的原理,掌握使用类库的细节。

多继承为什么如此重要,因为越是底层的事物,越是具有多个方面的特性,从不同的角度看事物,都可以有一个纵向的关系。多个纵向的关系的描述就需要多继承。在 java 里面我们怎么选择这些多种纵向关系中的一种来作为继承呢,因为我们在定义类的时候,一个最重要的原则就是单一职责原则,那么我们表达纵向关系的那个角度一定要选择类的单一职责所表示的角度,这样才能体现类的主要功能。和 c++ 相比,这或许就是 java 的优越性,java 把这种类的主要功能和扩展功能或者叫组件功能用 extends 和 implements
分开了。接口是对 组件功能的抽象,而父类是对主要功能的抽象。

学习框架的方法就是按图索骥,形成框架的结构图,需要什么功能的时候在这个图里面找,或者组合,或者继承,实现想要的功能。

Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”。在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。java 的动态性体现在在java的运行时的时候,可以知道任何一个类的具体构成,可以指定任何一个对象的详细信息,并调用它的任何一个方法使用任何一个属性。以前我们使用java的时候都是在编译阶段定义好类和对象的结构,比如类名、成员名、类的结构、成员函数的结构等等,并在编译阶段用确定的这些东西使用这些类和对象。反射和这个思想刚好不同。反射到底反在什么地方,我认为在使用反射之前我们写的程序,是我们已知某个类提供的接口了,然后我们创建这个类的对象,使用这个类的功能,在这个过程中,编译器和jvm在执行我们这个程序的时候,编译器只负责把我们使用类的符号原封不动的保存下来,jvm
在执行这里的时候,再实现符号引用的解析。使用反射却恰好相反,我们使用这个类,只知道类名,其具体的信息完全不知道,我们需要通过 jvm 加载这个类名之后,通过反射相关的 apis 来获取这个类相关的信息,再通过反射相关的 apis 来使用这个类提供的信息。这就是反射,反就反在我们使用类的信息是在编译器阶段还是在运行时阶段。
Class 就相当于把 JVM 解析类的相关的符号引用的功能暴露出来了,并且还是以面向对象的思想暴露的,Class 只是类及其元素相关的符号引用的暴露,Feild 、Method 都是 Class 成员的解析的暴露。Class 这一级别主要可以获取 Class 的成员和Class的签名的细节,比如 Class 的父类,Class 实现的接口,Class的访问修饰符 等等。

Class 对象是一种特殊的对象,不能用 new 创建,只能是 JVM 通过类加载器的 defineClass 方法创建,并且该对象也不保存在堆中,该对象的实际数据保存在方法区。

面向对象程序设计的时候为什么要使用 自顶向下 的思维方式,是因为等我们熟悉基本的语法和框架之后,我们在写代码的实现的时候经常也需要思考具体问题的最好的解决方法,这样就可能打算我们整体的思维,所以写的时候也需要先写最上层的,先写最外层的一层一层写往里写。这样就不会打断我们每一层的思维。但是在框架使用不熟练的时候我们还是需要先搞清楚框架怎么用。然后再设计具体的实现方法-算法

做项目的步骤:需求分析——需求建模——OO建模——自顶向下的方式实现

抱歉!评论已关闭.