admin管理员组

文章数量:1531792

2024年3月9日发(作者:)

毕业设计(论文)Android手机电子书阅读器的设计与实现

毕业设计(论文)Android手机电子书阅读器的设计与

实现

UNIVERSITY OF TECHNOLOGY

毕业设计

题 目 Android手机电子书阅读器的设计与实现 学生姓名

学 号 00101106

专业班级 通信工程

指导教师

学 院 通信学院

答辩日期 2012年10月11日

Android手机电子书阅读器的设计与实现

The design and Implementation of the Android mobile phone e-book

reader

Xxx

摘要

在这个信息化的时代计算机越来越精致手机也越来越智能化所以一个较好

的应用软件在很大程度上能提升一个手机的品牌而在智能手机上安装一个拥有

丰富功能支持的电子书阅读器更是我们刻不容缓的事情

本设计采用Android平台根据对手机电子书阅读器的客户需求分析和技术

可行性分析经过总体设计和详细设计编码测试等阶段完成了电子书阅读器软件

的设计不仅实现了电子书阅读器最基本的阅读功能而且还为用户提供了丰富的

功能支持包括找书书签自动翻页以及阅读界面设置的操作而本次设计最大的特

点则是通过屏幕触控实现了移动时的翻页特效经过不断的测试与完善电子书阅

读器功能稳定并且在真机上对其进行了测试与验证基本上达到了用户的需求标

关键词 Android电子书阅读器屏幕触控翻页

Abstract

In the time of information technology with the increasingly

sophisticated of computers and more and more intelligent of mobile

phones a better application software can enhance a brand of the phone to

large extent It is our urgent for us that installed on the smart-phone

has a rich functionality to support the e-book reader

Based on the needs analysis of customers and technical feasibility

analysis I use the Android platform to achieve the design of mobile

phones e-book reader After completing the overall design and detailed

design coding testing stage I achieved the design of the e-book reader

software

Not only can the soft achieve the basic function of E-book reader

but also offer many other functions for users including books and

bookmarks flipping pages automatically and designing the reader The

significant character of the design achieve the flipping page of mobile

by touching screen Through continuous testing and improvement E-book

reader is stable The testing and verification in real device has carried

out to meet the customers requirements which have reached the standards

of the customers requirements

Key words Android e-book Reader Touch Screen Flip

目 录

第1章 前言 1

11 课题提出的背景目的及意义 1

com 课题提出的背景 1

com 课题提出的目的 1

com 课题提出的意义 1

12 设计思路及研究方法 2

com 设计思路 2

com 研究方法 2

第2章 需求分析 3

21 软件的基本功能要求 3

22系统架构 4

23 开发环境 4

第3章 软件设计 6 31 总体软件结构设计 6 32 接口设计 7

com 外部接口 7

com 内部接口 8

33 数据库设计 8

com 数据模式设计 8 com 数据表格设计 8 com 表的具体设计 9 com 数据字典 10

34 软件设计模型 10 35 代码设计 12

36 软件维护设计 12 第4 章 系统功能模块的设计与实现 13

41 关键技术 13

com android平台及java语言 13

com 中介软件 13

com 四大组件 14

com sqlite3 数据库 14 com Tomcat服务器 14 42 欢迎界面的实现 15 43 主控制类的实现 15

44工具类的设计 16

45 阅读界面的实现 16

46 找书功能的实现 18

47 书签功能的实现 19

48 设置字体大小功能的实现 20 49 更换背景图片以及设置字体颜色功能的实现 21

410 音乐播放功能的实现 21 第5章 系统测试 22

51 欢迎界面 22

52 用户阅读界面 23

毕业设计总结 32

参考文献 33

附录一 核心代码 34

附录二 毕业设计外文翻译英文 36 附录三 毕业设计外文翻译中文 44 致谢

51

第1章 前言

11 课题提出的背景目的及意义

com 课题提出的背景

在这个信息化的时代 IT业已经成为世界发展的主流我们对信息技术的依赖远远超过了对我们自己的依赖计算机和手机已经成为我们日常生活中不可缺少的获得信息的渠道正因为如此各种各样的软件层出不穷我们的生活也因为各种各样的软件

变的更有滋有味不缺乏娱乐性也不缺乏教育意义让我们从这些软件中受益匪浅使我们看到了相比以前的巨大进步同时随着科技的发展计算机越来越精致手机也越来越智能化所以我们的依赖性也越来越大越来越离不开这些给我们提供日常信息的工具手机也已不再仅仅是简单的人与人通话的工具而是在很大程度上成为了我们获取信息的一个更好的渠道一个好的软件能够标志一个手机品牌的地位所以开发一款好的手机软件是相当必要的以前我们看看杂志小说都要去图书馆借阅而且时间有限很不方便而现在是在电脑上或者手机上看杂志看小说文档以此看来一个好的手机阅读器软件的开发是相当有必要的

com 课题提出的目的

此次设计的目的很明显就是给予阅读者更大的便利性阅读者不用再到处拿着一本厚厚的书籍大大减少了读者的负担只需要下载一本txt格式的电子书放在sd卡里边就是人们的生活百科当然有些下载不来的资料还是需要翻阅书籍的

com 课题提出的意义

计算机改变了人类的工作方式互联网创造着全新的生活空间我们接受信息的方式也正在发生深刻的质变由于现在阅读器的越来越普及我们每天清晨读报的习惯也在面对大资讯量的新闻网站时渐渐淡化面对印刷出版物我们仍视之为

文化传承的载体但不可抵挡的是无纸化电子阅读时代的悄然临近我们现在信息化的生活充斥着信息的传递但是越来越多的人依赖于几乎朝夕相伴的手机虽然现在也出现了供人们阅读使用的电子书但是这些电子书的功能很少很简单仅仅是简简单单的供人们一行一行的阅览文字信息或者是仅仅添加一个添加书签的小功能根本远远不能满足人们的需求于是一个功能良好的全面的电子书阅读器越来越成为广大用户的追求本软件是基于android系统智能手机开发的一款电子书阅读器软件它有一个阅读主界面主要用来阅读文档其优越性表现在实现了从SD卡读取文档或从服务器端下载文档自动翻页添加书签选择书签清空书签设置背景音乐设置背景图片设置

字体颜色设置字体大小等功能此外给用户更清晰方便的界面也是本软件的出发点之一

12 设计思路及研究方法

com 设计思路

阅读器的设计流程主要是按照软件设计的一般流程需求分析概要设计详细设计测试与维护的基本流程来设计开发的首先从整体分析软件功能将功能模块化然后对每个模块进行调试最后对各个模块进行系统集成

通过几个月的观察发现几乎所有的人都有手机而且几乎有一半以上的人用手机来阅读资料可是这些阅读软件不尽人意而且一个好的阅读软件也还没有安装在智能手机上本系统针对这一点进行了较仔细的分析在老版的阅读软件基础之上进行改进最后对系统进行了实现和维护

com 研究方法

本系统在整体框架研究方法采用的是问卷调查法和观察研究法而在总体设计上采用的是结构化方法在局部底层开发上为便于交流采用快速原型法

问卷调查法也称问卷法它是调查者运用统一设计的问卷向被选取的调查对象了解情况或征询意见的调查方法观察研究法指根据既定的研究目的对现象或行为做有计划与有系统的观察并依观察的记录对现象或行为做客观性的描述和解释

结构化系统的设计方法是在结构化程序设计思想基础上发展起来的它的基本涵义是一个系统由层次化的程序模块构成每一个模块只有一个入口和一个出口每一个模块只归其上一级模块调用并有模块连接的准则和构造模块的标准而且用系统结构图来表达系统的结构尽可能用最优的方式将系统内各部分组织起来

第2章 需求分析

21 软件的基本功能要求

经过以上问卷调查和观察研究方法在现行业务流程和数据分析的基础上基本上确定了系统的功能设计也基本上达到了目标根据软件设计的步骤需求分析是软件设计成功的基础也是必不可少的步骤同时也对软件的设计提出了具体的要求在做足了充分的调查研究之后基本可以确定软件的功能界面如下

1刚打开软件时的欢迎动画界面

2在没有阅读记录情况下打开软件时进入的软件说明界面

3在主界面下单击菜单按钮后弹出的欢迎主菜单界面

4找书选择界面用来选择找书的途径

5网络下载列表界面用来列出服务器端可供下载的文档

6下载完成提示界面用户从服务器端完成指定文档下载任务时显示的界面

7已存在要下载文件提示界面当用户指定要下载的文档在SD卡中已存在时

显示的界面

8SD卡文件列表界面列出SD卡中存在的所有资料

9阅读界面用来阅读文档的主界面是整个阅读器设计核心部分

10书签功能界面用来选择与书签相关的具体操作

11添加书签功能界面将当前阅读到的位置以书签名和书页号的形式存至书签表

方便下次阅读

12选择书签功能界面通过选择书签记录跳转至想要阅读的位置

13删除书签功能界面再不想要该条书签记录的情况下实现删除操作

14自动翻页功能界面实现不同时间间隔自动翻页的效果

15设置界面用来选择对阅读界面不同的设置

16背景音乐界面可在阅读的同时欣赏音乐更大限度的提升

17背景图片界面用来设置不同的阅读界面风格使阅读更为个性化

18字体颜色界面用来设置不同的阅读字体颜色提升用户的视觉体验

19字体大小界面通过设置字体大小来满足实际应用中的多重需求

基本说明如下

本系统是一个电子书阅读器主要包含一个主界面用来实现阅读的功能在阅读界面时点击menu手机底部会出现四个选项找书书签自动翻页设置点击找书选项会有两种操作可供选择分别是在SD卡中找书和通过网络下载点击书签选项会有三种操作可供选择分别为添加书签选择书签和清空书签其中长按选择书签列表中的某条书签记录也可达到删除该条记录的目的点击自动翻页选项会有四种操作可供选择分别为每隔30秒40秒50秒自动翻页和停止自动翻页点击设置选

项会有四种操作可供选择分别为设置背景音乐设置背景图片设置字体颜色和设置字体大小为此用户可通过自己的喜好来设置不同阅读界面的风格并且可以选择自己喜爱的音乐作为背景音乐在阅读的同时欣赏

22系统架构

本设计总体逻辑结构层次划分如图21所示

图21 功能结构图

23 开发环境

数据库

由于本设计和数据库密切相关但是对数据库的要求不高因此可用Android系统本身自带的Sqlite数据库

Android SDK与Eclipse开发的插件ADT

由于本设计是基于Android系统的而Android开发环境的搭建是基于Eclipse的因此需要下载Android SDK与Eclipse开发的插件ADT

服务器

由于本设计需要用服务器来为其提供下载服务而且对服务器的要求不高因此在设计时用Tomcat作服务器

软件设计

31 总体软件结构设计

打开电子书阅读器之后软件会先查看上次阅读的最后记录以此作为根据来进行判断从而跳转至相应的阅读界面然后用户就可在阅读界面下通过选择menu来执行想要的操作找书书签自动翻页设置点击找书选项会有两种操作可供选择分别是在SD卡中找书和通过网络下载点击书签选项会有三种操作可供选择

分别为添加书签选择书签和清空书签其中长按选择书签列表中的某条书签记录也可达到删除该条记录的目的点击自动翻页选项会有四种操作可供选择分别为每隔30秒40秒50秒自动翻页和停止自动翻页点击设置选项会有四种操作可供选择分别为设置背景音乐设置背景图片设置字体颜色和设置字体大小为此用户可通过自己的喜好来设置不同阅读界面的风格并且可以选择自己喜爱的音乐作为背景音乐在阅读的同时欣赏

根据各个模块的不同功能对本设计进行了层次结构的划分在Eclipse下创建了一个名为Test的工程工程的结构图如图31

图31 软件工程结构图

该功能包是通过Android SDK自动生成的主要包括以下内容

1src源代码目录该目录存放Android应用程序所有的源代码该目录项有不同的包包中对应开发的源代码开发过程中的主要精力都集中在开发src目录下内容

2gen文件夹目录该目录存放了Eclipse的ADT插件自动生成的Rjava文件实际上Rjava定义了一个R类它包含了应用中用户界面图像字符串等各种资源与之相对应的资源编号id这些资源编号都是系统自动生成的即有一资源对象系统就为此在R类中生成相应资源编号好比一本字典

3Res资源目录该目录定义了drawablelayout及values 3个目录

a drawable目录该目录下有drawable-hdpidrawable-ldpidrawable-mdpi3

个文件夹分别用来存放不同分辨率的图片资源用于不同分辨率 的手机的开发可以通过ResourcegetDrawable id 获得该资源

b layout目录该目录下包含了所有使用XML格式的界面描述文件主要用于

表述应用程序的用户界面布局也用于描述用户界面和接口组件

c values目录该目录包含了使用XML格式的参数描述文件也可以在此添加一些额外的资源如字符串颜色样式和数组等主要用于在代码中通过R类来调用它们而不直接使用这样可将代码和资源分开管理便于维护

除了以上文件夹外还用一个AndroidManifestxml文件该文件是系统的控制文件告诉系统如何处理创建的所有顶层项目尤其是Activity凡是需要用到的组件都要在此注册同时该文件也是所有Android应用程序都需要的文件其描述了程序包的全局变量包括公开的应用程序组件和每个组件的实现类什么样的数据可以操作在什么地方可以运行等

在这个文件中最重要的一个内容就是Intent过滤器这些过滤器描述了何时何种情况下让Activity启动当一个Activity或操作系统想要执行一个动作它将创建一个Intent对象该对象包含了很多描述符描述了想做的操作像处理数据数据的类型以及一些其他的信息Android将Intent对象中的所有公开的Intent过滤器比较找到一个最能恰当处理请求的数据和动作的Activity

32 接口设计

com 外部接口

在用户界面部分根据需求分析结果用户需要一个友善界面在界面设计上应做到简单明了易于操作并且要注意到界面的布局应突出的显示重要以及出错信息在界面设计部分本系统按照Microsoft公司的用户界面设计标准为用户提供友好方便直观简洁的操作环境

本系统采用了窗口继承的方式使窗口有统一的界面风格同时对错误信息提示信息进行标准化尽量做到清晰明了

com 内部接口

系统在功能模块的设计上以高内聚低耦合为设计目标内部接口方面各模块之间采用函数调用参数传递返回值的方式进行信息传递具体参数的结构将在下面数据结构设计的内容中说明接口传递的信息将是以数据结构封装的数据参数传递或返回值的形式在各模块间传递

33 数据库设计

com 数据模式设计

一共设计了3张表是

1阅读记录表阅读记录的ID书的路径阅读记录数据

2书签表书签的ID书签对应的阅读记录的ID书签名书页

3上次阅读记录表上次阅读记录的ID书的路径上次阅读到的书页上次阅读时的字体

数据库表的设计如下

图32 数据库结构图

com 数据表格设计

本数据库用的是一个小型数据库sqlite3在数据库中创建了三个表格即BookRecordBookMark和LastTimePage分别用来存放阅读记录的数据书签的数据和上次的阅读记录数据具体内容如表3-1表3-2和表3-3所示

表3-1 阅读记录表

字段名称 数据类型 字段大小 是否主键 说明 rid Integer

8 是 阅读记录的ID path 文本 50 否 书的路径 data

字节数组 不定 否 预读记录数据 表3-2 书签表

字段名称 数据类型 字段大小 是否主键 说明 mid Integer

8 是 书签的ID ridfk Integer 8 否 书签对应的阅读记录的ID bmname 文本

50 否 书签名 page Integer 8 否 书页

表3-3 上次阅读记录表

字段名称 数据类型 字段大小 是否主键 说明 lid Integer

8 是 上次阅读的记录ID path 文本 50 否 书的路径

page Integer 8 否 上次阅读到的页数 fontsize Integer

8 否 上次阅读的字体大小 com 表的具体设计

表名BookRecord

表中字段名称rid path data

说明用varchar类型存储pathblob类型存储相应的路径下的阅读过程并规定rid为阅读记录表的主键

表名BookMark

表中字段名称mid ridfk bmname page

说明创建书签mid为integer类型主键定义书签名字bmname为varchar类型书页号page为integer类型的书签表

表名LastTimePage

表中字段名称lid path page fontsize

说明创建书签lid为integer型主键定义路径path为varchar类型书页号page为integer类型字体大小为integer类型的上次阅读记录表

com 数据字典

数据字典是物理数据库的具体体现

表3-4 BookRecord数据字典

字段名 类型 阅读记录的ID 整型 书的路径 文本 阅读记录数据 字节数组 表3-5 BookMark数据字典

字段名 类型 书签的ID 整型 书签对应的阅读记录的ID 整型 书签名 文本

书页 整型 表3-6 LastTimePage数据字典

字段名 类型 上次阅读记录的ID 整型 书的路径 文本

上次阅读到的页数 整型 上次阅读时字体大小 整型 34 软件设计模型

建立系统数据模型的主要工具是实体关联图即E-R图

E-R图的图形符号约定如下表

表3-7 E-R图图形符号

图33 存储阅读记录的E-R图

图34 存储书签的E-R图

图 35 存储上次阅读记录的E-R图

35 代码设计

代码是按使用的目的表示识别分类排序数据的数字文字或符号识别是将文件中存储数据区别开或将文件中的数据按组区别开识别主要用数据更新与查找分类是根据数据编码中的定义对数据分类用于检索数据或统计分析排序是根据编码规则按代码中规定的次序排序用于输出与生成报表

36 软件维护设计

采用MVC设计模式将UI层和业务逻辑层分离开来采用针对接口编程的方式降低了代码之间的耦合度便于软件的升级和程序性能的优化

第4 章 系统功能模块的设计与实现

41 关键技术

com android平台及java语言

以下图表展示了Android操作系统的主要组成部分

图41 Android系统架构图

本系统是以java为编程语言从接口到功能灵活多变主要运用的是Activity之间的相互跳转然后利用Intent实现多个程序同时运行的效果运行中如果某个Activity的画面被另一个Activity所取代则这个Activity停止本系统通过把View类与XML可扩展标记语言将用户界面放置在视图窗口然后注册事件来完成相应的功能例如当视图要处理用户的点击事件的时候android就要向框架注册一个OnClickListener等本系统中触发事件都是通过这种来实现的 Java语言是一种简单易用面向对象的可移植的语言它具有很多的优越性和特点比如平台无关性安全性面向对象健壮性等等本系统就是在android平台上使用java语言完成的系统

com 中介软件

中介软件是android操作系统应用程序的桥梁主要分为函数和虚拟机Android的数据存储采用sqlite3数据库系统用户可以用ContentProvider类获取数据android中数据存储技术主要有文件存储

preferencesqliteContentProvider和网络存储在本软件中主要使用到了文件存储sqlite和ContentProvider文件存储是以流的形式读写文件可以以文格的格式也可以以二进制的形式在java语言中要使用流则写入文件的对象必须进行序列化sqlite是嵌入式移动设备中常用的轻量级数据库可看作计算机上使用的

sql serveroracle数据库本软件中用户生词本中的数据都存在sqlite数据库中而进行数据备份和恢复时则是用文件作为介质保存数据

com 四大组件

Android的四大组件是支持android应用程序显示跳转服务和事件的重要工具它们主要是Activity活动Intent意图Service服务ContentProvider内容提供器Activity是一个用户的界面基类属于UI一个Activity就是一个类每个Activity类都需要继承Activity基类并与其他控件结合使用Intent实现Activityservice

等之间的跳转和数据传输Service是后台服务为用户提供数据支持ContentProvider负责数据的存储和读取在android中软件UI通常使用xml技术设计而xml中控年的位置和状态则离不开布局的使用android中常用的布局有5种分别是

AbsoluteLayoutLinearLayoutRelativeLayoutFrameLayoutTableLayout由于布局的使用并且布局之间可以互相嵌套使得android软件UI的设计变得非常灵活即使是一些非常复杂的界面设计只要合理的使用布局也会使开发变得很容易

com sqlite3 数据库

Sqlite3是建立在android平台上的一个数据库除了支持varcharn可变字符

charn定长字符等数据特性外还支持空NULL整型INTEGER文本类型TEXT等数据类型它的特点入下轻量级只需带上很小的动态库就能享受它的全部功能独立性使用不需要安装在部署的时候能省去很多麻烦隔离性数据库中所有的信息都包含在一个文件内方便管理和维护和安全性可以同时读取数据但同时只有一个能够写入数据等特性

com Tomcat服务器

服务器的架设

在httptocom下载合适版本的Tomcat

在apache-tomcat-comwebapps目录下新建文件夹txt

在txt文件夹下创建文本文件txt_listtxt

在txt_listtxt下写入内容

根据txt_listtxt的内容创建文本

打开pache-tomcat-combin目录

打开pache-tomcat-combin目录下的startupbat

8打开浏览器在地址栏输入httplocalhost8088效果如图42所示

图42 bin目录图

42 欢迎界面的实现

本模块主要完成阅读器欢迎界面的渐变效果显示在进入程序界面时首先调用该功能的实现主要是通过绘制黑色矩形然后对其进行平面贴图并通过不断的更改图片的透明值来实现的

43 主控制类的实现

ReaderActivity类是主要控制程序运行的类实现了各个界面的有序切换各个按钮和对话框的监听事件加载了程序中用到的相关资源有效地控制了程序的运行

1onCreate方法是程序运行时进入主界面前调用的方法在此方法中对程序中用到的相关变量进行赋值并为相关类创建对象以方便调用

2onKeyDownf方法是重写父类的onKeyDown方法当按下不同的键时此方法设

计返回键4号键和Menu键82号键并且本设计中支持屏幕触控事件和键盘监听事件

3onCreateOptionsMenu方法表示的是程序运行时用户按下键盘上的Menu键后显示的找书书签自动翻页和设置的按钮选项当用户按下不同的键后弹出相应的对话框

4sendMessage方法表示各个界面相互跳转时调用的方法和不同线程之间传递消息的方法

5isWhichTime方法用以判断是否为第一次打开程序如果是则程序中的变量值为默认值若不是第一次打开则获取上一次打开时设置的值

saveCurrentData和savePreference方法表示当程序退出换书和第一次打开一本书时都要想数据库中BookRecord表中插入数据第一次打开一本书时向数据库中插入数据是因为如果表中不存在当前书的信息则无法存书签

44工具类的设计

1Constant类存放了整个设计过程中大部分类经常用到的常量值如字体大小

字体颜色屏幕的宽和高等将这些常量值放在一起不但方便了设计而且方便管理

2加载文本的工具类TextLoadUtil的设计主要是为文本的读入提供方法

45 阅读界面的实现

ReaderView类主要负责自适应屏绘制阅读器的主界面实现键盘和屏幕的触控事件以及实现翻页功能

1surfaceCreated方法主要负责成员变量的初始化工作

2onDraw方法负责标题广告条左右页面等图片的绘制其中广告条的绘制是动态的在广告条线程中值需要更改图片数据下标志值NUM

3onTouchEvent方法负责处理屏幕触控事件屏幕触控事件为移动是翻页特效的实现

4drawPage方法负责根据阅读记录对象ReadRecord绘制左右两页面

图43 从用户进入软件到阅读界面时的流程图

图44 用户在阅读界面时的操作流程图

当用户进行阅读界面的时候首先阅读控制模块会根据用户之前阅读到的位置来确定载入电子书文本的起始位置然后会根据手机终端屏幕大小和字体大小来确定该页应该显示多少文字在获取文字长度之后会读取相应长度的字符并以此为基础生成左右相邻两页内容的bitmap图片用户在阅读的时候可以触摸屏幕的不同位置进行不同操作左下角是往前翻页右下角是往后翻页

46 找书功能的实现

找书功能分为在SDCARD中和在网络中找书

1在SDCARD中找书

用户可以将已有的txt格式的书放在SDCARD中通过本阅读器的在SDCARD中找书的功能将书加载进阅读器进行阅读具体步骤如下按下Menu键在主界面中弹出的

选项中选择找书弹出找书对话框选中SDCARD即可根据当前路径获得对应文件数组并将数组中的所有文件加入到文件列表中然后再为文件列表添加监听从而实现在点击某一文件时跳转至对应页面的功能

2在网络中找书

本阅读器不仅提供了在本地找书的功能而且也支持在网络中找书具体步骤

如下

当单击在网络中找书的按钮时调用downTxt方法下载txt文档

图45 用户找书时的操作流程图

47 书签功能的实现

添加书签功能的实现

在本设计的书签功能中有很多漂亮的Dialog这些Dialog是通过xml文件自己布局的或者是通过Java代码自定义实现的其中stylesxml文件设置了Dialog的背景图片和标题格式是设置对话框属性的文件在完成了输入书签对话框所需要继承的类布局文件和对话框属性的文件之后创建了书签输入对话框并通过onPrepareDialog方法为自定义的输入书签对话框中的按钮添加了监听

选择书签功能的实现

选择书签对话框不同于添加书签对话框是用Java代码实现的具体的实现步骤如下

在数据库中取出所有书签的名字和页数的索引值并分别放入两个数组tempname和temppage中用来放入书签列表中显示

用Java代码编写列表对话框并且为ListView添加内容适配器将在数据库中取出的书签名称和其对应的页数的索引加入到ListView中

当单击选择书签对话框中的某一项时得到当前的页数根据页数查找HashMap找到相应的BookMark类的对象从而知道要跳转到的页的索引值

当长时间按住选择书签对话框中的某一项时弹出是否删除这条记录的对话框如果单击确定按钮则会删除这条记录单击取消按钮则不会删除记录

图46 书签功能操作流程图

48 设置字体大小功能的实现

字体大小对话框与选择书签对话框的设计基本相同也是通过Java代码为对话框中控件的摆放形式设置布局当单击小号中号大号字体后如果当前字体与要变换的字体相同则不发生变化否则将字体的大小和中英文间距重新赋值然后重新绘制当前界面

字体大小变化后书签和HashMap的更新

updataBookMarkAndHashMap方法负责字体大小变化后更新书签和HashMap

drawVirtualPage方法是字体大小变化后书签和HashMap更新过程中虚拟绘制主界面中每一页信息并且为下一页的Left_Start的值赋值的方法

49 更换背景图片以及设置字体颜色功能的实现

1更换背景图片功能的实现

a 为了使对话框看起来更美观为对话框中的按钮设置背景图同时背景图与要设置背景一致为用户提供参考

b 为按钮添加监听使单击按钮后可以实现更换阅读内容背景的图片

c 设置要更换的图片并规定图片加载的属性用到了PicLoadUtil 这个工具类的

方法来实现图片自适应

d 重新绘制左右两侧背景图片上的文字

2设置字体颜色功能的实现

a 为了使对话框看起来更美观为对话框中的按钮设置背景图同时背景图与要

设置字体颜色一致为用户提供参考

b 为按钮添加监听使单击按钮后可以实现重新设置阅读界面字体

颜色

c 完成字体颜色设置返回到当前阅读界面继续阅读 410 音乐播放功能的实现

1完成自定义对话框的设计

2将曲目导入ListView为其添加监听同时实现控制音乐播放与停止的功能 3当音乐播放器为空或正在播放曲目二则更改播放曲目一在为其设置播放

模式后播放曲目否则是否播放器最终返回阅读主界面

第5章 系统测试

51 欢迎界面

打开本系统首先进入的是欢迎界面效com

图51 欢迎动画界面1

图52 欢迎动画界面2

52 用户阅读界面

若为第一次打开软件则在欢迎动画播放完后进入软件说明界面效果如图53

所示

图53 软件说明界面

单击菜单按钮弹出主菜单效果如图54所示

图54 阅读界面的menu功能

在主菜单中单击找书按钮进入找书选择界面效果如图55所示 图55 找书界面

在找书选择界面单击网络按钮进入网络下载列表效果如图56所示

图56 网络下载列表界面

选择某一文本并单击下载完毕后弹出提示信息效果如图57所示 图57 下载完成提示信息

如果下载文件已存在弹出提示界面效果如图58所示

图58 存在要下载文件提示界面

在找书选择界面单击SDCARD按钮进入SDCARD文件列表效果如图59所示 图59

SDCARD文件列表界面

在SDCARD文件列表中选中某文本后单击进入阅读界面效果如图510所示 图510 阅读界面

在主菜单中单击书签按钮进入书签功能界面效果如图511所示 图511 书签功能界面

在书签功能界面中单击添加书签按钮进入添加书签界面效果如图512所示 图512 添加书签界面

在书签功能界面中单击选择书签按钮进入选择书签界面效果如图513所示 图513 选择书签界面

在书签功能界面单击清空书签按钮进入清空书签界面效果如图514所示 图514

删除书签界面

在主菜单中单击自动翻页按钮进入自动翻页界面效果如图515所示 图515 自动翻页界面

在主菜单中单击设置按钮进入设置界面效果如图516所示 图516 设置界面

在设置界面中单击背景音乐按钮进入背景音乐界面效果如图517所示

图517 背景音乐界面

在设置界面中单击背景图片按钮进入背景图片界面效果如图518所示

图518 背景图片界面

在设置界面中单击字体颜色按钮进入字体颜色界面效果如图519所示

图519 字体颜色界面

在设置界面单击字体大小按钮进入字体大小界面效果如图520所示

图520 字体大小界面

毕业设计总结

经过测试本设计的所有模块均可正常运行并且达到了预期的效果与此同时本设计还存在着很多的不足在此我对其特点和不足作些阐述

特点本设计以java为开发语言sqlite3数据库作为后台支撑很好的解决了实际开发中遇到的技术问题本设计的界面特点界面友好易于操作维护采用了大量的人机交互式操作能很好的完成阅读的全过程使浏览者一进入就可以独立的进行自己需要的操作一目了然本设计实现了从SDCARD找书或从服务器端下载新书添加书签选择书签清空所有书签清空某一条书签自动翻页设置背景音乐背景图片更改字体颜色字体大小加载广告信息的功能能够让读者很顺利的达到阅读的目的且不会影响阅读的进度在很大程度上给予了极大的方便通过最终的运行可以达到省时的目的方便快捷仿真翻页记录阅读者最后一次阅读的信息并在下次打开时自动初始化到上次阅读到的界面是本设计最大的特点

不足在本设计中只有将服务器端的新书下载至SDCARD中才可供读者阅读未能实现在线阅读的功能不能充分利用资源SDCARD中存储的文件名只能以英文的形式存在从而使得在SDCARD找书界面中的书名只能以英文形式出现

由于水平有限难免有不足之处设计中也还存在不完善之处有待改进 参考文献

[1] 杨丰盛Android应用开发揭秘[M]北京机械工业出版社20101 [2] 王家林大话企业级Android应用开发实践[M]北京电子工业出版社

20118

[3] 王永松Android平台开发之旅[M]北京机械工业出版社20011 [4] 佘志龙Android SDK开发范例大全[M]北京人民邮电出版社20106 [5] 吴亚峰Android应用案例开发大全[M]北京人民邮电出版社201210 [6] 郭宏志 Android应用开发详解[M]北京电子工业出版社2010 [7] 吴亚峰Android核心技术与实例详解[M]北京电子工业出版社201010 [8] 李芝兴Java程序设计之网络编程[M]北京清华大学出版社20098[23]

Android官方网站

附录一 核心代码

建立BookRecord表的SQL语句

static SQLiteDatabase sld

public static void createOrOpenDatabase

try

sld SQLiteDatabaseopenDatabase

"datadatacomerrecordself"

null

SQLiteDatabaseOPEN_READWRITESQLiteDatabaseCREATE_IF_NECESSARY

String sql1 "create table if not exists BookRecord"

" "

"rid INTEGER PRIMARY KEY AUTOINCREMENT"

"path varchar 50 "

"data blob"

" "

sldexecSQL sql1

catch Exception e

eprintStackTrace

建立BookMark表的SQL语句

String sql2 "create table if not exists BookMark"

" "

"mid INTEGER PRIMARY KEY

AUTOINCREMENT"

"ridfk INTEGER"

"bmname varchar 50 "

"page INTEGER"

" "

sldexecSQL sql2

建立LastTimePage表的SQL语句

String sql3 "create table if not exists LastTimePage"

" "

"lid INTEGER PRIMARY KEY AUTOINCREMENT"

"path varchar 50 "

"page INTEGER"

"fontsize INTEGER"

" "

sldexecSQL sql3

附录二 毕业设计外文翻译英文

The Java IO System

Creating a good inputoutput IO system is one of the more difficult

tasks for a language designer This is evidenced by the number of

different approaches

The challenge seems to be in covering all possibilities Not only are

there different sources and sinks of IO that you want to communicate

with files the console network connections etc but you need to talk to

them in a wide variety of ways sequential random-access buffered binary

character by lines by words etc The Java library designers attacked

this problem by creating lots of classes In fact there are so many

classes for Javas IO system that it can be intimidating at first

ironically the Java IO design actually prevents an explosion of classes

There was also a significant change in the IO library after Java io when

the original byte-oriented library was supplemented with char-oriented

Unicode-based IO classes The nio classes for "new IO" a name well still

be using years from now even though they were introduced in JDK 14 and

so are already "old" were added for improved performance and

functionality As a result there are a fair number of classes to learn

before you understand enough of Javas IO picture that you can use it

properly In addition its rather important to understand the evolution of

the IO library even if your first reaction is "Dont bother me with

history just show me how to use it" The problem is that without the

historical perspective you will rapidly become confused with some of the

classes and when you should and shouldnt use them

Input and output

Programming language IO libraries often use the abstraction of a

stream which represents any data source or sink as an object capable of

producing or receiving pieces of data The stream hides the details of

what happens to the data inside the actual IO device

The Java library classes for IO are divided by input and output as

you can see by looking at the class hierarchy in the JDK

documentation Through inheritance everything derived from the

InputStream or Reader classes has basic methods called read for reading

a single byte or an array of bytes Likewise everything derived from

OutputStream or Writer classes has basic methods called write for

writing a single byte or an array of bytes However you won抰 generally

use the se methods they

exist so that other classes can use them梩hese other classes

provide a

more useful interface Thus you抣l rarely create your stream object

by

using a single class but instead will layer multiple objects

together to provide your desired f unctionality this is the Decorator

design pattern as you shall see in this section The fact that you create

more than one object to produce a single stream is the primary reason

that Java抯 IO library is confusing

It抯 helpful to categorize the clas ses by their functionality In

Java lo the library designers started by deciding that all classes that

had anything to do with input would be inherited from InputStream and

all classes that were associated with output would be inherited from

OutputStream

Type of InputStream

InputStreams job is to represent classes that produce input from

different sourcesThese sources can be

An array of bytes

A String obj ect

A file

A "pipe" which works like a physical pipe You put things in at one

end and they come out the other

A sequence of other streams so you can collect them together into a

single stream

Other sources such as an Internet connection This is covered in

Thinking in Enterprise Java available at com

Each of these has an associated subclass of InputStream In addition

the FilterInputStream is also a type of InputStream to provide a base

class for "decorator" classes that attach attribute or useful interfaces

to input streams

Types of OutputStream

This category includes the classes that decide where your output

will go an array of bytes but not a Stringpresumably you can create one

using the array of bytes a file or a "pipe"

In addition the FilterOutputStream provides a base class for

"decorator" classes that attach attributes or useful interfaces to

output streams This is discussed later

Adding attributes and useful interfaces

Decorators were introduced in the Generics chapter on page 717 The

Java IO library requires many different combinations of features and

this

is the justification for using the Decorator design pattern1 The

reason for the existence of the "filter" classes in the Java IO library

is that the abstract "filter" class is the base class for all the

decorators A decorator must have the same interface as the object it

decorates but the decorator can also extend the interface which occurs

in several of the "filter" classes

There is a drawback to Decorator however Decorators give you much

more flexibility while youre writing a program since you can easily mix

and match attributes but they add complexity to your code The reason

that the Java IO library is awkward to use is that you must create many

classesthe "core" IO type plus all the decoratorsin order to get the

single IO object that you want

The classes that provide the decorator interface to control a

particular InputStream or OutputStream are the FilterlnputStream and

FilterOutputStream which dont have very intuitive names

FilterlnputStream and FilterOutputStream are derived from the base

classes of the IO library InputStream and OutputStream which is a key

requirement of the decorator so that it provides the common interface to

all the objects that are being decorated

Readers Writers

Java 11 made significant modifications to the fundamental IO stream

library When you see the Reader and Writer classes your first thought

like mine might be that these were meant to replace the InputStream

and OutputStream classes But thats not the case Although some aspects of

the original streams library are deprecated if you use them you will

receive a warning from the compiler the InputStream and OutputStream

classes still provide valuable functionality in the form of byte-oriented IO whereas the Reader and Writer classes provide Unicode-compliant character-based IO In addition

Java 11 added new classes into the InputStream and OutputStream

hierarchy so its obvious those hierarchies werent being replaced

There are times when you must use classes from the "byte" hierarchy

in combination with classes in the "character" hierarchy To accomplish

this there are "adapter" classes

InputStreamReader converts an InputStream to a Reader and

OutputStreamWriter converts an

OutputStream to a Writer

The most important reason for the Reader and Writer hierarchies is

for internationalization The old IO stream hierarchy supports only 8-bit

byte streams and doesnt handle the 16-bit Unicode characters well Since

Unicode is used for internationalization and Javas native char is 16-bit

Unicode the Reader and Writer hierarchies were added to support Unicode

in all IO operations In addition the new libraries are designed for

faster operations than the old

Standard IO

The term standard IO refers to the Unix concept of a single stream

of information that is used by a program this idea is reproduced in some

form in Windows and many other operating systems All of the programs

input can come from standard input all of its output can go to standard

output and all of its error messages can be sent to standard error The

value of standard IO is that programs can easily be chained together and

one programs standard output can become the standard input for another

program This is a powerful tool

Reading from standard input

Following the standard IO model Java has Systemin Systemout and

Systemerr Throughout this book youve seen how to write to standard

output using Systemout which is already pre-wrapped as a PrintStream

object Systemerr is likewise a PrintStream but Systemin is a raw

InputStream with no wrapping This means that although you can use

Systemout and Systemerr right away Systemin must be wrapped before you

can read from it

Youll typically read input a line at a time using readLine To do

this wrap Systemin in a BufferedReader which requires you to convert

Systemin to a Reader using InputStreamReader

Redirecting

The Java System class allows you to redirect the standard input

output and error IO streams using simple static method calls

setIn InputStream

setOut PrintStream

setErr PrintStream

Redirecting output is especially useful if you suddenly start

creating a large amount of output on your screen and its scrolling past

faster than you can read it4 Redirecting input is valuable for a

command-line program in which you want to test a particular user-input

sequence repeatedly

New IO

The Java "new" IO library introduced in JDK 14 in the javanio

packages has one goal speed In fact the "old" IO packages have been

reimplemented using nio in order to take advantage of this speed

increase so you will benefit even if you dont explicitly write code with

nio The speed increase occurs both in file IO which is explored here and

in network IO which is covered in Thinking in Enterprise Java

The speed comes from using structures that are closer to the

operating systems way of performing IO channels and buffers You could

think of it as a coal mine the channel is the mine containing the seam

of coal the data and the buffer is the cart that you send into the mine

The cart comes back full of coal and you get the coal from the cart That

is you dont interact directly with the channel you interact with the

buffer and send the buffer into the channel The channel either pulls

data from the buffer

or puts data into the buffer

The only kind of buffer that communicates directly with a channel is

a ByteBufferthat is a buffer that holds raw bytes If you look at the JDK

documentation for comBuffer youll see that its fairly basic You create

one by telling it how much storage to allocate and there are methods to

put and get data in either raw byte form or as primitive data types But

theres no way to put or get an object or even a String Its fairly low-

level precisely because this makes a more efficient mapping with most

operating systems

Three of the classes in the "old" IO have been modified so that they

produce a FileChannel FileInputStream FileOutputStream and for both

reading and writing RandomAccessFile Notice that these are the byte

manipulation streams in keeping with the low-level nature of nio The

Reader and Writer character-mode classes do not produce channels but the

comnelsChannels class has utility methods to produce Readers and Writers

from channels

Reading from an InputStream with FilterlnputStream

The FilterlnputStream classes accomplish two significantly different

things DatalnputStream allows you to read different types of primitive

data as well as String objects All the methods start with "read" such as

readByte readFloat etc This along with its companion DataOutputStream

allows you to move primitive data from one place to

another via a stream

The remaining FilterlnputStream classes modify the way an

InputStream behaves internally whether its buffered or unbuffered

whether it keeps track of the lines its reading allowing you to ask for

line numbers or set the line number and whether you can push back a

single character The last two classes look a lot like support for

building a compiler they were probably added to support the experiment

of "building a Java compiler in Java" so you probably wont use them in

general programming

Youll need to buffer your input almost every time regardless of the

IO device youre connecting to so it would have made more sense for the

IO library to have a special case or simply a method call for unbuffered

input rather than buffered input

Writing to an OutputStream with FilterOutputStream

The complement to DatalnputStream is DataOutputStream which formats

each of the primitive types and String objects onto a stream in such a

way that any DatalnputStream on any machine can read them All the

methods start with "write" such as writeByte writeFloat etc

The original intent of PrintStream was to print all of the primitive

data types and String objects in a viewable format This is different

from DataOutputStream whose goal is to put data elements on a stream in

a way that DatalnputStream can portably reconstruct them

The two important methods in PrintStream are print and println

which are overloaded to print all the various types The difference

between print and println is that the latter adds a newline when its

done BufferedOutputStream is a modifier and tells the stream to use

buffering so you dont get a physical write every time you write to the

stream

Off by itself RandomAccessFile

RandomAccessFile is used for files containing records of known size

so that you can move from one record to another using seek then read or

change the records The records dont have to be the same size you just

have to determine how big they are and where they are placed in the file

At first its a little bit hard to believe that RandomAccessFile is

not part of the InputStream or OutputStream hierarchy However it has no

association with those hierarchies other than that it happens to

implement the DataInput and DataOutput interfaces which are also

implemented by DataInputStream and DataOutputStream It doesnt even use

any of the functionality of the existing InputStream or OutputStream

classes its a completely separate class written from scratch with all of

its own mostly native methods The reason for this may be that

RandomAccessFile has essentially different behavior than the other IO

types since you can move forward and backward within a file In any event

it stands alone as a direct descendant of Object

Essentially a RandomAccessFile works like a DataInputStream pasted

together with a DataOutputStream along with the methods getFilePointer

to find out where you are in the file seek to move to a new point in

the file and length to determine the imum size of the file In addition

the constructors require a second argument identical to fopen in C

indicating whether you are just randomly reading "r" or reading and

writing "rw" Theres no support for write-only files which could suggest

that RandomAccessFile might have worked well if it were inherited from

DataInputStream

The seeking methods are available only in RandomAccessFile which

works for files only BufferedInputStream does allow you to mark a

position whose value is held in a single internal variable and reset to

that position but this is limited and not very useful

The File class

Before getting into the classes that actually read and write data to

streams well look at a library utility that assists you with file

directory issues The File class has a deceiving name you might think it

refers to a file but it doesnt In fact "FilePath" would have been a

better name for the class It can represent either the name of a

particular file or the names of a set of files in a directory If its a

set of files you can ask for that set using the list method which

returns an array of String It makes sense to return an array rather than

one of the flexible container classes because the number of elements is

fixed and if you want a different directory listing you just create a

different File object

A directory lister

Suppose youd like to see a directory listing The File object can be

used in two ways If you call list with no arguments youll get the full

list that the File object contains However if you want a restricted

listfor example if you want all of the files with an extension of

Javathen you use a "directory filter" which is a class that tells how to

select the File objects for display

DirFilters sole reason for existence is to provide the accept method

to the list method so that list can "call back" accept to determine

which file names should be included in the list Thus this structure is

often referred to as a callback More specifically this is an example of

the Strategy design pattern because list implements basic functionality

and you provide the Strategy in the form of a FilenameFilter in order to

complete the algorithm necessary for list to provide its service Because

list takes a FilenameFilter object as its argument it means that you can

pass an object of any class that implements FilenameFilter to choose

even at run time how the list method will behave The purpose of a

Strategy is to provide flexibility in the behavior of code

The accept method must accept a File object representing the

directory that a particular file is found in and a String containing the

name of that file Remember that the list method is calling accept

for each of the file names in the directory object to see which one

should

be included this is indicated by the boolean result returned by

accept

附录三 毕业设计外文翻译中文

Java IO 系统

对语言设计人员来说创建好的输入,输出系统是一项特别困难的任务现有的大量不同方案已经说明了这一点挑战似乎来自于要涵盖所有的可能性不仅存在各种用于通信的IO源端和接收端文件控制台网络连接等而且还需要以多种不同的方式与它们通信顺序随机访问二进制字符按行按字等等

Java 库的设计者是通过创建大量类来攻克这个难题的一开始可能对Java的IO系统提供了如此多的类而感到不知所措具有讽刺意味的是java IO设计的初衷是为了避免过多的类自从Java10 版本以来IO 库的设计发生了显著的变化在原来面向字节的类中添加了面向字符和基于Unicode的类在JDK14中添加了nio类对于新IO这个称呼从现在这个名字我们仍将要用若干年用于改进性能及功能因此在充分

理解java IO系统以便正确地用运之前我们需要学习相当数量的类另外很有必要理解IO类库的演化过程即使我们的第一反应是不要用历史打扰我只要告诉我怎么用问题是如果缺乏历史的眼光很快我们就会对什么时候该用某些类什么时候不该用他们而感到迷惑

输入和输出

IO类库中通常使用流stream这个抽象概念它代表任何有能力产生数据的数据源对象或者是有能力接受数据的接收端对象流屏蔽了实际的IO设备中处理数据的细节

可将Java 库的IO 类分割为输入与输出两个部分可以在JDK文档里的类层

次结构中查看到通过继承从InputStream输入流或Reader衍生的所有类都拥有名为read 的基本方法用于读取单个字节或者字节数组类似地从OutputStream

或Write衍生的所有类都拥有基本方法write 用于写入单个字节或者字节数组然而我们通常不会用到这些方法它们之所以存在是因为更复杂的类可以利用它们以便提供一个更有用的接口因此我们很少用单个类创建自己的系统对象相反我们会通过叠合多个对象来提供所期望的功能实际上Java中流类库让人迷惑的主要原因就在于创建一个单一的结果流却需要创建多个对象

有必要按照功能对类进行分类在Java10中库的设计者首先决定与输入有关的所有类都从InputStream 继承而与输出有关的所有类都从OutputStream 继承

InputStream 的类型

InputStream 的作用是标志那些从不同起源地产生输入的类这些数据源包括

1 字节数组

2 String 对象

3 文件

4 管道它的工作原理与现实生活中的管道类似将一些东西置入一端它们在另一端出来

5 一系列其他流以便我们将其统一收集到单独一个流内

6 其他数据源如Internet 连接等

每一种数据源都有相应的InputStream子类另外FilterInputStream也属于一种InputStream为decorator类提供基类其中decorator类可以把属性或

者有用的接口与输入流连接在一起

OutputStream 的类型

这一类别包括的类决定了我们的输入往何处去一个字节数组但没有String假定我们可用字节数组创建一个一个文件或者一个管道

除此以外FilterOutputStream 为修饰器decor投入类提供了一个基础类它将属性或者有用的接口同输出流连接起来

增添属性和有用的接口

利用层次化对象动态和透明地添加单个对象的能力的做法叫作修饰器Decorator方案修饰器方案规定封装于初始化对象中的所有对象都拥有相同的接口以便利用装饰器的透明性质我们将相同的消息发给一个对象无论它是否已被装饰这正是在Java IO库里存在过滤器Filter类的原因但是装饰器方案也有自己的一个缺点在我们写一个程序的时候装饰器为我们提供了大得多的灵活性因为可以方便地混合与匹配属性但它们也使自己的代码变得更加复杂原因在于Java IO 库操作不便我们必须创建许多类核心IO 类型加上所有装饰器才能得到自己希望的单个IO

对象

FilterInputStream 和FilterOutputStream 这两个名字不十分直观提供了相应的装饰器接口用于控制一个特定的输入流InputStream或者输出流OutputStream它们分别是从InputStream 和OutputStream 衍生出来的此外它们

都属于抽象类在理论上为我们与一个流的不同通信手段都提供了一个通用的接口事实上FilterInputStream FilterOutputStream 只是简单地模仿了自己的基础类它们是一个装饰器的基本要求

读和写

Java11对基本的IO流类库进行了重大的修改当我们初次看见Reader和Writer类是可能会以为这是两个用来替代InputStream和OutputStream的类但实际上并不是这样尽管一些原始的流类库不再使用如果使用它们则会收到编辑器的警告信息但是InputStream和OutputStream在一面向字节形式的IO中仍可以提供极有价值的功能Reader和Writer则提供兼容Unicode与面向字符的IO的功能另外

Java11向InputStream和OutputStream继承层次结构中添加了一些新类所以很明显在这些层次结构中的类是不会被取代的

有时我们必须把来自于字节层次结构中的类和字符层次结构中的类结合起来使用为了实现这个目的要用到适配器adapter类InputStream可以把InputStream转换为ReaderOutputStreamWriter可以OutputStream转化为Writer

设计Reader和Writer继承层次结构主要是为了国际化老的IO流继承层次结构支持8为字节流并且不能很好地处理16位的Unicode字符既然Unicode是用来国际化的Java本身的插入也是16位的Unicode因此添加Reader和Writer继承层次结构就是为了在所有的IO操作中都支持Unicode另外新类库的设计使得它的操作比旧类库更快

标准IO

标准IO这个术语参考的是Unix中程序所使用的单一信息流这个概念在windows和其他许多操作系统中也有相似的实现程序的所有输入都可以来自于标准输入它的所有输出也都可以发送到标准输出以及所有的错误信息都可以发送到标准错误标准IO的意义在于我们可以很容易地把程序串联起来一个程序的

标准输出可以成为另一个程序的标准输入这真是一个强大的工具

从标准输入读取

按照标准IO模型Java提供了SysteminSycom其中Systemout已经事先被包装成了printStream对象Systemerr同样也是PrintStream但Systemin却是一个没有被包装的未经加工的InputStream这意味尽管我们可以立即使用Sycom但是在读取Systemin之前必须对其进行包装

通常我们会使用readerLine一次一行地读取输入因此我们会将Systemin包装成BufferedReader来使用为此我们必须用InputStream把Systemin转换成Reader

标准IO重定向

Java的System类提供一些简单的静态方法调用允许我们队标准输入输出和错误IO流进行重定向

setInInputStream

setOutPrintStream

setErrPrintStream

如果我们突然开始在显示器上创建大量输出而这些输出滚动的如此之快一至于无法阅读时重定向输出就显得极为有用对于我们想重复测试特定用户的输入序列的命令行程序来说重定向输入就是很有价值

新IO

JDK14 的javanio包中引入了Java新的IO类库其目的在于提高速度实际上旧的IO包已经使用nio重新实现过以便充分利用这种速度提高因此即使我们不显式地用nio编写代码也能从中受益速度的提高在文件IO和网络IO中都有可能

发生速度的提高来自于所使用的结构更接近于操作系统执行 IO 的方式通道和缓冲器我们可以把它想象成一个煤矿通道是一个包含煤层数据的矿藏而缓冲器则我

们派送到矿藏的卡车卡车载满煤炭而归我们再从卡车上获得煤炭也就是说我们并没有直接和通道交互我们只是和缓冲器交互并把缓冲器派送到通道通道要么从缓冲器获得数据要么向缓冲器发送数据唯一直接与通道交互的缓冲器是 ByteBuffer也就是说可以存储未加工字节的缓冲器当我们查询 JDK 文档中的 comBuffer 时会发现它是相当基础的类通过告知分配多少存储空间来创建一个 ByteBuffer 对象并且还有一个方法选择的集用于以未加工的字节形式或原始的数据类型输出和读取数据但是没办法输出或读取对象即使是字符串对象也不行这种处理虽然是低水平但却正好因为这是大多数操作系统中更有效的映射方式旧 IO 类库中有三个类被改进了用以产生 FileChannel它们是 FileInputStreamFileOutputStream 以及用于既读又写的 RandomAccessFile

注意这些是字节操纵流与低层的 nio 特性一致Reader 和 Writer 的字符模式类不能用于产生通道但是comnelsChannels 类能提供实用方法在通道中产生

Reader 和 Writer

采用的是一个完全不相干的类该类属于全新的设计含有自己的全部大多数为固有方法之所以要这样做是因为RandomAccessFile 拥有与其他IO 类型完全不同的行为因为我们可在一个文件里向前或向后移动不管在哪种情况下它都是独立运作的作为Object 的一个直接继承人使用

从根本上说RandomAccessFile 类似DataInputStream 和DataOutputStream

的联合使用其中getFilePointer 用于了解当前在文件的什么地方seek 用于移至文件内的一个新地点而length 用于判断文件的最大

长度此外构建器要求使用另一个自变量与C 的fopen 完全一样指出自己只是随机读"r"还是读写兼施"rw"这里没有提供对只写文件的支持也就是说假如是从DataInputStream 继承的那么RandomAccessFile 也有可能能很好地工作很容易想象我们有时要在其他类型的数据流中搜索比如一个ByteArrayInputStream

但搜索方法只有RandomAccessFile 才会提供而后者只能针对文件才能操作不能针对数据流操作此时BufferedInputStream 确实允许我们标记一个位置使用mark 它的值容纳于单个内部变量中并用reset 重设那个位置但这些做法都存在限制并不是特别有用

File 类

File 类有一个欺骗性的名字通常会认为它对付的是一个文件但实情并非如此它既代表一个特定文件的名字也代表目录内一系列文件的名字若代表一个文件集便可用list 方法查询这个集返回的是一个字串数组之所以要返回一个数组而非某个灵活的集合类是因为元素的数量是固定的而且若想得到一个不同的目录列表只需创建一个不同的File 对象即可事实上FilePath文件路径似乎是一个更好的名字

目录列表器

现在假设我们想观看一个目录列表可用两种方式列出File 对象若在不含自变量参数的情况下调用list 会获得File 对象包含的一个完整列表然而若想对这个列表进行某些限制就需要使用一个目录过滤器该类的作用是指出应如何选择File

对象来完成显示它指出这种类型的所有对象都提供了一个名为accept 的方法之所以要创建这样的一个类背后的全部原因就是把accept 方法提供给list 方法使list 能够回调accept 从而判断应将哪些文件名包

括到列表中因此通常将这种技术称为回调有时也称为算子也就是说DirFilter

是一个算子因为它唯一的作用就是容纳一个方法由于list 采用一个FilenameFilter 对象作为自己的自变量使用所以我们能传递实现了

FilenameFilter 的任何类的一个对象用它决定甚至在运行期list 方法的行为方式回调的目的是在代码的行为上提供更大的灵活性

accept 方法必须接纳一个File 对象用它指示用于寻找一个特定文件的目录并接纳一个String其中包含了要寻找之文件的名字可决定使用或忽略这两个参数之

一但有时至少要使用文件名记住list 方法准备为目录对象中的每个文件名调用accept 核实哪个应包含在内具体由accept 返回的布尔结果决定

致谢

至此我的基于android的手机电子书阅读器的设计与实现毕业设计已全部结束顺利的实现了所预期的模块功能这次毕业设计是对我所学知识的回顾和总结在此基础上进行了综合应用

本文标签: 界面阅读书签设计文件