为什么通过在android真机上不能获取shared_prefs里的xml文件

为什么通过在android真机上不能获取shared_prefs里的xml文件,第1张

SharedPreferences生成的xml数据,要使用SharedPreferences这个轻量级存储器读取。

SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstanceState保存一般使用SharedPreferences完成,它提供了Android平台常规的Long长 整形、Int整形、String字符串型的保存。

SharedPreferences类似过去Windows系统上的ini配置文件,但是它分为多种权限,可以全局共享访问,android123提示最终是以xml方式来保存,整体效率来看不是特别的高,对于常规的轻量级而言比SQLite要好不少,如果真的存储量不大可以考虑自己定义文件格式。xml 处理时Dalvik会通过自带底层的本地XML Parser解析,比如XMLpull方式,这样对于内存资源占用比较好。

它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/< >/shared_prefs目录下。

SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。

实现SharedPreferences存储的步骤如下:

一、根据Context获取SharedPreferences对象

二、利用edit()方法获取Editor对象。

三、通过Editor对象存储key-value键值对数据。

四、通过commit()方法提交数据。

assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件。

assets的读取方式:

1 先在Activity里面调用getAssets() 来获取AssetManager引用。

2 再用AssetManager的open(String fileName, int accessMode) 方法则指定读取的文件以及访问模式就能得到输入流InputStream。

3 然后就是用已经open file 的inputStream读取文件,读取完成后记得inputStreamclose() 。

4调用AssetManagerclose() 关闭AssetManager。

需要注意的是,来自Resources和Assets 中的文件只可以读取而不能进行写的操作

//inputStream 从服务器获取xml文件,以流的形式返回

//encode 编码格式

public static List<Person>parseXML(InputStream inputStream,String encode) throws Exception

{

List<Person> list=null;

Person person=null;//装载解析每一个person节点的内容

//创建一个xml解析的工厂

XmlPullParserFactory factory=XmlPullParserFactorynewInstance();

//获得xml解析类的引用

XmlPullParser parser=factorynewPullParser();

parsersetInput(inputStream, encode);

//获得事件的类型

int eventType=parsergetEventType();

while(eventType !=XmlPullParserEND_DOCUMENT)

{

switch (eventType) {

case XmlPullParserSTART_DOCUMENT:

list=new ArrayList<Person>();

break;

case XmlPullParserSTART_TAG:

if("person"equals(parsergetName()))

{

person=new Person();

//取出属性值

int id=Integer parseInt(parsergetAttributeValue(0));

personsetId(id);

}else if("name"equals(parsergetName()))

{

String name=parsernextText();//获取该节点的内容

personsetName(name);

}else if("age"equals(parsergetName()))

{

int age=IntegerparseInt(parsernextText());

personsetAge(age);

}

break;

case XmlPullParserEND_TAG:

if("person"equals(parsergetName()))

{

listadd(person);

person=null;

}

break;

}

eventType=parsernext();

}

return list;

}

一个小例子,希望对你有帮助

一、环境:

主机:WIN8

开发环境:Eclipse

二、说明:

1打开sd卡中的xml文件,如果不存在,这新建一个,并写入默认配置

2读取xml文件

三、xml文件格式:

<xml version="10" encoding="UTF-8" standalone="true">

-<config>

<title>远程视频会见系统</title>

<local_port>12600</local_port>

<schedule_service_ip>1058159</schedule_service_ip>

<schedule_service_port>12601</schedule_service_port>

</config>

四、源代码:

package comexamplehelloanychat;

import javaioFile;

import javaioFileInputStream;

import javaioFileOutputStream;

import javaioIOException;

import javaioStringWriter;

import javanetInet6Address;

import javanetInetAddress;

import javanetNetworkInterface;

import javanetSocketException;

import javautilEnumeration;

import javaxxmlparsersDocumentBuilder;

import javaxxmlparsersDocumentBuilderFactory;

import androidosEnvironment;

import androidutilLog;

import orgw3cdomDocument;

import orgw3cdomElement;

import orgw3cdomNodeList;

import orgxmlpullv1XmlPullParserFactory;

import orgxmlpullv1XmlSerializer;

/

配置信息类

新建日期:2014/12/8 by jdh

/

public class Config implements IF_Config {

//配置信息

private Config_Info config_info = new Config_Info();

/

构造函数

/

public Config() {

boolean ok;

File sd_path;

File file_cfg_dir;

File file_cfg;

FileOutputStream out;

String str;

FileInputStream in;

//得到本机ip地址

config_infolocal_ip = getLocalIpAddress();

Systemoutprintf("本机ip:%s\n", config_infolocal_ip);

//获取SD卡目录

sd_path = EnvironmentgetExternalStorageDirectory();

//判断文件夹是否存在

file_cfg_dir = new File(sd_pathgetPath() + "//Remote_Meeting");

if (!file_cfg_direxists() && !file_cfg_dirisDirectory()) {

Systemoutprintln("配置文件夹Remote_Meeting不存在!");

ok = file_cfg_dirmkdirs();

if (ok) {

Systemoutprintln("创建文件夹成功!");

} else {

Systemoutprintln("创建文件夹失败!");

}

}

//判断配置文件是否存在

file_cfg = new File(file_cfg_dirgetPath(),"cfgxml");

if (!file_cfgexists())

{

Systemoutprintln("配置文件cfgxml不存在!");

try {

file_cfgcreateNewFile();

Systemoutprintln("创建文件cfgxml成功!");

//生成初始化的配置数据

try {

out = new FileOutputStream(file_cfg);

//保存默认配置

config_infotitle = "远程视频会见系统";

config_infolocal_port = 12600;

config_infoschedule_server_ip = "1058159";

config_infoschedule_server_port = 12601;

str = produce_xml_string(config_info);

outwrite(strgetBytes());

outclose();

} catch (IOException e) {

// TODO Auto-generated catch block

eprintStackTrace();

}

} catch (IOException e) {

// TODO Auto-generated catch block

eprintStackTrace();

}

}

config_infotitle = "远程";

config_infolocal_port = 126;

config_infoschedule_server_ip = "105";

config_infoschedule_server_port = 12;

Systemoutprintf("----222222222%s,%d,%s,%d\n",config_infotitle,config_infolocal_port,

config_infoschedule_server_ip,config_infoschedule_server_port);

//解析xml文件

try {

in = new FileInputStream(file_cfg);

DocumentBuilderFactory factory = DocumentBuilderFactorynewInstance();

DocumentBuilder builder = factorynewDocumentBuilder();

Document document = builderparse(in);

// 获取根节点

Element root = documentgetDocumentElement();

NodeList node = rootgetChildNodes();

//获得第1子节点:标题

config_infotitle = nodeitem(0)getFirstChild()getNodeValue();

//获得第2子节点:本机端口

config_infolocal_port = IntegerparseInt(nodeitem(1)getFirstChild()getNodeValue());

//获得第3子节点:调度服务器ip

config_infoschedule_server_ip = nodeitem(2)getFirstChild()getNodeValue();

//获得第4子节点:调度服务器端口

config_infoschedule_server_port = IntegerparseInt(nodeitem(3)getFirstChild()getNodeValue());

Systemoutprintf("----222222222%s,%d,%s,%d\n",config_infotitle,config_infolocal_port,

config_infoschedule_server_ip,config_infoschedule_server_port);

} catch (Exception e) {

eprintStackTrace();

}

}

@Override

public Config_Info get_config_info() {

return config_info;

}

/

得到本机ip地址

@return 本机ip地址

/

private String getLocalIpAddress() {

try {

for (Enumeration<NetworkInterface> en = NetworkInterface

getNetworkInterfaces(); enhasMoreElements();) {

NetworkInterface intf = ennextElement();

for (Enumeration<InetAddress> enumIpAddr = intf

getInetAddresses(); enumIpAddrhasMoreElements();) {

InetAddress inetAddress = enumIpAddrnextElement();

//if (!inetAddressisLoopbackAddress()) {

if (!inetAddressisLoopbackAddress() && !(inetAddress instanceof Inet6Address)) {

return inetAddressgetHostAddress()toString();

}

}

}

} catch (SocketException ex) {

Loge("WifiPreference IpAddress", extoString());

}

return null;

}

/

生成xml配置文件的String数据流

Config_Info的本机ip信息不会保存

@param info:配置信息

@return xml的String数据流

/

private String produce_xml_string(Config_Info info) {

StringWriter stringWriter = new StringWriter();

try {

// 获取XmlSerializer对象

XmlPullParserFactory factory = XmlPullParserFactorynewInstance();

XmlSerializer xmlSerializer = factorynewSerializer();

// 设置输出流对象

xmlSerializersetOutput(stringWriter);

//开始标签

xmlSerializerstartDocument("utf-8", true);

xmlSerializerstartTag(null, "config");

//标题

xmlSerializerstartTag(null, "title");

xmlSerializertext(infotitle);

xmlSerializerendTag(null, "title");

//本机端口

xmlSerializerstartTag(null, "local_port");

xmlSerializertext(IntegertoString(infolocal_port));

xmlSerializerendTag(null, "local_port");

//调度服务器ip

xmlSerializerstartTag(null, "schedule_service_ip");

xmlSerializertext(infoschedule_server_ip);

xmlSerializerendTag(null, "schedule_service_ip");

//调度服务器端口

xmlSerializerstartTag(null, "schedule_service_port");

xmlSerializertext(IntegertoString(infoschedule_server_port));

xmlSerializerendTag(null, "schedule_service_port");

xmlSerializerendTag(null, "config");

xmlSerializerendDocument();

} catch (Exception e) {

eprintStackTrace();

}

return stringWritertoString();

}

}

xml布局文件是在要打包之前,开发工具自动编译到R文件才能使用的,

如果你想做动态布局的话,有两种处理方法

界面使用HTML5布局,android端使用webView控件去加载这个界面

使用HTML5移动开发平台(phongGap,jquery mobile,extjs 等等,灰常多的开发平台)开发,通过打包工具打包成apk

纯手工打字,请采纳哈

一。simple-xml第三方jar包解析xml格式数据

simple-xml是一个xml和对象互转操作工具包,官方网址为:http://simplesourceforgenet/,jar包可以到官网上下载,笔者使用的是目前最新版本的jar包,名为simple-xml-271jar;废话不多说了,代码才是最真实靠谱的力证。

下面是整个Demo工程文件截图,如下图:

该Demo主要是通过simple-xml解析assets目录中的dataxml文件内容数据,然后显示出来;

1dataxml文件内容如下:

[html] view plaincopy

<xml version="10" encoding="utf-8">

<resources>

<xml version="10" encoding="utf-8">

<dataContent>

<group>

<groupID>1</groupID>

<groupName>第一组</groupName>

<member>

<name>张三</name>

<age>22</age>

</member>

<member>

<name>李四</name>

<age>24</age>

</member>

<member>

<name>欧阳雪</name>

<age>18</age>

</member>

</group>

<group>

<groupID>2</groupID>

<groupName>第二组</groupName>

<member>

<name>司徒静</name>

<age>19</age>

</member>

<member>

<name>叶笙</name>

<age>26</age>

</member>

<member>

<name>杨风</name>

<age>25</age>

</member>

</group>

<group>

<groupID>3</groupID>

<groupName>第三组</groupName>

<member>

<name>王龙</name>

<age>32</age>

</member>

<member>

<name>西门胜男</name>

<age>21</age>

</member>

<member>

<name>张铬</name>

<age>45</age>

</member>

</group>

</dataContent>

</resources>

通过上面的文件内容,我们知道,这个文件内容主要有三组数据,每组数据有个三个成员组,每个成员组都有名字和年龄这两个子元素。Demo中将这些解析出来内容通过ExpandableListView显示出来。

2主页面MainActivity代码如下:

[java] view plaincopy

package comstevenandroidsimplexmlactivity;

import javaioBufferedReader;

import javaioIOException;

import javaioInputStream;

import javaioInputStreamReader;

import javautilregexMatcher;

import javautilregexPattern;

import orgsimpleframeworkxmlcorePersister;

import androidappActivity;

import androidosBundle;

import androidtextTextUtils;

import androidutilLog;

import androidviewMenu;

import androidwidgetExpandableListView;

import comstevenandroidsimplexmladapterExpandAdapter;

import comstevenandroidsimplexmlparseDataParseResponse;

/

描述:主页面

@author stevenhu223

/

public class MainActivity extends Activity {

private final String TAG = "MainActivity";

private ExpandableListView mExpandableListView;

private ExpandAdapter mAdapter;

@Override

protected void onCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

setContentView(Rlayoutactivity_main);

mExpandableListView = (ExpandableListView) findViewById(Ridexpanlist_content);

try {

matchAndParseData();

} catch (Exception e) {

// TODO Auto-generated catch block

eprintStackTrace();

}

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present

getMenuInflater()inflate(Rmenumain, menu);

return true;

}

/

匹配获取和解析xml文件内容

@throws Exception

/

private void matchAndParseData() throws Exception {

InputStream inputStream = getResources()getAssets()open("dataxml");

String dataContent = convertStreamToString(inputStream);

String content = "";

//正则表达式匹配

Pattern DATA_PATTERN= Patterncompile("[\\S\\s](<dataContent>[\\s\\S]</dataContent>)[\\s\\S]");

Matcher matcher = DATA_PATTERNmatcher(dataContent);

if (matchermatches()) {

//获取包含dataContent元素的内容

content = matchergroup(1);

}

if (!TextUtilsisEmpty(content)) {

DataParseResponse dataResponse = parseToBean(DataParseResponseclass, content);

mAdapter = new ExpandAdapter(this, dataResponsemGroupEntities);

mExpandableListViewsetAdapter(mAdapter);

}

}

/

将xml文件内容解析成实体类

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 为什么通过在android真机上不能获取shared_prefs里的xml文件

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情