Android读取txt信息思路及Demo<软件工程作业一>
2014-09-29 09:49
253 查看
Android读取txt文件,首先要想好读取哪个地方的txt文件,可供选择的有SD卡上的txt文件,还有开发中的txt文件。前者明显要复杂许多,添加权限,寻找文件位置,将文件以流的形式读取出来等等。而后者只需要将文件的位置找到即可。
我们这里重点讲讲前者,后者会一笔带过。
现在我们要讲讲通用步骤:
(1) 字节说组
(2) String对象
(3) 文件
(4) “管道”,它的工作原理与现实生活中的管道类似:将一些东西一端置入,它们在另一端输出。
(5) 一个由其他种类的流组成的序列,以便我们将其统一收集合并到一个流内。
(6) 其他数据集,如Internet连接等。
而显然我们需要读取的txt文件属于文件类型的,所以我们使用FileInputStream类,既然用到了FileInputStream那么我们就得考虑用File,而这个File的路径就得考虑两种方案了
我们这里主要讨论SD卡上的方案。代码如下
那么问题来了,该怎么处理这个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内容
获得结果,各个单词的出现频率
源
奉上源码和性能测试结果:
源代码及性能测试结果
我们这里重点讲讲前者,后者会一笔带过。
现在我们要讲讲通用步骤:
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开发工具——ADB(Android Debug Bridge) <一>概览
- Android 学习意外第五季<1>——gps定位经纬度查询地址信息
- 获取手机信息<uses-permission android:name="android.permission.READ_PHONE_STATE" />
- Android软件开发之获取通讯录联系人信息 + android联系人信息的存储结构 + Android联系人读取操作笔记
- Android 读取<meta-data>元素的数据
- android基础学习<一>--->五大布局对象Framelayout,Linearlayout,Relativelayout,Tablelayout,AbsoluteLayout
- 从Flash或者Flex的<object>或<embed>读取配置信息FlashVars
- Asp.net读取AD域信息的方法<转>
- Android GPS架构分析<一>
- Asp.net读取AD域信息的方法<转>
- XAF 如何扩展应用程序模型(How to: Extend the Application Model )<一> ListView显示页脚信息
- Android 读取<meta-data>元素的数据
- . <WP7>读取工程中的一个文件内容
- Android: Git/Gerrit/Repo 的使用 <一>
- cocos2d-x基础<一> Android环境配置和HelloWorld的运行
- Android开发收集<一>
- Android开发工具——ADB(Android Debug Bridge) <一>概览
- 短信猫软件的实现(C#)<一>熟悉串口
- Android学习笔记:<一>Android 四大组件
- loadrunner---<一>---如何建立工程目录