`
zkl_1987
  • 浏览: 245482 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

android 笔记 --- Android大TXT文本文档读取

阅读更多
由于现在TXT文本很多,特别是好多小说也是以这个文件格式出现,毕竟这个格式所占用不必要的空间比较小。像我这样的人就非常喜欢在手机上看小说,经常下载好多的TXT格式小说存到手机上以便空闲时候看。于是乎也试图做了一下如何在Android上实现看大文本的txt文档。

  虽然现在类似的应用还真不少,不过个人看到的基本不公布源码,而公布源码的基本都是不能看大文本的,所以自己去实现了一下。现在只是粗略实现了,实现方法是每次当滑动到屏幕底端时,从文件读2048字节出来显示到屏幕上。到屏幕底端再读是为了不给用户有刷屏的感觉,使用起来感觉不到只读了2048字节出来,比较流畅。现在由于只是试验流畅性,所以只写了向下浏览的,而没有写往回读,也就是说往回翻是无效的。

  废话不多说,代码是王道。这个是主文件:

package net.wangliping.filemanager;
 
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.CharBuffer;
 
import android.app.Activity;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.widget.ScrollView;
 
import net.wangliping.test.R;
 
public class TxtReader extends Activity implements
        RealTimeTextView.OnTextChangedListener {
 
    private static final String LOG_TAG = "TxtReader";
    private static final int SHOW_TXT = 1;
 
    private SwanTextView mTextShow;
    private ScrollView mScrollView;
    private String mStringShow = null;
 
    private boolean mContinueRead = true;
    private boolean mHaveNewText  = false;
 
    private int mCurBottom = -1;
    private int mNum = -1;
 
    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case SHOW_TXT:
                mTextShow.setText((CharBuffer) msg.obj);
                break;
            default:
                super.handleMessage(msg);
            }
        }
    };
 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.txt_reader);
 
        Uri uri = getIntent().getData();
 
        mScrollView = (ScrollView) findViewById(R.id.text_show_scroll);
 
        mTextShow = (RealTimeTextView) findViewById(R.id.text_show);   
        mTextShow.setOnTextChangedListener(this);
 
        new TextShowTask().execute(uri);
    }
 
    private void showText(Uri uri) throws IOException, InterruptedException {
 
        InputStreamReader is = new InputStreamReader(new FileInputStream(
                uri.getPath()), "GB2312");
 
        StringBuilder sb = new StringBuilder();
        char[] buf = new char[1024 * 2];
        while (true) {
            if (mCurBottom == mScrollView.getScrollY()) {
                Log.d(LOG_TAG, "curBtm:" + mCurBottom + " scroll:"
                        + mScrollView.getScrollY());
 
                mCurBottom = -1;
                mNum++;
 
                if (mNum % 2 == 0) {
                    mContinueRead = true;                   
                    Log.d(LOG_TAG, "YES");
                }
            }
 
            if (mContinueRead && is.read(buf) > 0) {
                mContinueRead = false;
 
                if (sb.length() > 4096) {
                    sb.delete(0, 2048);
 
                    Message msg = mHandler.obtainMessage(SHOW_TXT);               
                    msg.obj = CharBuffer.wrap(sb.toString());
                    mHandler.sendMessage(msg);
 
                    mStringShow = sb.append(buf).toString();
                    mHaveNewText = true;
                } else {
                    while (sb.length() < 4096) {
                        sb.append(buf);
                        is.read(buf);
                    }
 
                    sb.append(buf);
                    Message msg = mHandler.obtainMessage(SHOW_TXT);
                    msg.obj = CharBuffer.wrap(sb.toString());
                    mHandler.sendMessage(msg);
                }
            }
        }
    }
 
    private class TextShowTask extends AsyncTask<Object, Object, Object> {
        @Override
        protected void onPostExecute(Object param) {
            Log.d(LOG_TAG, "Send broadcast");
        }
 
        @Override
        protected Object doInBackground(Object... params) {
            Uri uri = (Uri) params[0];
 
            try {
                showText(uri);
            } catch (Exception e) {
                Log.d(LOG_TAG, "Exception", e);
            }
 
            return null;
        }
    }
 
    @Override
    public void onPreOnDraw(int bottom) {       
        mCurBottom = bottom - mScrollView.getHeight();
 
        if (mHaveNewText && !TextUtils.isEmpty(mStringShow)) {
            mHaveNewText = false;
 
            Message msg = mHandler.obtainMessage(SHOW_TXT);
            msg.obj = CharBuffer.wrap(mStringShow);
            mHandler.sendMessage(msg);
        }
    }
}


这个为了得到TextView底部的位置而扩展了TextView类:

package net.wangliping.filemanager;
 
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.widget.TextView;
 
public class SwanTextView extends TextView {
 
    private int mPreBottom = -1;
    private OnTextChangedListener textChangedListener = null;
 
    public SwanTextView(Context context) {
        super(context);
    }
 
    public SwanTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
 
    public SwanTextView(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
    }
 
    @Override
    protected void onDraw(Canvas canvas) {
 
        if (mPreBottom != getBottom()) {
            mPreBottom = getBottom();
 
            if (textChangedListener != null)
                textChangedListener.onPreOnDraw(mPreBottom);
        }
 
        super.onDraw(canvas);
    }
 
    public static interface OnTextChangedListener {
        public void onPreOnDraw(int bottom);
    }
 
    public void setOnTextChangedListener(OnTextChangedListener listener) {
        textChangedListener = listener;
    }
}


这个就是资源文件了:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/text_show_linear" android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <ScrollView android:id="@+id/text_show_scroll"
        android:layout_width="fill_parent" android:layout_height="fill_parent">
        <net.wangliping.filemanager.SwanTextView
            android:id="@+id/text_show" android:layout_width="fill_parent"
            android:layout_height="wrap_content" android:scrollbars="none">
        </net.wangliping.filemanager.SwanTextView>
    </ScrollView>
</LinearLayout>


分享到:
评论
2 楼 ominc 2012-04-22  
结尾会有乱码吧
1 楼 sunnygql 2011-10-08  
能不能发个Demo

相关推荐

    Android自学笔记-9-Pull方式处理XML

    Pull解析器是Android提供的轻量级解析XML的方式,它不需要像DOM解析那样一次性加载整个XML文档到内存中,而是通过事件驱动的方式,按需读取XML节点,降低了内存消耗,适合处理大型XML文件。 三、PullParser的工作...

    android学习笔记1--SAX解析XML

    ### Android学习笔记1—SAX解析XML #### SAX解析XML概览 在Android开发中,XML文件被广泛用于布局设计、资源定义等场景。而为了处理这些XML文件,开发者需要了解不同的XML解析技术,其中SAX(Simple API for XML)...

    Android画图学习笔记

    ### Android画图学习笔记知识点概览 #### 一、Android画图基础知识介绍 - **类的简介** - 在Android开发过程中,对于图形绘制的理解不仅仅局限于Google提供的官方文档,还需要深入掌握Java的基础类库,尤其是那些...

    Android开发笔记(一百四十一)读取PPT和PDF文件.doc

    本篇笔记主要介绍了如何在Android应用中读取和展示PPT(主要是PPTX格式)以及PDF文件。 首先,我们来看如何读取PPT文件,这里主要针对的是PPTX格式,因为它是Office 2007之后广泛使用的XML文档格式。读取PPTX文件...

    《大话Android应用开发实战》学习笔记

    本文档是根据《大话Android应用开发实战》一书整理的学习笔记,涵盖了76个关键知识点,旨在帮助初学者快速掌握Android应用开发的核心技能。以下是根据书籍内容整理的关键知识点。 #### 二、知识点详解 **1. @...

    android 蓝牙SPP传输demo - 副本 - 副本.rar

    "新建文本文档 - 副本.txt"可能记录了项目说明或开发过程中的笔记,也是值得参考的资料。 总的来说,这个"android 蓝牙SPP传输demo"为开发者提供了一个实践SPP通信的起点,通过学习和应用这个示例,你可以掌握如何...

    android安卓笔记

    ### Android 安卓笔记知识点详解 #### Android—基础 ##### 基础—概念 - **控件类之父**:`View`是所有控件的基类,无论是简单的按钮还是复杂的列表视图,都是从这个类派生出来的。 - **基准线**:在英文书写中,...

    Android笔记_基础_班振宇

    3. 使用解析器解析 XML 文档,读取开始节点、属性、文本和结束节点。4. 将解析到的信息映射到相应的 Java 对象。5. 关闭输入流。示例代码InputSource inputSource = new InputSource(new FileInputStream("/path/to/...

    行业文档-设计装置-多功能读书器.zip

    在IT行业中,多功能读书器通常指的是电子阅读设备,它能够读取各种电子书格式,并可能包含其他功能如笔记、标注、联网下载书籍等。这种设备通常采用E-Ink电子纸显示技术,以模拟纸质书的阅读体验,减少对眼睛的疲劳...

    android pdf demo

    在Android平台上,PDF(Portable Document Format)是一种广泛用于展示文档的格式,包括文本格式和图像。Android PDF Demo是为了帮助开发者了解如何在Android应用中集成和处理PDF文件而创建的示例项目。通过这个Demo...

    android ocr

    Android OCR不仅适用于扫描文档,还适用于翻译应用、笔记应用、购物比价应用等。例如,用户可以拍照保存名片信息,自动识别后存储到联系人中;在旅行时,可以快速识别并翻译路标或菜单。 9. **性能考虑** 由于OCR...

    android bypass

    1. **Markdown解析**:首先,`Android Bypass`会读取Markdown源文件,解析其中的语法元素,如标题、列表、代码块等。 2. **样式转化**:接着,解析后的Markdown元素会被转化为适应移动设备显示的样式,如字体大小、...

    AndroidPDF完美学习课件 很全很清晰

    在Android平台上,PDF(Portable Document Format)是一种广泛用于文档共享和阅读的标准格式。这份"AndroidPDF完美学习课件"提供了一套全面且清晰的资源,旨在帮助开发者或学习者深入理解如何在Android环境中处理和...

    NFC_ANDROID

    5. **新建文本文档.txt**:这个文件可能是记录开发过程中的笔记或代码片段,虽然没有明确的上下文,但通常这类文档可以帮助理解开发过程中的问题解决或实现思路。 综上所述,这份"NFC_ANDROID"开发资料集提供了一个...

    android版办公助手

    应用支持读取TXT文本文件和图片,这是移动办公中最常见的两种文件类型。TXT文件因其简洁、轻便的特点,常用于记录笔记、编写草稿或传输简单信息。而图片文件,无论是图表、照片还是扫描的文档,都是工作中不可或缺的...

    HotApp云笔记.zip

    在云笔记领域,这类应用通常提供了丰富的文本格式化选项、图片插入、链接分享以及可能的附件支持等功能,帮助用户高效地组织和检索信息。 在云笔记应用中,数据安全和隐私保护是至关重要的方面。"HotApp"可能会采用...

    适合初学者 eclipse 极为简易的android软件记事本代码实例

    它可能是通过基本的UI组件,如EditText(用于输入文本)和Button(用于保存或读取笔记)实现的,可能使用SQLite数据库来存储用户数据。 【标签解析】 标签包括“eclipse”、“初学者”、“android”和“记事本”、...

    IMP Reader

    8. **性能优化**:考虑到阅读大量文本可能导致内存消耗过大,开发者需要关注内存管理和性能优化,如使用`AsyncTask`进行后台处理,避免内存泄漏,并确保流畅的滚动体验。 9. **权限管理**:根据Android权限模型,...

    android阅读器和书架实现

    1. **文本渲染**:Android阅读器的核心是能够高效地渲染各种格式的文本,如EPUB、PDF或TXT等。这需要使用到`WebView`或自定义的`TextView`进行布局和排版。对于高级功能,可能还需要解析HTML、CSS甚至JavaScript来...

Global site tag (gtag.js) - Google Analytics