File:即常說的檔案(I/O)儲存方式,常用儲存大量的資料,但缺點就是更新資料將是一件困難的事情。
下面的程式簡單示範了如何讀寫應用資料檔案夾中的檔案。該程式的介面同樣簡單,只包含了兩個文本輸入框和兩個按鈕:其中第一組文字框和按鈕用於處理輸入;第二組文字框用於資料處理。其具體代碼如下:
package com.ye_yun_lin.filetest;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.PrintStream;import javax.security.auth.PrivateCredentialPermission;import android.os.Bundle;import android.R.integer;import android.app.Activity;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;public class MainActivity extends Activity {final String FILE_NAME = "MyData";private EditText editText1;private EditText editText2;private Button button1;private Button button2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);editText1=(EditText)findViewById(R.id.edittext1);button1=(Button)findViewById(R.id.button1);editText2=(EditText)findViewById(R.id.edittext2);button2=(Button)findViewById(R.id.button2);button1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {write(editText1.getText().toString());editText1.setText("");}});button2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {editText2.setText(read());}});}private String read(){try {FileInputStream fileInputStream=openFileInput(FILE_NAME);byte[] buff=new byte[1024];int hasRead=0;StringBuilder sBuilder=new StringBuilder("");while ((hasRead=fileInputStream.read(buff))>0) {sBuilder.append(new String(buff,0,hasRead));}fileInputStream.close();return sBuilder.toString();} catch (Exception e) {e.printStackTrace();}return null;}private void write(String content){try {FileOutputStream fileOutputStream=openFileOutput(FILE_NAME, MODE_APPEND);PrintStream printStream=new PrintStream(fileOutputStream);printStream.println(content);printStream.close();} catch (Exception e) {e.printStackTrace();}}}
執行個體:SD卡檔案瀏覽器:
當程式啟動時,系統擷取/mnt/sdcard目錄下的全部檔案、檔案夾,並使用ListView將他們顯示出來;當使用者單擊ListView的指定列表時,系統將會顯示該列表下全部檔案夾和檔案。
該程式的介面布局檔案如下:
主代碼:
package com.ye_yun_lin.sdcard;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.os.Bundle;import android.R.integer;import android.app.Activity;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.Button;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity {private TextView textView;private ListView listView;private Button button;private File currentParent;private File[] currentFiles;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView=(TextView)findViewById(R.id.path);listView=(ListView)findViewById(R.id.list);button=(Button)findViewById(R.id.parent);File root=new File("/mnt/sdcard/");if(root.exists()){currentParent=root;currentFiles=root.listFiles();inflateListView(currentFiles);}listView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView parent, View view, int position,long id) {if(currentFiles[position].isFile())return;File[] tmp=currentFiles[position].listFiles();if(tmp==null || tmp.length==0){Toast.makeText(MainActivity.this, "當前路徑不可訪問或該路徑下沒有檔案", Toast.LENGTH_SHORT);}else{currentParent=currentFiles[position];currentFiles=tmp;inflateListView(currentFiles);}}});button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {try {if (!currentParent.getCanonicalPath().equals("/mnt/sdcard")) {currentParent=currentParent.getParentFile();currentFiles=currentParent.listFiles();inflateListView(currentFiles);}} catch (IOException e) {e.printStackTrace();}}});}private void inflateListView(File[] files){List> listItemsListView=new ArrayList>();for(int i=0;i listItemMap=new HashMap();if(files[i].isDirectory()){listItemMap.put("icon", R.drawable.folder);}else{listItemMap.put("icon", R.drawable.file);}listItemMap.put("fileName", files[i].getName());listItemsListView.add(listItemMap);}SimpleAdapter simpleAdapter=new SimpleAdapter(this,listItemsListView,R.layout.line,new String[]{"icon","fileName"},new int[]{R.id.icon,R.id.file_name});listView.setAdapter(simpleAdapter);try {textView.setText("當前路徑為:"+currentParent.getCanonicalPath());} catch (IOException e) {e.printStackTrace();}}}