主要实现的是获取本地文件夹,读取txt和csv文件
apk: http://fir.im/h1qa
我是站在巨人的肩膀上,有前辈已经把获取手机文件的写成一个类,直接调用即可,在此表示感谢
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import android.os.Environment; /** * 用于获取手机的文件夹及文件的工具类,如果权限允许,可以获取手机上任意路径的文件列表 * GetFilesUtils使用的是懒汉式单例模式,线程安全 *@since 2016/1/19. */ public class GetFilesUtils { public static final String FILE_TYPE_FOLDER="wFl2d"; public static final String FILE_INFO_NAME="fName"; public static final String FILE_INFO_ISFOLDER="fIsDir"; public static final String FILE_INFO_TYPE="fFileType"; public static final String FILE_INFO_NUM_SONDIRS="fSonDirs"; public static final String FILE_INFO_NUM_SONFILES="fSonFiles"; public static final String FILE_INFO_PATH="fPath"; private static GetFilesUtils gfu; private GetFilesUtils(){ } /** * 获取GetFilesUtils实例 * @return GetFilesUtils **/ public static synchronized GetFilesUtils getInstance(){ if(gfu==null){ gfu=new GetFilesUtils(); } return gfu; } /** * 获取文件path文件夹下的文件列表 * @see #getSonNode(String) * @param path 手机上的文件夹 * @return path文件夹下的文件列表的信息,信息存储在Map中,Map的key的列表如下:<br /> * FILE_INFO_NAME : String 文件名称 <br /> * FILE_INFO_ISFOLDER: boolean 是否为文件夹 <br /> * FILE_INFO_TYPE: string 文件的后缀 <br /> * FILE_INFO_NUM_SONDIRS : int 子文件夹个数 <br /> * FILE_INFO_NUM_SONFILES: int 子文件个数 <br /> * FILE_INFO_PATH : String 文件的绝对路径 <br /> **/ public List<Map<String, Object>> getSonNode(File path){ if(path.isDirectory()){ List<Map<String, Object>> list=new ArrayList<Map<String,Object>>(); File[] files=path.listFiles(); if(files!=null){ for(int i=0;i<files.length;i++){ Map<String, Object> fileInfo=new HashMap<String, Object>(); fileInfo.put(FILE_INFO_NAME, files[i].getName()); if(files[i].isDirectory()){ fileInfo.put(FILE_INFO_ISFOLDER, true); File[] bFiles=files[i].listFiles(); if(bFiles==null){ fileInfo.put(FILE_INFO_NUM_SONDIRS, 0); fileInfo.put(FILE_INFO_NUM_SONFILES, 0); }else{ int getNumOfDir=0; for(int j=0;j<bFiles.length;j++){ if(bFiles[j].isDirectory()){ getNumOfDir++; } } fileInfo.put(FILE_INFO_NUM_SONDIRS, getNumOfDir); fileInfo.put(FILE_INFO_NUM_SONFILES, bFiles.length-getNumOfDir); } fileInfo.put(FILE_INFO_TYPE, FILE_TYPE_FOLDER); }else{ fileInfo.put(FILE_INFO_ISFOLDER, false); fileInfo.put(FILE_INFO_NUM_SONDIRS, 0); fileInfo.put(FILE_INFO_NUM_SONFILES, 0); fileInfo.put(FILE_INFO_TYPE, getFileType(files[i].getName())); } fileInfo.put(FILE_INFO_PATH, files[i].getAbsoluteFile()); list.add(fileInfo); } return list; }else{ return null; } }else{ return null; } } /** * 获取文件pathStr文件夹下的文件列表 * @see #getSonNode(File) * @param pathStr 手机上的文件夹的绝对路径 * @return pathStr文件夹下的文件列表的信息,信息存储在Map中,Map的key的列表如下:<br /> * FILE_INFO_NAME : String 文件名称 <br /> * FILE_INFO_ISFOLDER: boolean 是否为文件夹 <br /> * FILE_INFO_TYPE: string 文件的后缀 <br /> * FILE_INFO_NUM_SONDIRS : int 子文件夹个数 <br /> * FILE_INFO_NUM_SONFILES: int 子文件个数 <br /> * FILE_INFO_PATH : String 文件的绝对路径 <br /> **/ public List<Map<String, Object>> getSonNode(String pathStr){ File path=new File(pathStr); return getSonNode(path); } /** * 获取文件path文件或文件夹的兄弟节点文件列表 * @see #getBrotherNode(String) * @param path 手机上的文件夹 * @return path文件夹下的文件列表的信息,信息存储在Map中,Map的key的列表如下:<br /> * FILE_INFO_NAME : String 文件名称 <br /> * FILE_INFO_ISFOLDER: boolean 是否为文件夹 <br /> * FILE_INFO_TYPE: string 文件的后缀 <br /> * FILE_INFO_NUM_SONDIRS : int 子文件夹个数 <br /> * FILE_INFO_NUM_SONFILES: int 子文件个数 <br /> * FILE_INFO_PATH : String 文件的绝对路径 <br /> **/ public List<Map<String, Object>> getBrotherNode(File path){ if(path.getParentFile()!=null){ return getSonNode(path.getParentFile()); }else{ return null; } } /** * 获取文件path文件或文件夹的兄弟节点文件列表 * @see #getBrotherNode(File) * @param path 手机上的文件夹 * @return path文件夹下的文件列表的信息,信息存储在Map中,Map的key的列表如下:<br /> * FILE_INFO_NAME : String 文件名称 <br /> * FILE_INFO_ISFOLDER: boolean 是否为文件夹 <br /> * FILE_INFO_TYPE: string 文件的后缀 <br /> * FILE_INFO_NUM_SONDIRS : int 子文件夹个数 <br /> * FILE_INFO_NUM_SONFILES: int 子文件个数 <br /> * FILE_INFO_PATH : String 文件的绝对路径 <br /> **/ public List<Map<String, Object>> getBrotherNode(String pathStr){ File path=new File(pathStr); return getBrotherNode(path); } /** * 获取文件或文件夹的父路径 * @param File path文件或者文件夹 * @return String path的父路径 **/ public String getParentPath(File path){ if(path.getParentFile()==null){ return null; }else{ return path.getParent(); } } /** * 获取文件或文件的父路径 * @param String pathStr文件或者文件夹路径 * @return String pathStr的父路径 **/ public String getParentPath(String pathStr){ File path=new File(pathStr); if(path.getParentFile()==null){ return null; }else{ return path.getParent(); } } /** * 获取sd卡的绝对路径 * @return String 如果sd卡存在,返回sd卡的绝对路径,否则返回null **/ public String getSDPath(){ String sdcard=Environment.getExternalStorageState(); if(sdcard.equals(Environment.MEDIA_MOUNTED)){ return Environment.getExternalStorageDirectory().getAbsolutePath(); }else{ return null; } } /** * 获取一个基本的路径,一般应用创建存放应用数据可以用到 * @return String 如果SD卡存在,返回SD卡的绝对路径,如果SD卡不存在,返回Android数据目录的绝对路径 **/ public String getBasePath(){ String basePath=getSDPath(); if(basePath==null){ return Environment.getDataDirectory().getAbsolutePath(); }else{ return basePath; } } /** * 获取文件path的大小 * @return String path的大小 **/ public String getFileSize(File path) throws IOException{ if(path.exists()){ DecimalFormat df = new DecimalFormat("#.00"); String sizeStr=""; FileInputStream fis=new FileInputStream(path); long size=fis.available(); fis.close(); if(size<1024){ sizeStr=size+"B"; }else if(size<1048576){ sizeStr=df.format(size/(double)1024)+"KB"; }else if(size<1073741824){ sizeStr=df.format(size/(double)1048576)+"MB"; }else{ sizeStr=df.format(size/(double)1073741824)+"GB"; } return sizeStr; }else{ return null; } } /** * 获取文件fpath的大小 * @return String path的大小 **/ public String getFileSize(String fpath){ File path=new File(fpath); if(path.exists()){ DecimalFormat df = new DecimalFormat("#.00"); String sizeStr=""; long size=0; try { FileInputStream fis = new FileInputStream(path); size=fis.available(); fis.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); return "未知大小"; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return "未知大小"; } if(size<1024){ sizeStr=size+"B"; }else if(size<1048576){ sizeStr=df.format(size/(double)1024)+"KB"; }else if(size<1073741824){ sizeStr=df.format(size/(double)1048576)+"MB"; }else{ sizeStr=df.format(size/(double)1073741824)+"GB"; } return sizeStr; }else{ return "未知大小"; } } /** * 根据后缀获取文件fileName的类型 * @return String 文件的类型 **/ public String getFileType(String fileName){ if(fileName!=""&&fileName.length()>3){ int dot=fileName.lastIndexOf("."); if(dot>0){ return fileName.substring(dot+1); }else{ return ""; } } return ""; } public Comparator<Map<String, Object>> defaultOrder() { final String orderBy0=FILE_INFO_ISFOLDER; final String orderBy1=FILE_INFO_TYPE; final String orderBy2=FILE_INFO_NAME; Comparator<Map<String, Object>> order=new Comparator<Map<String,Object>>() { @Override public int compare(Map<String, Object> lhs, Map<String, Object> rhs) { // TODO Auto-generated method stub int left0=lhs.get(orderBy0).equals(true)?0:1; int right0=rhs.get(orderBy0).equals(true)?0:1; if(left0==right0){ String left1=lhs.get(orderBy1).toString(); String right1=rhs.get(orderBy1).toString(); if(left1.compareTo(right1)==0){ String left2=lhs.get(orderBy2).toString(); String right2=rhs.get(orderBy2).toString(); return left2.compareTo(right2); }else{ return left1.compareTo(right1); } }else{ return left0-right0; } } }; return order; } }我是在此基础上,使用Fragment ,文件读取分两部分,一是文件夹获取,这是一个界面,而是文件内容的读取,这需要换一个界面,完全可以使用两个activity,在这俩之间传要读取的文件路径即可,我嫌要多一个activity,就使用 Fragment 来切换界面,然后在activity与Fragment 间传数据,使用的是回调的方式
由于功能简单,回调的方法就写了一个(就是java里的接口)
public interface FragmentCallBack { void showContent( StringBuffer sb); }主函数
import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; import android.view.KeyEvent; import android.view.View; import android.view.Menu; import android.view.MenuItem; import android.widget.AdapterView; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Timer; import java.util.TimerTask; public class MainActivity extends AppCompatActivity implements FragmentCallBack{ private ListView folderLv; //当前文件路径 private TextView foldernowTv; private static List<Map<String, Object>> aList; private String baseFile; private SimpleAdapter sAdapter; private static MessageFragment messageFragment; private static FloderFragment floderFragment; //当前frame退出时判断使用 private static Fragment currentFragment; private FragmentManager fragmentManager; private static FragmentTransaction fragmentTransaction; private static boolean isExit = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.content_main); /*FragmentManager*/ fragmentManager = getSupportFragmentManager(); messageFragment = new MessageFragment(); floderFragment =new FloderFragment(); fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); //由于当前的是activity,替换后,activity里的数据还是存在的,显示很乱,不是不可以把当前类换成frame fragmentTransaction.replace(R.id.relativelayout,floderFragment);//将fragment设置到布局上 currentFragment = floderFragment; fragmentTransaction.addToBackStack(null); fragmentTransaction.commitAllowingStateLoss(); } /*回调使用 */ public void showContent( StringBuffer sb){ Bundle data = new Bundle(); data.putString("TEXT", sb.toString()); messageFragment.setArguments(data);//通过Bundle向Activity中传递值 //由于当前的是activity,替换后,activity里的数据还是存在的,显示很乱,不是不可以把当前类换成frame /*这里要新建一个fragmentTransaction,要不会回调出错*/ FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); fragmentTransaction.replace(R.id.relativelayout, messageFragment);//将fragment设置到布局上 currentFragment = messageFragment; // 加入回退栈就可以实现按返回键退回到上一个fragment界面 fragmentTransaction.addToBackStack(null); fragmentTransaction.commitAllowingStateLoss(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } private void exit() { if(!isExit) { isExit = true; Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show(); new Timer().schedule(new TimerTask() { @Override public void run() { isExit = false; } }, 2000); } else { finish(); } } //监听返回键,2s内按两次退出 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { //当前是文件读取界面 if(currentFragment == messageFragment){ currentFragment = floderFragment; ////退回 文件夹 界面,不过界面是初始化时的样子,下面这两种方式一样的效果 getSupportFragmentManager().popBackStack(); // return super.onKeyDown(keyCode, event); }else { exit(); } } return false; } }这里继承了上面的回调方法,就是接口的实现类嘛,方法里实现的是更新当前布局为文件读取界面,把返回键重写了,按一次,如果当前界面是文件内容读取界面,就回到文件夹获取界面,如果是文件夹获取页面,2S 内按两次返回键退出
private void exit() { if(!isExit) { isExit = true; Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show(); new Timer().schedule(new TimerTask() { @Override public void run() { isExit = false; } }, 2000); } else { finish(); } }
mainactivity布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/textview_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:singleLine="true" android:text="文件列表" android:textColor="#0A0A0A" android:textSize="50sp" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <View android:layout_width="wrap_content" android:layout_height="1dp" android:background="@drawable/single_line" android:layout_below="@+id/textview_title" android:layout_alignParentLeft="true" android:id="@+id/view3" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:id="@+id/relativelayout" android:layout_alignTop="@+id/view3"></RelativeLayout> </RelativeLayout>读取文件夹的布局文件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="40dp" android:textColor="#0A0A0A" android:textSize="16sp" android:gravity="center_vertical" android:ellipsize="start" android:singleLine="true" android:drawableLeft="@drawable/go_back" android:paddingLeft="10dp" android:drawablePadding="10dp" android:id="@+id/folder_now" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <View android:layout_width="wrap_content" android:layout_height="1dp" android:background="@drawable/single_line" android:id="@+id/view2" android:layout_below="@+id/folder_now" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="110dp" android:layout_weight="6" android:divider="#ff111111" android:dividerHeight="2dp" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentBottom="true" android:layout_below="@+id/view2" /> </RelativeLayout>文件夹是使用list显示的,每一条记录显示的格式的布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:weightSum="1"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:id="@+id/folder_name" android:layout_gravity="center_horizontal" android:textColor="#0A0A0A" android:text="#0A0A0A" android:layout_marginLeft="66dp" android:layout_marginStart="66dp" android:layout_marginTop="25dp" android:layout_alignParentTop="true" android:layout_toRightOf="@+id/folder_img" android:layout_toEndOf="@+id/folder_img" /> <ImageView android:layout_width="105dp" android:layout_height="105dp" android:id="@+id/folder_img" android:layout_alignTop="@+id/folder_name" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:id="@+id/folder_info" android:textColor="#0A0A0A" android:text="#0A0A0A" android:layout_alignBottom="@+id/folder_img" android:layout_alignLeft="@+id/folder_name" android:layout_alignStart="@+id/folder_name" /> </RelativeLayout>有图片,有文件名,有文件的信息,反正这些数据上面的文件工具类都已经提供好了
读取文件的布局,数据显示在TextView里
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="文件内容" android:textColor="#000" android:textSize="60px" android:id="@+id/textView" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" /> <View android:layout_width="wrap_content" android:layout_height="1dp" android:background="@drawable/single_line" android:layout_below="@+id/textView" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:id="@+id/view" /> <TextView android:layout_width="600px" android:layout_height="wrap_content" android:text="New Text" android:id="@+id/message" android:textColor="#000" android:textSize="50px" android:maxLines="16" android:scrollbars="vertical" android:singleLine="false" android:layout_below="@+id/view" android:layout_centerHorizontal="true" android:layout_marginTop="34dp" /> </RelativeLayout>由于文件数据量不是一个页面就可以全部显示完的,所以TextView加了垂直滚动,看看文件读取messageFragment
public class MessageFragment extends Fragment { private TextView textView; public MessageFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.content_message, container, false); textView = (TextView)view.findViewById(R.id.message); /*TextView自滚动(垂直)*/ textView.setMovementMethod(ScrollingMovementMethod.getInstance()) ; //获取数据 Bundle data = getArguments();//获得从activity中传递过来的值 textView.setText(data.getString("TEXT")); return view ; } }读取文件夹的
import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by Administrator on 2016/1/20. */ public class FloderFragment extends Fragment { private ListView folderLv; //当前文件路径 private TextView foldernowTv; private static List<Map<String, Object>> aList; private String baseFile; private SimpleAdapter sAdapter; private static FragmentCallBack fragmentCallBack = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.content_floder, container, false); /*ListView*/ folderLv = (ListView) view.findViewById(R.id.listview); aList=new ArrayList<Map<String,Object>>(); sAdapter=new SimpleAdapter(getContext(), aList,R.layout.listitem_folder, new String[]{"fImg","fName","fInfo"}, new int[]{R.id.folder_img,R.id.folder_name,R.id.folder_info}); folderLv.setAdapter(sAdapter); folderLv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if(aList.get(position).get("fIsDir").equals(true)){ try { loadFolderList(aList.get(position).get("fPath").toString()); } catch (IOException e) { e.printStackTrace(); } }else{//打开文件之前判断一下 if(aList.get(position).get("fImg").equals(R.drawable.filetype_unknow)){ final int positi = position; new AlertDialog.Builder(getContext()) .setTitle("前方高能预警,强烈建议停止读取,确定要读取?") .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { readTxtFile(aList.get(positi).get("fPath").toString()); return; } }) .setNegativeButton("取消", null) .show(); }else { readTxtFile(aList.get(position).get("fPath").toString()); } } } }); baseFile=GetFilesUtils.getInstance().getBasePath(); foldernowTv=(TextView)view.findViewById(R.id.folder_now); foldernowTv.setText(baseFile); foldernowTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { String folder = GetFilesUtils.getInstance().getParentPath(foldernowTv.getText().toString()); if (folder == null) { Toast.makeText(getContext(), "无父目录", Toast.LENGTH_SHORT).show(); } else { loadFolderList(folder); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); return view ; } private void loadFolderList(String file) throws IOException{ List<Map<String, Object>> list=GetFilesUtils.getInstance().getSonNode(file); if(list!=null){ Collections.sort(list, GetFilesUtils.getInstance().defaultOrder()); aList.clear(); for(Map<String, Object> map:list){ String fileType=(String) map.get(GetFilesUtils.FILE_INFO_TYPE); Map<String,Object> gMap=new HashMap<String, Object>(); if(map.get(GetFilesUtils.FILE_INFO_ISFOLDER).equals(true)){ gMap.put("fIsDir", true); gMap.put("fImg",R.drawable.filetype_folder ); gMap.put("fInfo", map.get(GetFilesUtils.FILE_INFO_NUM_SONDIRS)+"个文件夹和"+ map.get(GetFilesUtils.FILE_INFO_NUM_SONFILES)+"个文件"); }else{ gMap.put("fIsDir", false); if(fileType.equals("txt")||fileType.equals("text")||fileType.equals("csv")){ gMap.put("fImg", R.drawable.filetype_text); }else{ gMap.put("fImg", R.drawable.filetype_unknow); } gMap.put("fInfo","文件大小:"+GetFilesUtils.getInstance().getFileSize(map.get(GetFilesUtils.FILE_INFO_PATH).toString())); } gMap.put("fName", map.get(GetFilesUtils.FILE_INFO_NAME)); gMap.put("fPath", map.get(GetFilesUtils.FILE_INFO_PATH)); aList.add(gMap); } }else{ aList.clear(); } sAdapter.notifyDataSetChanged(); foldernowTv.setText(file); } /** * 功能:Java读取txt文件的内容 * 步骤:1:先获得文件句柄 * 2:获得文件句柄当做是输入一个字节码流,需要对这个输入流进行读取 * 3:读取到输入流后,需要读取生成字节流 * 4:一行一行的输出。readline()。 * 备注:需要考虑的是异常情况 * @param filePath */ public static void readTxtFile(String filePath) { try { String encoding = "GBK"; StringBuffer sb = new StringBuffer(); File file = new File(filePath); if (file.isFile() && file.exists()) { //判断文件是否存在 InputStreamReader read = new InputStreamReader( new FileInputStream(file), encoding);//考虑到编码格式 BufferedReader bufferedReader = new BufferedReader(read); String lineTxt = null; while ((lineTxt = bufferedReader.readLine()) != null) { sb.append(lineTxt); // System.out.println(lineTxt); } //传数据到messagefragment //1 直接调用Activity中的方法 ,找不到,不知为何,可能不支持了吧 //2 回调 fragmentCallBack.showContent(sb); read.close(); } } catch (Exception e) { e.printStackTrace(); } } /**2 回调需要重写*/ @Override public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); fragmentCallBack = (MainActivity)activity; } }我把读取文件夹和读取文件都放在一个类里面实现,传送的数据是文件的内容,这样可能会有一些文件,就是当文件稍微有些大时,数据肯定会内存溢出,改进方案就是只传一个文件路径,读取文件的事放在MessageFragment 里去做
代码的流程是:当要读取文件内容时,使用回调函数,去显示文件信息
源码:http://download.csdn.net/detail/i_do_can/9415981