Android 简单统计文本文件字符数、单词数、行数Demo

做的demo是统计文本文件的字符数、单词数、行数的,首先呢,我们必须要有一个文本文件。所以我们要么创建一个文本文件,并保存,然后再解析;要么就提前把文本文件先放到模拟器上,然后检索到文本名再进行解析。我感觉第二种方法不可行,因为要测试时,肯定要多次测试,每次还要找到文件再修改文件内容,过于麻烦。所以我用的第一种方法,文件内容更改后直接保存即可。

首先是 页面布局:

<LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="com.example.demo.MainActivity">

<TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="文件名称:"        android:textSize="15dp"/>    <EditText        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/et_name"/>    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="文件内容:"        android:textSize="15dp"/>

<!--android:inputType="textMultiLine" 设置EditText可以多行输入,没有这句话也能正常运行-->    <EditText        android:inputType="textMultiLine"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/et_content"/>    <LinearLayout        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:orientation="horizontal">        <Button            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:id="@+id/btn_write"            android:text="保存"/>        <Button            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:id="@+id/btn_analysis"            android:text="解析"/>    </LinearLayout>    <TextView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/tv_read"        android:textSize="20dp"/></LinearLayout>

我是用手Android手机模拟程序的,文件保存到SD卡中,有兴趣的同学可以试试其他方法,所以我们还要在AndroidManifest.xml里加入以下权限:

    <!-- SD卡中创建和删除文件的权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!-- 向SD卡写入数据的权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 从SD读取数据权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Java代码:

保存文件部分:

要判断SD卡是否存在,是否具有读写权限,获得SD卡存储目录,保存文件,内容。

//创建文件,保存输入内容。
    private void write() {
        String filename=et_name.getText().toString();
        String filecontent=et_content.getText().toString();
        try {
            if (Environment.getExternalStorageState().equals
                    (Environment.MEDIA_MOUNTED)) {//表明对象是否存在并具有读、写权限
                //返回 File ,获取外部存储目录即 SDCard
                File sdCardDir = Environment.getExternalStorageDirectory();
                FileOutputStream fos = new FileOutputStream(sdCardDir.getCanonicalPath()
                        + "/"+filename+".txt");//getCanonicalPath()返回的是规范化的绝对路径
                fos.write(filecontent.getBytes("UTF-8"));
                fos.close();//关闭输出流
                Toast.makeText(this, "数据保存到"+filename+".txt"+"文件中了", Toast.LENGTH_SHORT).show();
            }else {
                Toast.makeText(this, "未找到SD卡", Toast.LENGTH_SHORT).show();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

解析部分:

同样要先判断SD卡是否存在,是否具有读写权限,再判断是否存在该文件,按行读取文件并解析,自加得出结果。

//解析字符数,单词数,行数,空格数
    private void analysis() {
        String str="";

        int words = 0;//单词数
        int chars = 0;//字符数
        int lines = 0;//行数
        int spaces=0;//空格数
        int marks=0;//标点符号数
        int character=0;//字母数

        String filename=et_name.getText().toString();
        FileInputStream fis=null;
        BufferedReader br=null;
        try {
            //判断SD卡是否存在,并且是否具有读写权限
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                File file = new File(Environment.getExternalStorageDirectory().getCanonicalPath() + "/"+filename+".txt");
                if (file.exists()){//判断文件是否存在
                    //打开文件输入流
                    fis=new FileInputStream(file);
                    //字符流写入了缓冲区
                    br=new BufferedReader(new InputStreamReader(fis));

                    while((str=br.readLine())!=null){//readLine()每次读取一行,转化为字符串,br.readLine()为null时,不执行

                        char[] b=str.toCharArray();//将字符串对象中的字符转换为一个字符数组
                        for (int i = 0; i < str.length(); i++) {
                            if (b[i]==‘ ‘){//如果字符数组中包含空格,spaces自加1
                                spaces++;//空格数
                            }else if (b[i]==‘,‘||b[i]==‘.‘){
                                marks++;

                            }
                        }

                        //单词数,split()方法,返回是一个数组,根据(空格,标点符号)分割成字符串数组,数组长度就是单词长度。
                        words+=str.split("[ \\.,]").length;//使用正则表达式实现多个分隔符进行分隔的效果。

                        chars+=str.length();//字符串的长度,即字符数,包括英文字母数+空格数+标点数
                        lines++;//行数(由于每次读取一行,行数自加即可)
                    }
                    character=chars-(spaces+marks);//字母数=字符数-空格数-标点数
                    //关闭文件
                    br.close();

                    tv_read.setText("单词数:"+words+",字符数:"+chars+",行数:"+lines+",字母数:"+character+",空格数:"+spaces+",标点符号数:"+marks);
                }
                else {
                    Toast.makeText(this, "不存在该文件", Toast.LENGTH_SHORT).show();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

最后看看运算结果:

全文代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText et_name;
    private EditText et_content;
    private Button btn_write;
    private Button btn_analysis;
    private TextView tv_read;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        initView();
    }

    private void initView() {
        et_name = (EditText) findViewById(R.id.et_name);
        et_content = (EditText) findViewById(R.id.et_content);
        btn_write = (Button) findViewById(R.id.btn_write);
        btn_analysis = (Button) findViewById(R.id.btn_analysis);
        tv_read = (TextView) findViewById(R.id.tv_read);

        btn_write.setOnClickListener(this);
        btn_analysis.setOnClickListener(this);
    }

    //点击事件
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_write:
                write();
                btn_analysis.setClickable(true);
                break;
            case R.id.btn_analysis:
                analysis();
                break;
        }
    }

    //创建文件,保存输入内容。
    private void write() {
        String filename=et_name.getText().toString();
        String filecontent=et_content.getText().toString();
        try {
            if (Environment.getExternalStorageState().equals
                    (Environment.MEDIA_MOUNTED)) {//表明对象是否存在并具有读、写权限
                //返回 File ,获取外部存储目录即 SDCard
                File sdCardDir = Environment.getExternalStorageDirectory();
                FileOutputStream fos = new FileOutputStream(sdCardDir.getCanonicalPath()
                        + "/"+filename+".txt");//getCanonicalPath()返回的是规范化的绝对路径
                fos.write(filecontent.getBytes("UTF-8"));
                fos.close();//关闭输出流
                Toast.makeText(this, "数据保存到"+filename+".txt"+"文件中了", Toast.LENGTH_SHORT).show();
            }else {
                Toast.makeText(this, "未找到SD卡", Toast.LENGTH_SHORT).show();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    //解析字符数,单词数,行数,空格数
    private void analysis() {
        String str="";

        int words = 0;//单词数
        int chars = 0;//字符数
        int lines = 0;//行数
        int spaces=0;//空格数
        int marks=0;//标点符号数
        int character=0;//字母数

        String filename=et_name.getText().toString();
        FileInputStream fis=null;
        BufferedReader br=null;
        try {
            //判断SD卡是否存在,并且是否具有读写权限
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                File file = new File(Environment.getExternalStorageDirectory().getCanonicalPath() + "/"+filename+".txt");
                if (file.exists()){//判断文件是否存在
                    //打开文件输入流
                    fis=new FileInputStream(file);
                    //字符流写入了缓冲区
                    br=new BufferedReader(new InputStreamReader(fis));

                    while((str=br.readLine())!=null){//readLine()每次读取一行,转化为字符串,br.readLine()为null时,不执行

                        char[] b=str.toCharArray();//将字符串对象中的字符转换为一个字符数组
                        for (int i = 0; i < str.length(); i++) {
                            if (b[i]==‘ ‘){//如果字符数组中包含空格,spaces自加1
                                spaces++;//空格数
                            }else if (b[i]==‘,‘||b[i]==‘.‘){
                                marks++;

                            }
                        }

                        //单词数,split()方法,返回是一个数组,根据(空格,标点符号)分割成字符串数组,数组长度就是单词长度。
                        words+=str.split("[ \\.,]").length;//使用正则表达式实现多个分隔符进行分隔的效果。

                        chars+=str.length();//字符串的长度,即字符数,包括英文字母数+空格数+标点数
                        lines++;//行数(由于每次读取一行,行数自加即可)
                    }
                    character=chars-(spaces+marks);//字母数=字符数-空格数-标点数
                    //关闭文件
                    br.close();

                    tv_read.setText("单词数:"+words+",字符数:"+chars+",行数:"+lines+",字母数:"+character+",空格数:"+spaces+",标点符号数:"+marks);
                }
                else {
                    Toast.makeText(this, "不存在该文件", Toast.LENGTH_SHORT).show();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

知识浅薄,如有错误,还望指出。

个人项目耗时记录

时间: 2024-10-19 06:36:23

Android 简单统计文本文件字符数、单词数、行数Demo的相关文章

C++统计代码注释行数 &amp; 有效代码行数 &amp; 代码注释公共行 &amp; 函数个数

问题来源,在14年的暑假的一次小项目当中遇到了一个这样的问题,要求统计C++代码的注释行数,有效代码行数,代码注释公共行数,以及函数个数. 下面稍微解释一下问题, 1)注释行数:指有注释的行,包括有代码和注释的公共行(如:3,4,15,22...) 2)有效代码行:指有代码的行,包括有代码和注释的公共行(如:1,4,11,15,25....) 3)代码注释公共行:指又有代码又有注释的行(如:4,15...) 4)函数个数:这个不用说明了吧. 以下为注释情况展示代码: 1 #include <st

【原】Mac下统计任意文件夹中代码行数的工具——cloc

这里介绍一个Mac系统统计代码行数的工具cloc. 1.首先,安装homebrew,已安装的请跳过. 打开终端工具Terminal,输入下列命令.过程中会让你按RETURN键以及输入mac桌面密码,按照提示进行操作即可: ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 2.利用homebrew下载并安装cloc. 继续在Terminal中输入: brew

iOS 统计Xcode整个工程的代码行数

小技巧5-iOS 统计Xcode整个工程的代码行数 1.打开终端 2.cd 空格 将工程的文件夹拖到终端上,回车,此时进入到工程的路径 此时已经进入到工程文件夹下 3.运行指令 a. find . -name "*.m" -or -name "*.h" -or -name "*.xib" -or -name "*.c" |xargs wc -l [最后一个字母是L不是数字1] 回车,执行--这条指令是获取每个文件内的代码行数,

python 脚本(获取指定文件夹、指定文件格式、的代码行数、注释行数)

1.代码的运行结果: 获取 指定文件夹下.指定文件格式 文件的: 总代码行数.总注释行数(需指定注释格式).总空行数: 1 #coding: utf-8 2 import os, re 3 4 # 代码所在目录 5 FILE_PATH = './' 6 7 def analyze_code(codefilesource): 8 ''' 9 打开一个py文件,统计其中的代码行数,包括空行和注释 10 返回含该文件总行数,注释行数,空行数的列表 11 ''' 12 total_line = 0 13

[SQL]597(表2行数/表1行数)+602(表的上下拼接)

597. 好友申请 I :总体通过率 思路: 统计申请表中的不重复行数,记为表A (SELECT COUNT(*) FROM (SELECT DISTINCT sender_id, send_to_id FROM friend_request) A) 统计接受表中的不重复行数,记为表B (SELECT COUNT(*) FROM (SELECT DISTINCT requester_id, accepter_id FROM request_accepted) B) 表B结果/表A结果,IFNUL

关于wc.exe程序处理文件字符,单词数,行数

Gitee项目地址:https://gitee.com/xiecangxing/wc.git 本项目我只实现了基本功能,也就是文件的字符总数,单词总数,以及行数的计算,以及输出至哪个文件 并且直接使用C#语言进行编写 整个项目我集中在一个主类和一个主方法当中 以及十个方法,分别完成相应的任务,较为符合单一原则分别为 1.CheckFileName(string fileName) 检查文件名是否正确 2.CheckCommand(string command) 检查命令符是否正确 3.charC

c - 统计字符串&quot;字母,空格,数字,其他字符&quot;的个数和行数.

1 #include <stdio.h> 2 #include <ctype.h> 3 4 using namespace std; 5 6 /* 7 题目:输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数. 8 */ 9 10 void 11 count() { 12 //统计个数. 13 int letters = 0; 14 int spaces = 0; 15 int digit = 0; 16 int others = 0; 17 char curChar

统计文本文件字符(C语言)

统计txt文件中字符数.单词数.行数 主体思路 利用c的命令行参数传递用户指令 if(argc < 3) { printf("Usage ./wc.exe [-c] [-w] [-l] FILE [-o] Outfile"); exit(0); } for(int count = 1; count < argc; count++) { //判断必需参数 if(!strcmp(argv[count], "-c")) { c = 1; //Method1 }

统计Eclipse中项目的总代码行数

在Eclipse中写Android项目,想要统计项目中写了多少行代码(大概数字,因为代码中还是有很多空白行的),怎么统计呢?把一个个代码文件有多少行先记下来,然后再加起来显然很费心费神,那怎么办呢?可以用Eclipse的文件搜索功能来统计. 步骤如下: 1.只选中项目中所有自己写的代码的目录(按住Ctrl连续选中),因为项目中还是有很多自动生成和第三方库的代码的,这些不能算到总代码行数中去.如下图所示,这里主要选择了src.layout.values这三个目录和AndroidManifest.x