04 2019 档案

摘要:前面介绍的文件I/O,不管是写入文本还是写入对象,文件中的数据基本是原来的模样,用记事本之类的文本编辑软件都能浏览个大概。这么存储数据,要说方便确实方便,只是不够经济划算,原因有二:其一,写入的数据可能存在大量重复的信息,但依原样写到文件的话,无疑保留了不少冗余数据,造成空间浪费;其二,写入的数据多 阅读全文
posted @ 2019-04-29 22:22 pinlantu 阅读(538) 评论(0) 推荐(0) 编辑
摘要:有些时候,开发者想把程序运行过程中的数据临时保存到文件,可是前面介绍的字符流和字节流,要么用来读写文本字符串,要么用来读写字节数组,并不能直接保存某个对象信息,因为对象里面包括成员属性和成员方法,单就属性而言,每个属性又有各自的数据类型及其具体数值,这些复杂的信息既不能通过字符串表达,也不能通过简单 阅读全文
posted @ 2019-04-27 11:47 pinlantu 阅读(561) 评论(0) 推荐(0) 编辑
摘要:文件输出流FileOutputStream跟FileWriter同样有个毛病,每次调用write方法都会直接写到磁盘,使得频繁的写操作性能极其低下。正如FileWriter搭上了缓存兄弟BufferedWriter那样,FileOutputStream也有自己的缓存兄弟BufferedOutputS 阅读全文
posted @ 2019-04-24 21:49 pinlantu 阅读(345) 评论(0) 推荐(0) 编辑
摘要:前面介绍了如何使用字符流读写文件,并指出字符流工具的处理局限,进而给出随机文件工具加以改进。随机文件工具除了支持访问文件内部的任意位置,更关键的一点是通过字节数组读写文件数据,采取字节方式比起字符方式有下列两个好处:1、文件长度以字节为单位计量,可以分配等长的字节数组,却无法分配合适长度的字符数组, 阅读全文
posted @ 2019-04-22 21:28 pinlantu 阅读(381) 评论(0) 推荐(0) 编辑
摘要:前面介绍了字符流读写文件的两种方式,包括文件字符流和缓存字符流,但是它们的写操作都存在一个问题:不管是write方法还是append方法,都只能从文件开头写入,而不能追加到文件末尾或者在文件中间某个位置写入。这个问题真不好办,它意味着每次写操作都会覆盖掉原来的文件内容,注意是直接覆盖而非局部修改,可 阅读全文
posted @ 2019-04-20 10:09 pinlantu 阅读(730) 评论(0) 推荐(0) 编辑
摘要:前面介绍了利用文件写入器和文件读取器来读写文件,因为FileWriter与FileReader读写的数据以字符为单位,所以这种读写文件的方式被称作“字符流I/O”,其中字母I代表输入Input,字母O代表输出Output。可是FileWriter的读操作并不高效,缘由在于FileWriter每次调用 阅读全文
posted @ 2019-04-17 21:58 pinlantu 阅读(2997) 评论(1) 推荐(0) 编辑
摘要:前面介绍了文件的信息获取、管理操作,以及目录下的文件遍历,那么文件内部数据又是怎样读写的呢?这正是本文所要阐述的内容。File工具固然强大,但它并不能直接读写文件,而要借助于其它工具方能开展读写操作。对于写操作来说,需要通过文件写入器FileWriter搭配File工具才行。创建写入器对象的过程很简 阅读全文
posted @ 2019-04-15 18:01 pinlantu 阅读(628) 评论(0) 推荐(0) 编辑
摘要:程序除了处理内存中的数据结构,还要操作磁盘上的各类文件,这里的磁盘是个统称,泛指可以持久保留数据的存储介质,包括但不限于:插在软驱中的软盘、固定在机箱中的硬盘、插在光驱中的光盘、插在USB接口上的U盘、笔记本电脑里的固态盘、手机中的闪存、相机里的SD卡等等。当然,操作系统层面已经统一了这些存储介质, 阅读全文
posted @ 2019-04-13 10:04 pinlantu 阅读(551) 评论(0) 推荐(0) 编辑
摘要:注解属于比较高级的Java开发技术,前面介绍的内置注解专用于编译器检查代码,另外一些注解则由各大框架定义与调用,像Web开发常见的Spring框架、Mybatis框架,Android开发常见的ButterKnife框架等等,都使用了大量的注解。为了更好地弄清注解的应用原理,接下来不妨尝试自定义注解, 阅读全文
posted @ 2019-04-10 23:08 pinlantu 阅读(1588) 评论(0) 推荐(0) 编辑
摘要:Java的注解非但是一种标记,还是一种特殊的类型,并且拥有专门的类型定义。前面介绍的五种内置注解,都可以找到对应的类型定义代码,例如查看注解@Override的源码,发现它的代码定义是下面这样的: 又如注解@FunctionalInterface,它的源码定义与之类似: 乍看过去,注解的定义竟与接口 阅读全文
posted @ 2019-04-08 21:23 pinlantu 阅读(339) 评论(0) 推荐(1) 编辑
摘要:之前介绍继承的时候,提到对于子类而言,父类的普通方法可以重写也可以不重写,但是父类的抽象方法是必须重写的,如果不重写,编译器就直接在子类名称那里显示红叉报错。例如,以前演示抽象类用法之时,曾经把Chicken鸡类的call方法改为抽象方法,方法声明代码如下所示: 倘若派生自鸡类的公鸡类没有重写cal 阅读全文
posted @ 2019-04-06 10:14 pinlantu 阅读(354) 评论(0) 推荐(0) 编辑
摘要:前面介绍了如何利用反射技术读写私有属性,不单是私有属性,就连私有方法也能通过反射技术来调用。为了演示反射的逆天功能,首先给Chicken鸡类增加下列几个私有方法,简单起见弄来了set***/get***这样的基本方法: 参照私有属性的反射操作过程,私有方法的反射调用可分解为如下三个步骤: 1、调用C 阅读全文
posted @ 2019-04-03 22:03 pinlantu 阅读(885) 评论(0) 推荐(2) 编辑
摘要:早在介绍多态的时候,曾经提到公鸡实例的性别属性可能被篡改为雌性,不过面向对象的三大特性包含了封装、继承和多态,只要把性别属性设置为private私有级别,也不提供setSex这样的性别修改方法,那么性别属性就被严严实实地封装了起来,不但外部无法修改性别属性,连公鸡类的子类都无法修改。如此一来,公鸡实 阅读全文
posted @ 2019-04-01 22:02 pinlantu 阅读(557) 评论(0) 推荐(0) 编辑