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

《转载》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读取和保存GBK编码的TXT文档

    以下将详细介绍如何在Android中读取和保存GBK编码的TXT文档。 首先,我们需要了解GBK编码。GBK是GB2312的扩展,它包含了GB2312中的所有字符,并增加了许多其他汉字和符号,总计约20902个汉字。在Java和Android中,...

    android txt文件保存读取操作

    在Android平台上,对TXT文件进行保存和读取是常见的数据持久化操作,尤其适用于存储少量结构化的文本数据。本文将详细讲解如何在Android应用中实现TXT文件的保存和读取功能,以及涉及到的相关知识点。 首先,我们...

    Android读取TXT文件

    在Android平台上,开发人员经常需要处理各种文件,其中包括文本文件,如TXT文件。这些文件可能包含用户数据、日志信息或者其他应用程序需要解析的数据。本文将详细介绍如何在Android应用中读取TXT文件,并将其内容...

    android:读取word文档

    在Android平台上,读取Word文档是一项常见的需求,特别是在开发企业级应用或文件处理类应用时。这个主题主要涉及如何在Android环境下使用各种库和API来实现Word文档的读取功能。下面将详细介绍这一过程。 首先,...

    Android读取PPT、pptx文档

    这些文档通常用于展示和传达信息,而Android应用程序可能需要读取或显示这些内容。在这种情况下,Apache POI库是一个常用的解决方案,虽然它在Android上的应用可能面临一些挑战,比如界面渲染效果不佳。 Apache POI...

    Android读取并显示word文件的代码例子

    在Android平台上,开发人员...通过以上步骤,你可以在Android应用中实现读取和显示Word文档的功能,覆盖了从doc到docx的格式,并能正确处理图文混排的内容。实际开发中,可以根据需求进行调整,优化性能和用户体验。

    Android TXT阅读器 源代码

    而TXT阅读器作为最基础的文本阅读应用之一,其源代码的学习对于Android开发者来说,是深入理解Android系统、UI设计以及文件处理等方面的重要途径。本文将围绕"Android TXT阅读器"的源代码进行详细解析,探讨其实现的...

    AndroidTXT 文本阅读器源码.zip

    “AndroidTXT文本阅读器源码”是一个专门用于阅读TXT格式文本文件的应用程序,它允许用户在Android设备上方便地浏览和管理TXT文档。通过这个项目,我们可以学习到如何在Android平台上进行文本渲染、页面滚动、文件...

    Android 读取Doc 文件

    在Android平台上,由于原生系统并不支持直接读取Microsoft Office的DOC文件,因此开发者通常需要借助第三方库来实现这一功能。本主题的核心是利用Java的API和特定的库来处理DOC文档,以便在Android应用中展示或操作...

    android读取word文档

    在Android平台上,读取Word文档是一项常见...以上是关于Android平台读取.txt和Word文档的核心知识点,涵盖了文件访问、解析、查找和错误处理等多个方面。在实际开发中,应根据具体需求和项目规模进行适当的调整和优化。

    android调用系统内部打开word等文档

    在Android平台上,调用系统内置的应用程序来打开Word文档是一个常见的需求。这涉及到Android的Intent机制,通过Intent我们可以启动各种系统服务或者应用,包括查看、编辑文档等。下面将详细介绍如何实现这一功能。 ...

    android中poi生成word文档和excel文档

    总的来说,使用Apache POI在Android中生成Word和Excel文档涉及了多个步骤,包括数据读取、文件操作、文档结构构建以及格式化。这个过程需要对XML、Java I/O、Android文件系统权限管理和POI API有深入理解。开发者...

    Android应用源码之TXT文本阅读器源码-IT计算机-毕业设计.zip

    这篇文档将深入解析《Android应用源码之TXT文本阅读器源码》的开发细节,适合于正在学习Android应用开发的学生,尤其是那些准备进行毕业设计的同学。Android平台为开发者提供了丰富的API和工具,使得构建功能丰富的...

    Android解析并显示doc,docx,xls,xlsx文件

    `doc`是早期版本的Microsoft Word文档,而`docx`是基于XML的较新格式,包含文本、样式、图像等元素。`xls`是老版Excel表格文件,而`xlsx`同样是XML为基础的新格式,用于存储表格数据和格式。 要解析这些文件,我们...

    android对.txt文件中的数据查询,查询成功并写一条记录到另一个文档中

    在Android平台上,对`.txt`文件进行数据查询和记录写入是常见的操作,尤其是在处理文本日志、配置文件或者简单的数据存储时。本教程将详细讲解如何实现这一功能,涉及的主要知识点包括Android的文件系统操作、文件...

    安卓使用poi读取及修改word文档

    在Android平台上,通常我们会使用Java库来处理与Microsoft Office文档相关的任务,如读取和修改Word文档。Apache POI是一个广泛使用的开源库,它允许开发者用纯Java代码操作微软的Office格式,包括Word(.doc)、...

    安卓使用poi XWPFDocument读取及修改word文档

    在本场景中,我们将重点讨论如何在Android应用中使用Apache POI的XWPFDocument类来读取和修改Word(.docx)文档。 1. **Apache POI介绍** Apache POI是一个开源项目,主要目的是使Java开发者能够读写Microsoft ...

    AndroidTXT-文本阅读器源码.zip

    1. **Android SDK**:所有Android应用都基于Android SDK,它包含了开发Android应用所需的工具、库和API文档。开发者需要熟悉Java或Kotlin编程语言,并了解如何在Android Studio环境下构建项目。 2. **Activity和...

    AndroidTXT 文本阅读器源码-IT计算机-毕业设计.zip

    《AndroidTXT文本阅读器源码解析与学习指南》 在当今信息化时代,移动设备上的应用程序已经成为我们生活的重要组成部分。对于IT计算机专业的学生来说,毕业设计是提升技能、展示能力的关键环节。本文将深入剖析...

Global site tag (gtag.js) - Google Analytics