android文件存储数组,Android面试简录——文件存储
* SharedPreferences
請描述Android SDK支持哪些文件存儲技術?
1.SharedPreferences保存key-value類型的數(shù)據(jù)
2.流文件存儲(openFileOutput/openFileInput或FileInputStream/FileOutputStream)
3.XML半結構化存儲
4.用JSON保存數(shù)組和對象
5.用數(shù)據(jù)庫保存結構化數(shù)據(jù)
6.用第三方的面向對象數(shù)據(jù)庫直接保存Java對象
如何使用SharedPreferences存取key-value類型的數(shù)據(jù)?
1.Context.getSharedPreferences(參數(shù)1:存儲key-value的文件名稱,...) -> SharedPreferences對象
2.SharedPreferences.edit -> SharedPreferences.Editor對象
3.SharedPreferences.Editor.putXxx() -> 保存key-value對
4.SharedPreferences.Editor.commit -> 提交key-value對
從survey.xml文件中讀取key-value對:
String PREFERENCE_NAME = "survey";
SharedPreferences sharedPreferences = getSharedPreferences(
PREFERENCE_NAME, Activity.MODE_PRIVATE);
etName.setText(sharedPreferences.getString("name", ""));
etHabit.setText(sharedPreferences.getString("habit", ""));
cbEompanyType.check(sharedPreferences.getInt("companyTypeId", ""));
cbEmployee.setChecked(sharedPreferences.getBoolean("employee", false));
rgCompanyType.check(sharedPreferences.getInt("companyTypeId", -1));
向survey.xml文件中寫入key-value對:
SharedPreferences mySharedPreferences = getSharedPreferences(
PREFERENCE_NAME, Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = mySharedPreferences.edit();
editor.putString("name", "bill");
editor.putString("habit", "swimming");
editor.putBoolean("employee", true);
editor.putInt("companyTypeId", 1);
editor.edit();
用SharedPreferences保存的數(shù)據(jù)文件放在哪個目錄中?怎樣不使用SharePreferences訪問這些文件?
存儲路徑:/data/data/packagename/shared_prefs.
只能使用文件流讀寫SharedPreferences數(shù)據(jù)文件。
String path = android.os.Environment.getDataDirectory().getAboslutePath()
+ "/data/" + getPackageName() + "/shared_prefs/abc.xml";
try {
BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream(path)));
Toast.makeText(this, br.readLine(), Toast.LENGTH_LONG);
fis.close();
} catch (Exception e) {
}
SharedPreferences怎樣把數(shù)據(jù)文件存儲到sd卡上?
SharedPreference原則上只能保存在當前應用程序私有的shared_prefs目錄中,不過可以利用反射技術改變系統(tǒng)內定的文件保存路徑。
try {
Field field = ContextWrapper.class.getDeclaredField("mBase");
field.setAccessible(true);
Object obj = field.get(this);
field = obj.getClass().getDeclaredField("mPreferencesDir");
field.setAccessible(true);
File file = new File("/sdcard/");
field.set(obj, file);
SharedPreferences mySharedPreferences = getSharedPreferences("config", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = mySharedPreferences.edit();
editor.putString("name", "nancy");
editor.commit();
} catch (Exception e) { }
SharedPreferences文件可以保存圖像數(shù)據(jù)嗎?
將圖像轉換成字符串再保存。采用Base64將二進制數(shù)據(jù)轉換成字符串的編碼。
SharedPreferences sharedPreferences = getSharedPreferences("base64", Activity.MODE_PRIVATE);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
((BitmapDrawable) imageView.getDrawable()).getBitmap().compress(CompressFormat.JPEG, 50, baos);
String imageBase64 = new String(Base64.encodeBase64(baos.toByteArray()));
SharedPreferences.Editor editor = SharedPreferences.edit();
editor.putString("productImage", imageBase64);
editor.commit();
讀取:
String imageBase64 = sharedPreferences.getString("productImage", "");
base64Bytes = Base64.decodeBase64(imageBase64.getBytes());
bais = new ByteArrayInputStream(base64Bytes);
imageView.setImageDrawable(Drawable.createFromStream(bais, "product_image"));
【拓展】在SharedPreferences中存取可序列化對象。
序列化對象類:
public class Product implements Serializable {
private String name;
private String id;
private String price;
//...
}
保存:
Product product = new Product();
product.setId(1234);
product.setName("nancy");
product.setPrice("9999");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.setObject(product);
SharedPreferences sharedPreferences = getSharedPreferences("Product", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
String productBase64 = new String(Base64.encodeBase64(baos.toByteArray()));
editor.putString("product", productBase64);
editor.commit();
讀取:
String productBase64 = sharedPreferences.getString("product", "");
byte[] base64Bytes = Base64.decodeBase64(productBase64.getBytes());
ByteArrayInputStream bais = new ByteArrayInputStream(base64Bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
Product product = (Product) ois.readObject();
如何通過PreferenceActivity類實現(xiàn)一個設置頁面?
通過xml配置文件來描述設置界面的設置項,系統(tǒng)會自動保存當前設置項的最后狀態(tài)。
常用設置項:
1.CheckBoxPreference:創(chuàng)建CheckBox標簽
2.EditTextPreference:彈出帶EditText的對話框
3.ListPreference:彈出帶ListView的對話框
res/xml目錄下的preference_setting文件:
android:title="使用無線網(wǎng)絡"
android:summary="使用無線網(wǎng)絡查看應用程序的位置" />
android:title="啟用衛(wèi)星定位"
android:summary="定位時,精確到街道級別" />
android:title="是否保存?zhèn)€人信息" />
android:title="姓名"
android:summary="請輸入真實姓名" />
android:title="其他信息"
android:summary="是否工作、手機" >
android:title="手機"
android:summary="請輸入真實的手機號" />
android:title="是否工作" />
配置:
addPreferencesFromResource(R.xml.preference_setting);
【拓展】使用PreferenceActivity預定義組件布局界面應注意什么?
1.一個設置界面對應一個標簽
2.表示一個設置分類,title屬性表示分類名稱
3.設置項標簽可以不屬于任何設置分類
4.嵌套,說明該設置頁有一個子設置頁
5.android:key屬性的值是保存在XML文件中的key-value的key
6.android:title,android:summary表示設置項的標題和摘要
請說出PreferenceActivity保存數(shù)據(jù)文件的路徑,文件的命名規(guī)則,默認的文件名是否可以更改。
默認保存路徑:shared_prefs目錄
默認文件名:packagename_preferences.xml
如果當前窗口屬于net.blogjava.mobile包,則默認文件名為net.blogjava.mobile_packagename_preferences.xml
修改默認的文件名:PreferenceManager.setSharedPreferencesName:
getPreferenceManager().setSharedPreferencesName("setting");
用PreferenceActivity實現(xiàn)一個設置界面,如果某一個設置項的復選框變化后要求設置另一個列表項的狀態(tài),應該如何做呢?
覆蓋PreferenceActivity.onPreferenceTreeClick方法:
public boolean onPreferenceTreeOnClick(PreferenceScreen preferenceScreen, Preference preference) {
if ("yesno_save_individual_info".equals(preference.getKey())) {
findPreference("individual_name").setEnabled(
!findPreference("individual_name").isEnabled());
}
return super.onPreferenceTreeOnClick(preferenceScreen, Preference);
}
* 流文件
Android SDK支持哪些獲取文件輸入輸出流的方式?
1.直接創(chuàng)建FileInputStream和FileOutputStream對象
try {
FileOutputStream fos = new FileOutputStream("/sdcard/record.txt");
//寫入內容
fos.close();
FileInputStream fis = new FileInputStream("/sdcard/record.txt");
//讀取內容
fis.close();
} catch (Exception e) { }
2.使用Context.openFileOutput/Context.openFileInput方法
try {
OutputStream os = openFileOutput("file.txt", Activity.MODE_PRIVATE);
//寫入內容
os.close();
InputStream is = openFileInput("file.txt");
is.close();
} catch(Exception e) { }
請說出Context.openFileOutput方法存儲數(shù)據(jù)文件的路徑
/data/data//files
如何使用ImageView組件裝載SD卡上的圖像文件?
ImageView imageView = (ImageView) findViewById(R.id.imageView);
imageView.setImageDrawable(Drawable.createFromPath("/sdcard/face.png"));
XML存儲
Android SDK支持讀取XML嗎?
只支持采用SAX技術讀取XML。
請描述SAX分析XML文檔的過程
SAX引擎需要處理5個分析點(分析事件):
1.開始分析XML文件。DefaultHandler.startDocument,初始化工作。
2.開始處理每一個XML元素。startElement,獲得當前元素的名稱、元素屬性的相關信息。
3.處理完一個XML元素。endElement,獲得當前處理完的元素的全部信息。
4.處理完XML文件。endDocument,非必需方法,收尾工作(釋放資源等)。
*6.讀取字符分析點。最重要。保存SAX引擎讀取的XML文件內容,就是保存XML元素的文本。
將XML文件轉換成對象。
xml文件示例:
10
電腦
2067.25
20
微波爐
520
List對象
package net.blogjava.mobile;
public class Product
{
private int id;
private String name;
private float price;
//...getter and setter
}
XML2Product類負責具體的轉換工作:
package net.blogjava.mobile;
import java.util.ArrayList;
import java.util.net;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class XML2Product extenda DefaultHandler
{
private List products;
private Product product;
private StringBuffer buffer = new StringBuffer();
public List getProducts()
{
return products;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException
{
//將SAX引擎掃描到的內容保存在buffer變量中,并為endElement提供參數(shù)
buffer.append(ch, start, length);
super.characters(ch, start, length);
}
@Override
public void endElement(String uri, String localName, String gName) throws SAXException
{
//SAX每分析完一個XML元素,將該元素的文本保存在Product對象的相應屬性中
super.endElement(uri, localName, gName);
}
@Override
public void sartDocument() throws SAXException
{
//創(chuàng)建用于保存轉換結果的List對象
products = new ArrayList();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) thows SAXException
{
//SAX引擎分析到每一個結點時,創(chuàng)建一個Product對象
super.startElement(uri, localName, qName, attributes);
}
補充endElement和startElement中的代碼。
@Override
public void endElement(String uri, String localName, String gName) throws SAXException
{
if (localName.equals("product"))
{
products.add(product);
}
else if (localName.equals("id"))
{
product.setId(Integer.parseInt(buffer.toString().trim()));
buffer.setLength(0);
}
else if (localName.equals("name"))
{
product.setName(buffer.toString().trim());
buffer.setLength(0);
}
else if (localName.equals("price"))
{
product.setPrice(Float.parseFloat(buffer.toString().trim()));
buffer.setLength(0);
}
super.endElement(uri, localName, gName);
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) thows SAXException
{
if (localName.equals("product"))
{
product = new Product();
}
super.startElement(uri, localName, qName, attributes);
}
寫出利用XML2Product類將products.xml文件的內容轉換成List對象的Java代碼。
FileInputStream fis = new FileInputStream("/sdcard/products.xml");
XML2Product xml2Product = new XML2Product();
android.util.Xml.parse(fis, Xml.Encoding.UTF_8, xml2Product);
List products = xml2Product.getProducts();
JSON存儲
請描述JSON文檔的格式
使用字符串形式保存數(shù)組和對象屬性值。
數(shù)組使用'[]',對象使用'{}'。
請解析JSON格式文檔的Java代碼,并輸出到LogCat視圖中。
[{'name':'地球', 'satellite_count':'1', 'satellite_names':'moon'},{'name':'火星', 'satellite_count':'2', 'satellite_names':'Phobos, Deimos'}]
try
{
String json = "[{'name':'地球', 'satellite_count':'1', 'satellite_names':'moon'},{'name':'火星', 'satellite_count':'2', 'satellite_names':'Phobos, Deimos'}]";
JSONArray jsonArray = new JSONArray(json);
for (int i = 0; i < jsonArray.length(); i ++)
{
String s = String.valueOf(jsonArray.get(i));
JSONObject jsonObject = new JSONObject(s);
Log.d("name", String.valueOf(jsonObject.get("name")));
Log.d("satellite_count", String.valueOf(jsonObject.get("satellite_count")));
if (jsonObject.has("satellite_names"))
{
Log.d("satellite_names", String.valueOf(jsonObject.get("satellite_names")));
}
}
}
catch (Exception e)
{
}
總結
以上是生活随笔為你收集整理的android文件存储数组,Android面试简录——文件存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 透明度变化,安卓获取屏幕
- 下一篇: android 保存退出之前的页面_项目