您的位置:首页 > 移动开发 > Android开发

Android读取txt信息思路及Demo<软件工程作业一>

2014-09-29 09:49 253 查看
Android读取txt文件,首先要想好读取哪个地方的txt文件,可供选择的有SD卡上的txt文件,还有开发中的txt文件。前者明显要复杂许多,添加权限,寻找文件位置,将文件以流的形式读取出来等等。而后者只需要将文件的位置找到即可。

我们这里重点讲讲前者,后者会一笔带过。

现在我们要讲讲通用步骤:

public static String getString(InputStream inputStream){
InputStreamReader inputStreamReader = null;

inputStreamReader = new InputStreamReader(inputStream);

BufferedReader reader = new BufferedReader(inputStreamReader);

StringBuffer sb = new StringBuffer();
String line;

try {
while((line=reader.readLine())!=null){
sb.append(line+"\n");
}
} catch (IOException e) {
e.printStackTrace();
}

return sb.toString();
}
以上代码是为了将inputStream转化成我们要得到的txt文件中真正的内容。这里之所以使用InputStreamReader是因为它是字节流通向字符流的桥梁。InputStream的作用是标志那些从不同数据起源产生输入的类。这些数据起源包括(每个都有一个相关的InputStream子类):

(1) 字节说组

(2) String对象

(3) 文件

(4) “管道”,它的工作原理与现实生活中的管道类似:将一些东西一端置入,它们在另一端输出。

(5) 一个由其他种类的流组成的序列,以便我们将其统一收集合并到一个流内。

(6) 其他数据集,如Internet连接等。

而显然我们需要读取的txt文件属于文件类型的,所以我们使用FileInputStream类,既然用到了FileInputStream那么我们就得考虑用File,而这个File的路径就得考虑两种方案了

我们这里主要讨论SD卡上的方案。代码如下
package com.read.txt;

import java.io.File;
import java.util.ArrayList;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.TextView;
import android.widget.Toast;

import com.read.txt.FileChooserAdapter.FileInfo;
import com.readtxt.R;

public class FileChooserActivity extends Activity {

private GridView mGridView;
private View mBackView;
private View mBtExit;
private TextView mTvPath ;

private String mSdcardRootPath ;  //sdcard 根路径
private String mLastFilePath ;    //当前显示的路径

private ArrayList<FileInfo> mFileLists  ;
private FileChooserAdapter mAdatper ;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.filechooser_show);

mSdcardRootPath = Environment.getExternalStorageDirectory().getAbsolutePath();

mBackView = findViewById(R.id.imgBackFolder);
mBackView.setOnClickListener(mClickListener);
mBtExit = findViewById(R.id.btExit);
mBtExit.setOnClickListener(mClickListener);

mTvPath = (TextView)findViewById(R.id.tvPath);

mGridView = (GridView)findViewById(R.id.gvFileChooser);
mGridView.setEmptyView(findViewById(R.id.tvEmptyHint));
mGridView.setOnItemClickListener(mItemClickListener);
setGridViewAdapter(mSdcardRootPath);
}
//配置适配器
private void setGridViewAdapter(String filePath) {
updateFileItems(filePath);
mAdatper = new FileChooserAdapter(this , mFileLists);
mGridView.setAdapter(mAdatper);
}
//根据路径更新数据,并且通知Adatper数据改变
private void updateFileItems(String filePath) {
mLastFilePath = filePath ;
mTvPath.setText(mLastFilePath);

if(mFileLists == null)
mFileLists = new ArrayList<FileInfo>() ;
if(!mFileLists.isEmpty())
mFileLists.clear() ;

File[] files = folderScan(filePath);
if(files == null)
return ;

for (int i = 0; i < files.length; i++) {
if(files[i].isHidden())  // 不显示隐藏文件
continue ;

String fileAbsolutePath = files[i].getAbsolutePath() ;
String fileName = files[i].getName();
boolean isDirectory = false ;
if (files[i].isDirectory()){
isDirectory = true ;
}
FileInfo fileInfo = new FileInfo(fileAbsolutePath , fileName , isDirectory) ;
mFileLists.add(fileInfo);
}
//When first enter , the object of mAdatper don't initialized
if(mAdatper != null)
mAdatper.notifyDataSetChanged();  //重新刷新
}
//获得当前路径的所有文件
private File[] folderScan(String path) {
File file = new File(path);
File[] files = file.listFiles();
return files;
}

private View.OnClickListener mClickListener = new  OnClickListener() {
public void onClick(View v) {
switch (v.getId()) {
case R.id.imgBackFolder:
backProcess();
break;
case R.id.btExit :
setResult(RESULT_CANCELED);
finish();
break ;
default :
break ;
}
}
};

private AdapterView.OnItemClickListener mItemClickListener = new OnItemClickListener() {
public void onItemClick(AdapterView<?> adapterView, View view, int position,
long id) {
FileInfo fileInfo = (FileInfo)(((FileChooserAdapter)adapterView.getAdapter()).getItem(position));
if(fileInfo.isDirectory())   //点击项为文件夹, 显示该文件夹下所有文件
updateFileItems(fileInfo.getFilePath()) ;
else if(fileInfo.isTXTFile()){  //是ppt文件 , 则将该路径通知给调用者
Intent intent = new Intent();
intent.putExtra(MainActivity.EXTRA_FILE_CHOOSER , fileInfo.getFilePath());
setResult(RESULT_OK , intent);
finish();
}
else {   //其他文件.....
toast("格式错误,请选择。txt文件");
}
}
};

public boolean onKeyDown(int keyCode , KeyEvent event){
if(event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode()
== KeyEvent.KEYCODE_BACK){
backProcess();
return true ;
}
return super.onKeyDown(keyCode, event);
}
//返回上一层目录的操作
public void backProcess(){
//判断当前路径是不是sdcard路径 , 如果不是,则返回到上一层。
if (!mLastFilePath.equals(mSdcardRootPath)) {
File thisFile = new File(mLastFilePath);
String parentFilePath = thisFile.getParent();
updateFileItems(parentFilePath);
}
else {   //是sdcard路径 ,直接结束
setResult(RESULT_CANCELED);
finish();
}
}
private void toast(CharSequence hint){
Toast.makeText(this, hint , Toast.LENGTH_SHORT).show();
}
}

package com.read.txt;

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.readtxt.R;

public class FileChooserAdapter extends BaseAdapter {

private ArrayList<FileInfo> mFileLists;
private LayoutInflater mLayoutInflater = null;

private static ArrayList<String> PPT_FORMAT = new ArrayList<String>();
private static ArrayList<String> WORD_FORMAT = new ArrayList<String>();
private static ArrayList<String> EXCEL_FORMAT = new ArrayList<String>();
private static ArrayList<String> TXT_FORMAT = new ArrayList<String>();
static {
PPT_FORMAT.add(".ppt");
PPT_FORMAT.add(".pptx");
WORD_FORMAT.add(".docs");
WORD_FORMAT.add(".doc");
WORD_FORMAT.add(".docx");
EXCEL_FORMAT.add(".xls");
EXCEL_FORMAT.add(".xlsx");
EXCEL_FORMAT.add(".xps");
TXT_FORMAT.add(".txt");
}

public FileChooserAdapter(Context context, ArrayList<FileInfo> fileLists) {
super();
mFileLists = fileLists;
mLayoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return mFileLists.size();
}

@Override
public FileInfo getItem(int position) {
// TODO Auto-generated method stub
return mFileLists.get(position);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View view = null;
ViewHolder holder = null;
if (convertView == null || convertView.getTag() == null) {
view = mLayoutInflater.inflate(R.layout.filechooser_gridview_item,
null);
holder = new ViewHolder(view);
view.setTag(holder);
} else {
view = convertView;
holder = (ViewHolder) convertView.getTag();
}

FileInfo fileInfo = getItem(position);
//TODO

holder.tvFileName.setText(fileInfo.getFileName());

if(fileInfo.isDirectory()){      //文件夹
holder.imgFileIcon.setImageResource(R.drawable.ic_folder);
holder.tvFileName.setTextColor(Color.GRAY);
}
else if(fileInfo.isPPTFile()){   //PPT文件
holder.imgFileIcon.setImageResource(R.drawable.ic_ppt);
holder.tvFileName.setTextColor(Color.RED);
}
else if(fileInfo.isWORDFile()){	//WORD文件
holder.imgFileIcon.setImageResource(R.drawable.ic_word);
holder.tvFileName.setTextColor(Color.BLUE);
}
else if(fileInfo.isEXCELFile()){
holder.imgFileIcon.setImageResource(R.drawable.ic_excel);
holder.tvFileName.setTextColor(Color.GREEN);
}
else if(fileInfo.isTXTFile()){                           //TXT文件
holder.imgFileIcon.setImageResource(R.drawable.ic_launcher);
holder.tvFileName.setTextColor(Color.GRAY);
}
else {                           //未知文件
holder.imgFileIcon.setImageResource(R.drawable.ic_file_unknown);
holder.tvFileName.setTextColor(Color.GRAY);
}
return view;
}

static class ViewHolder {
ImageView imgFileIcon;
TextView tvFileName;

public ViewHolder(View view) {
imgFileIcon = (ImageView) view.findViewById(R.id.imgFileIcon);
tvFileName = (TextView) view.findViewById(R.id.tvFileName);
}
}

enum FileType {
FILE , DIRECTORY;
}

// =========================
// Model
// =========================
static class FileInfo {
private FileType fileType;
private String fileName;
private String filePath;

public FileInfo(String filePath, String fileName, boolean isDirectory) {
this.filePath = filePath;
this.fileName = fileName;
fileType = isDirectory ? FileType.DIRECTORY : FileType.FILE;
}
//判断是否为PPT文件
public boolean isPPTFile(){
if(fileName.lastIndexOf(".") < 0)  //Don't have the suffix
return false ;
String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
if(!isDirectory() && PPT_FORMAT.contains(fileSuffix))
return true ;
else
return false ;
}
//判断是否为WORD文件
public boolean isWORDFile(){
if(fileName.lastIndexOf(".") < 0)  //Don't have the suffix
return false ;
String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
if(!isDirectory() && WORD_FORMAT.contains(fileSuffix))
return true ;
else
return false ;
}

public boolean isEXCELFile(){
if(fileName.lastIndexOf(".") < 0)  //Don't have the suffix
return false ;
String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
if(!isDirectory() && EXCEL_FORMAT.contains(fileSuffix))
return true ;
else
return false ;
}

public boolean isTXTFile(){
if(fileName.lastIndexOf(".") < 0)  //Don't have the suffix
return false ;
String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
if(!isDirectory() && TXT_FORMAT.contains(fileSuffix))
return true ;
else
return false ;
}

public boolean isDirectory(){
if(fileType == FileType.DIRECTORY)
return true ;
else
return false ;
}

public String getFileName() {
return fileName;
}

public void setFileName(String fileName) {
this.fileName = fileName;
}

public String getFilePath() {
return filePath;
}

public void setFilePath(String filePath) {
this.filePath = filePath;
}

@Override
public String toString() {
return "FileInfo [fileType=" + fileType + ", fileName=" + fileName
+ ", filePath=" + filePath + "]";
}
}

}
其实还有更多的方法获得SD卡上的路径,这里也不详细描述了。

那么问题来了,该怎么处理这个txt文件呢。我考虑到用一个简单的正则表达式来完成,先做了一个简单的Demo
package com.test.main;

import java.util.HashMap;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
private static String str = "if you want to know how much how我知道了123.12 5201314yanghandi";
private static String s = "\\w+";
public static void main(String[] args) {
Pattern pattern = Pattern.compile(s);

Matcher ma = pattern.matcher(str);
HashMap<String,Integer> mHashMap = new HashMap<String,Integer>();
while(ma.find()){
//	System.out.println(ma.group());
if(mHashMap.get(ma.group())!=null){
mHashMap.put(ma.group(), mHashMap.get(ma.group())+1);
}else{
mHashMap.put(ma.group(), 1);
}
}
Iterator<String> it = mHashMap.keySet().iterator();
while(it.hasNext())
{
String key = it.next();
System.out.println(key+" "+mHashMap.get(key));
}
}
}
也就是说基本的方法已经找到了,那么现在开始要考虑如何读取txt文件了。我们打开了一个选择文件的界面,同时要得到它的返回值,在原Activity中就会调用OnActivityResult方法,其中的intent参数就可以返回路径,获取路径时用String txtPath = data.getStringExtra(EXTRA_FILE_CHOOSER),即可得到txt文件的路径,然后这里就可以套用刚才那个Demo中的代码。

由于读取txt文件是一个比较耗时的过程,我将该处理过程放到了一个异步线程中处理。
另外,要求在老师的要求是计算出出现频率前10的单词,所以加上了一下代码
List<HashMap.Entry<String, Integer>> infoIds =
new ArrayList<HashMap.Entry<String, Integer>>(mHashMap.entrySet());

//排序
Collections.sort(infoIds, new Comparator<HashMap.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
//按value排序
return (o2.getValue() - o1.getValue());
//按key排序
// return (o1.getKey()).toString().compareTo(o2.getKey());
}
});

在循环时循环10次,即可得到需要的结果。
下面奉上该软件的截图、性能测试及源码:



打开界面,选择文件

选择我在SD卡中的一个txt文件,野性的呼唤(大概有41kb)







开始分析txt内容

获得结果,各个单词的出现频率




奉上源码和性能测试结果:

源代码及性能测试结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 源码