为什么通过在android真机上不能获取shared_prefs里的xml文件
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文件内容解析成实体类
0条评论