`
hecal
  • 浏览: 74704 次
社区版块
存档分类
最新评论

《转载》Android大TXT文本文档读取(1)

阅读更多

原文地址:http://wangliping.net/read-big-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>

  代码不成熟,见笑了

 

分享到:
评论

相关推荐

    android txt文件保存读取操作

    android 写了一个工具类实现txt文件保存和读取

    彻底解决android读取中文txt的乱码(自动判断文档类型并转码

    彻底解决android读取中文txt的乱码(自动判断文档类型并转码)

    Android系统下处理PDF文档的Java库-Spire.PDF for Android via Java_2.11.0.zip

    该控件一款专业的 Android PDF 控件,用于在 Android 手机应用程序中创建、读取、操作和转换 PDF 文档,运行环境无需安装 Adobe Acrobat 或其他任何第三方组件。支持的功能如下: PDF 文档安全性设置,画文本、图片...

    免费Android系统处理PDF文本的Java类库工具-Free Spire.PDF for Android via Java-2.12.0.zip

    免费Android PDF 控件,用于在 Android 手机应用程序中创建、读取、操作和转换 PDF 文档,运行环境无需安装 Adobe Acrobat 或其他任何第三方组件。支持的功能如下: PDF 文档安全性设置,画文本、图片、形状、条形码...

    android中文文档

    android sdk中文文档 资源是Android应用程序不可或缺的部分。一般而言,资源是你想包含和引入到应用程序里面的一些外部元素,比如图片、音频、视频、文本字符串、布局、主题等。每个Android应用程序包含一个资源...

    可以用于android手机的文本阅读器

    这是一个简单的书本阅读器,优势在于可以读取大容量的txt文档

    txt文档阅读器

    import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Align; public class BookPageFactory { //...

    Android版植物大战僵尸源码+设计文档

    Android版植物大战僵尸源文件,内含技术文档,说明了实现细节。各个包的说明:  com.tarena.monster 主要是用于游戏流程控制包  com.tarena.monster.actor 主要存放所有角色(精灵)初始化的类  ...

    Android 常用六大框架

    (2) ioc模块:android中的ioc模块,完全注解方式就可以进行UI绑定、res中的资源的读取、以及对象的初始化。 (3) 数据库模块:android中的orm框架,使用了线程池对sqlite进行操作。 (4) http模块:通过...

    新版Android开发教程.rar

    Android SDK tools included in Android 1.1 SDK, Release 1. Supported Supported Supported Supported Operating Operating Operating Operating Systems Systems Systems Systems • Windows XP (32-bit) or ...

    android开发入门与实战(下)

    第1章 掀起你的盖头来——初识Android 1.1 认识Android 1.2 Android的背景 1.2.1 Android的历史 1.2.2 Android的发展 1.3 我的Android我做主 1.3.1 开发基于Android平台的应用 1.3.2 参加Android开发者大赛 1.3.3 ...

    《Google Android开发入门与实战》.pdf

     本书内容上涵盖了用android开发的大部分场景,从android基础介绍、环境搭建、sdk介绍、market使用,到应用剖析、组件介绍、实例演示等方面。从技术实现上,讲解了5个android平台下的完整综合实例及源代码分析,...

    android开发入门与实战(上)

    第1章 掀起你的盖头来——初识Android 1.1 认识Android 1.2 Android的背景 1.2.1 Android的历史 1.2.2 Android的发展 1.3 我的Android我做主 1.3.1 开发基于Android平台的应用 1.3.2 参加Android开发者大赛 1.3.3 ...

    Google.Android开发入门与实战

    第1章 掀起你的盖头来——初识Android 1.1 认识Android 1.2 Android的背景 1.2.1 Android的历史 1.2.2 Android的发展 1.3 我的Android我做主 1.3.1 开发基于Android平台的应用 1.3.2 参加Android开发者大赛 1.3.3 ...

    Google Android开发入门与实战的代码

    1章 掀起你的盖头来——初识Android. 1 1.1 认识Android 1 1.2 Android的背景 2 1.2.1 Android的历史 2 1.2.2 Android的发展 2 1.3 我的Android我做主 2 1.3.1 开发基于Android平台的应用 3 ...

    Android版植物大战僵尸

    Java源码,Android源码,植物大战僵尸  Android版植物大战僵尸源文件,内含技术文档,说明了实现细节。各个包的说明: ... ... 定义了很多boolean值用来开关游戏中各种流程;... 读取文本文件,确定怪物出场顺序。

    Aspose.PDF-for-Android-via-java:适用于Android的Aspose.PDF(通过Java示例)

    是PDF文档创建和处理组件,它使您的Android应用程序无需使用任何其他第三方应用程序即可读取,编写和处理PDF文档。 它还允许您创建表单并管理嵌入PDF文档中的表单字段。 目录 描述 一系列Java示例,可帮助您学习...

    Folioreader-Android

    FolioReader-Android是用Java和Kotlin编写的EPUB阅读器。 特征 自定义字体 自定义文字大小 主题/白天模式/夜间模式 文字突出显示 列出/编辑/删除突出显示 处理内部和外部链接 风景素描 剩余阅读时间/剩余...

    WX-master.zip

    实现根据TXT文本存储的微信账号,无需...手机新建一个phone.txt文档放在text文件夹下,文档里面每一行对应一个微信号就可以,你在WXAutoClickAccessibilityService里面第39行就是读取文档内容的代码,你可以自己修改的

Global site tag (gtag.js) - Google Analytics