本程序只是使用了一些基本的知识点编写了一个比较简单粗陋的txt文本阅读器,效率不高,只适合新手练习。所以大神勿喷。

  其实想到编写这种程序源自本人之前喜欢看小说,而很多小说更新太慢,所以本人就只能找一个完本的.txt小说下载下来,有没有网络都可以看,当然现在不看那玩意了。

  废话就不说了,程序中使用到的有4个类,5个xml文件,其中3个布局文件、String.xml、AndroidManifest.xml。

  先看效果图吧(虽然很丑):

     

  下面就上代码吧,本人都注释好了,由于本人技术还不行,注释不对的,望指正,谢谢>~<

  MainActivity.java:

package cn.hmxin.readbookproject;import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;public class MainActivity extends ActionBarActivity {private ListView bookList = null ;//显示图书(txt)列表组件private Button btnAdd = null ;//追加书按钮组件private ArrayAdapter<String> adapter = null ;//适配器private List<String> data = null ; //用于存储数据,加载到适配器中private List<String> pathData = null ;//记录路径private static final int REMOVE_BOOK = Menu.FIRST;//移除书上下文菜单标识//程序中要使用到的路径public static final String MYPATH = Environment.getExternalStorageDirectory().getPath() + File.separator + "myBook";private int longClickPosition = 0 ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bookList = (ListView)findViewById(R.id.book_list);//绑定组件btnAdd = (Button)findViewById(R.id.btn_add);//绑定组件
        createOrRead();//创建或读取文件方法,顺带显示数据
        registerForContextMenu(bookList);//为txt列表组件注册上下文菜单
        btnAdd.setOnClickListener(new OnClick());//添加图书按钮的单击监听处理bookList.setOnItemClickListener(new OnItemClick());//图书列表的子项单击监听处理bookList.setOnItemLongClickListener(new OnItemLongClick());//图书列表的子项单击监听处理
        }//文件的创建和读取public void createOrRead(){File dirFile = new File(MYPATH);//声明并实例化一个File类,路径为MYPATH(路径详细看上面)if(!dirFile.exists()){//如果文件夹不存在dirFile.mkdirs();//创建文件夹
        }File file = new File(dirFile,"bookPath.txt");//声明并实例化一个File类,父路径为dirFile,文件名为bookPath.txtif(!file.exists()){//如果文件不存在try {file.createNewFile();//创建文件} catch (IOException e) {e.printStackTrace();}}else{//如果文件已经存在try {FileReader fr = new FileReader(file);//声明并实例化FileReader类,路径为fileBufferedReader br = new BufferedReader(fr);//声明并实例化BufferedFile类,缓冲读取数据data = new ArrayList<String>();//实例化List类,用于添加数据,加载在适配器中pathData = new ArrayList<String>();//记录路径String line = "" ;//用于存储读取到的数据while((line = br.readLine()) != null){//如果还有下一行数据int sub = line.lastIndexOf(File.separator);//截取文件名使用String strName = line.substring(sub+1, line.length());//截取到文件名data.add(strName);//添加文件名pathData.add(line);//添加整个文件路径
                }br.close();//关闭BufferedReader类fr.close();//关闭FileReader类//加载数据在适配器adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);bookList.setAdapter(adapter);//设置适配器} catch (FileNotFoundException e) {//抛出异常
                e.printStackTrace();} catch (IOException e) {//抛出异常
                e.printStackTrace();}}}//用来监听图书列表的选项单击事件private class OnItemClick implements AdapterView.OnItemClickListener{@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {Intent intent = new Intent(MainActivity.this, ReadBookActivity.class);//用于跳转Activity使用,此处跳转到读取图书界面intent.putExtra("txtFilePath", pathData.get(position));//传送要打开的txt文件路径startActivity(intent);//跳转界面
        }}//用来监听图书列表的选项长按事件private class OnItemLongClick implements AdapterView.OnItemLongClickListener{@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {longClickPosition = position;//记录长按了列表哪个子项return false;}}//用来监听添加图书按钮的单击事件private class OnClick implements View.OnClickListener{@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, FileBrowserActivity.class);//跳转到文件浏览选择界面startActivity(intent);//跳转界面
        }}//创建上下文菜单
    @Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {menu.add(0, REMOVE_BOOK, 0, "移除读书");//添加菜单子项super.onCreateContextMenu(menu, v, menuInfo);}@Overridepublic boolean onContextItemSelected(MenuItem item) {if(item.getItemId() == REMOVE_BOOK){//移除图书处理
            removeBook();}return super.onContextItemSelected(item);}//移除图书处理public void removeBook(){try {data.remove(longClickPosition);//移除该项pathData.remove(longClickPosition);//移除该项FileWriter fw = new FileWriter(new File(MYPATH + File.separator + "bookPath.txt"));//设置读取文件BufferedWriter bw = new BufferedWriter(fw);//用BufferedWriter类写入数据for(String str : pathData){//遍历pathData对象bw.write(str);//写入数据bw.newLine();//新的一行
            }bw.close();//加载数据在适配器adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);bookList.setAdapter(adapter);//设置适配器} catch (IOException e) {//抛出异常
            e.printStackTrace();}}}

activity_mai.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="cn.hmxin.readbookproject.MainActivity" ><LinearLayout android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="18dip"android:textStyle="bold"android:layout_weight="1"android:text="@string/list_title" /><Button android:id="@+id/btn_add"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/add"/></LinearLayout><ListView android:id="@+id/book_list"android:layout_width="match_parent"android:layout_height="wrap_content"></ListView></LinearLayout>

SubFile.java

package cn.hmxin.readbookproject;
import java.io.File;public class SubFile {private File file =null ;//封装一个File类,用于接收传进构造方法中的File类public SubFile(File file) {//构造方法this.file = file ;//本类中的file赋值为传进来的file
    }public File getFile() {//getter方法,返回File类return this.file;//返回本类中的file对象
    }@Overridepublic String toString() {String str = null; //声明一个字符串用来返回值if(file.isDirectory()) {//是文件夹str = "[文件夹]" + file.getName();}else {//是文件if(file.getName().lastIndexOf(".txt")>-1) {//这里是过滤掉别的文件,做文件浏览器,可以去掉str = "[文件]" + file.getName();//赋值"[文件]"+文件名字
            }}return str;//返回该字符串
    }
}

FileBrowserActivity.java

package cn.hmxin.readbookproject;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;public class FileBrowserActivity extends Activity {private ListView fileList = null ;//显示文件的列表private ArrayAdapter adapter = null ;//适配器
    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.file_browser_layout);setTitle("选择您的文件名");//更改标题fileList = (ListView)findViewById(R.id.file_list);//绑定组件openFile(adapter, fileList);//打开文件和配置适配器,显示在列表上
        fileList.setOnItemClickListener(new OnItemClick());//文件列表的子项单击监听处理
        }/*** 此方法用于装载数据* @param adapter ArrayAdapter适配器* @param list 要显示的ListView*/public void openFile(ArrayAdapter adapter, ListView list){List<SubFile> ndata = new ArrayList<SubFile>();//用于存放文件名,加载到适配器中String strPath = getIntent().getStringExtra("filename");//获取上个界面传来的值if(strPath == null){//没有有数据strPath = Environment.getExternalStorageDirectory().getPath();//根目录
        }File pathFile = new File(strPath);//要显示的目录if(pathFile != null){//有这个目录File[] files = pathFile.listFiles();//获取目录下的所有文件夹与文件for(File file : files){//全部遍历if(new SubFile(file).toString()!=null){//如果不是筛选掉的文件ndata.add(new SubFile(file));//添加到mdata对象中
                }}//配置适配器adapter = new ArrayAdapter(FileBrowserActivity.this, android.R.layout.simple_list_item_1, ndata);list.setAdapter(adapter);//设置列表的适配去}else{//空文件处理Toast.makeText(FileBrowserActivity.this , "查找文件为空!", Toast.LENGTH_SHORT).show();}}//文件列表子项的单击监听处理private class OnItemClick implements AdapterView.OnItemClickListener{@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {SubFile subFile = (SubFile) parent.getAdapter().getItem(position);//获取子项存储的SubFile类,该类可以获取到子项所在路径String filename = subFile.getFile().getPath();//filename赋值为subFile对象中的路径Intent intent = null;//声明Intent类,用于跳转界面if(subFile.getFile().isDirectory()){//如果路径为文件夹intent = new Intent(FileBrowserActivity.this, FileBrowserActivity.class);//还是跳转到改Activityintent.putExtra("filename", filename);//传入路径}else{//文件的话intent = new Intent(FileBrowserActivity.this, MainActivity.class);//跳转到主界面writeData(filename);//调用writeData方法,该方法用于写入数据
            }startActivity(intent);//跳转界面finish();//清除界面
        }}/*** 该方法用于写入数据* @param str 要写入的值*/public void writeData(String str){File file = new File(MainActivity.MYPATH+File.separator+"bookPath.txt");//要操作的文件try {BufferedWriter bw = new BufferedWriter(new FileWriter(file,true));//用BufferedWriter类追加写入数据bw.append(str);//追加数据bw.newLine();//新的一行bw.close();//关闭BufferedWrite类} catch (IOException e) {//抛出异常
                e.printStackTrace();}}}

file_browser_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_margin="10dp"android:orientation="vertical" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="18dip"android:textStyle="bold"android:text="@string/file_select_title" /><ListView android:id="@+id/file_list"android:layout_width="match_parent"android:layout_height="wrap_content"></ListView></LinearLayout>

ReadBookActivity.java

package cn.hmxin.readbookproject;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;import android.app.Activity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;public class ReadBookActivity extends Activity {private TextView bookContent = null ;//显示文本的组件
    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.read_book_layout);bookContent = (TextView)findViewById(R.id.book_content);//绑定文本组件bookContent.setMovementMethod(ScrollingMovementMethod.getInstance());//给文本组件加入滚动条
        String txtFilePath = getIntent().getStringExtra("txtFilePath");//获取传进来的文本路径if(txtFilePath != null){//如果有传进数据int index = txtFilePath.lastIndexOf(File.separator);//用来截取文本的名字的第一个参数String name = txtFilePath.substring(index+1, txtFilePath.length());//截取文本名字setTitle(name);//设置标题为文本名字try {FileInputStream fr = new FileInputStream(txtFilePath);//文件输出流BufferedReader br = new BufferedReader(new InputStreamReader(fr, "utf-8"));//缓冲读取文件数据String line = "" ;//记录每一行数据String content = "" ;while((line = br.readLine()) != null){//如果还有下一行数据content += line + "\n" ;}bookContent.setText(content);;//追加显示数据br.close();//关闭文件输出流fr.close();//关闭缓冲区} catch (IOException e) {//抛出异常Toast.makeText(ReadBookActivity.this, "没有此文件!", Toast.LENGTH_SHORT).show();//提示异常finish();//直接关闭界面
            }}}
}

read_book_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><TextView android:id="@+id/book_content"android:layout_width="match_parent"android:layout_height="match_parent"android:textSize="14dip"/>
</LinearLayout>

strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources><string name="app_name">图书阅读程序(txt)</string><string name="list_title">图书列表:</string><string name="add">添加图书</string><string name="file_select_title">请选择.txt文件:</string></resources>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="cn.hmxin.readbookproject"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="21" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".ReadBookActivity"></activity><activity android:name=".FileBrowserActivity"></activity></application></manifest>

  最后想说的是,新手们可以着重看SubFile.java和FileBrowserActivity.java这两个文件,这两个文件实现的是一个文件浏览器,方法简单至极,是本人在看教程中学到的。到最后你要是想做界面漂亮的浏览器,也可以借鉴借鉴。

  源码链接:https://files.cnblogs.com/files/hmxin/ReadBookProject.zip

《黑幕下的人》

转载于:https://www.cnblogs.com/hmxin/p/7461333.html

Android简单的编写一个txt阅读器(没有处理字符编码),适用于新手学习相关推荐

  1. WPF编写的txt阅读器(自适应各种编码,解决显示大数据量txt卡顿的问题)

    运行效果如下: 右击标题栏可选择下一页,上一页,打开文件,关闭程序 注意: 1.因为用textbox一次性显示1M以上的数据会特别慢,所以我在读取完txt文件之后按照每10240Byte字节为一页,每 ...

  2. 如何使用Foxit Mobile SDK 6.0 快速创建一个PDF阅读器-Android篇

    Foxit MobilePDF SDK是一款用于移动平台的快速开发包,专注于帮助开发人员将强大的Foxit PDF技术轻松地集成到他们的应用程序中.不知不觉,产品的版本已经到了6.0,近期刚刚发布,6 ...

  3. 用txt阅读器按目录分章节阅读小说

    用txt阅读器按目录分章节阅读小说 最近,我从网上下载了一部名为<大主宰>的长篇玄幻小说.这是一部章回小说,截至目前,已写到第1330章,真可谓宏篇巨制.我想用一个分章节的文本阅读器阅读它 ...

  4. linux的静态编译elf无法调试,[翻译]自己动手编写一个Linux调试器系列之4 ELF文件格式与DWARF调试格式 by lantie@15PB...

    自己动手编写一个Linux调试器系列之4 ELF文件格式与DWARF调试格式 by lantie@15PB 在上一节中,你已经听说了DWARF调试格式,它是程序的调试信息,是一种可以更好理解源码的方式 ...

  5. 评测三款高颜值的txt阅读器(ios手机适用)

    IOS上有哪些好用的.能解析txt格式的.颜值还高的阅读器?小编找了三款设计比较出色的进行试用,一起来看看吧. 1 neat reader 相信很多人都用过它,软件如其名,在前端设计上是费了心思的. ...

  6. 使用Python库pyqt5制作TXT阅读器(四)-------应用设置和程序打包

    项目地址:https://github.com/pikeduo/TXTReader PyQt5中文手册:https://maicss.gitbook.io/pyqt-chinese-tutoral/p ...

  7. 评测三款最流行的txt阅读器(ios手机适用)

    IOS上有哪些好用的txt阅读器?小编找了三款网络上呼声最高的进行试用,分别是 ,发现各有特点.一起来看看吧. 1 neat reader Neat Reader是一款比较轻量级的阅读器,可以跨平台使 ...

  8. 豆豆TXT阅读器1.0发布

    前后共花了一个多月时间,完成了个人的第一个android应用--豆豆TXT阅读器. 此应用主要用于阅读android设备本地TXT文件.具有以下功能: 1.支持手动进入sd卡目录并选择TXT文件导入书 ...

  9. 评测三款最流行的txt阅读器(windows适用)

    不知道大家常用的txt阅读器是什么呢?对于经常看电子书的小伙伴来说,txt这种电子书格式一定是很熟悉的,而能姿势优美地解析txt的阅读器软件却不算多.在这里我给大家评测3种windows上可用的txt ...

最新文章

  1. 【c语言】蓝桥杯算法训练 P0505
  2. 如何打造基于比特币现金(BCH)的消费需求
  3. 临近春招,Kafka是不是忘完了,给你一文概括Kafka
  4. 什么叫返回路径平面上的间隙_苏州平面设计培训:平面设计师工作流程
  5. 正则表达式中的分组的匹配次数的理解
  6. mysql sqldump_mysql sqldump 备份
  7. JWT认证原理、整合springboot实战应用
  8. Javascript中document.execCommand()的用法
  9. python快速入门及进阶
  10. 小白如何准备数学建模——以美赛为列
  11. 紫外光谱分析的基本原理是什么
  12. 春运火车票抢票浏览器强力推荐,秒抢车票到手
  13. grafana图形化数据展示软件介绍
  14. 某某行政处罚文书网 (请求参数: ciphertext)
  15. 【网络安全】重放攻击(Replay Attacks)
  16. USRP B210同步采集
  17. 轮回dj 佛教音乐_童音watmp3.com
  18. UG NX 12 点构造器
  19. linux delay和sleep,Linux sleep usleep and delay
  20. android 取消选择图片会闪退或者报错

热门文章

  1. 用python实现判断9*9数独的正确性
  2. 期末前端web大作业——动漫客栈响应式bootstarp(7页) 排版整洁,内容丰富,主题鲜明
  3. 第三十九篇 自定义指令 - directive
  4. (解决)org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题的办法
  5. 怎样用C语言sinx的曲线长度,Javascript 绘制 sin 曲线过程附图
  6. SQL UNION运算符
  7. 计算机辅助齿轮图标注,面向齿轮的计算机辅助设计、制造及检测设计(CAD图纸全套).doc...
  8. STM32_BKP备份数据
  9. windows如何使用bat快速安装计划任务?
  10. springboot实现微信模板消息推送