Android之资源文件存取及DOM解析(3)
学到这里我们就想到了绝对不能动的R.java文件,对于安卓程序员来说,那是个禁区,是决定不能改动的,那有没有想狮子口拔牙想要把它读出来呢,来我们来试一下。
资源文件的ID都生成在R文件,通过import android.content.res.Resources;将之读出,获取id方法为:
r=super.getResources();//操作资源
InputStream input=r.openRawResource(R.raw.mybook);
现在我们自res文件下新建一个raw文件来存出一个资源 mybook.txt,我们实现将之读出,注意定义文本格式选择utf-8,否则读出会是乱码。
将布局文件设为utf-8,右键properties
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<TextView
android:id="@+id/msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
Activity代码:
public class MainActivity extends Activity {
private TextView text=null;
private Resources r=null;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.text=(TextView)super.findViewById(R.id.msg);
r=super.getResources();//操作资源
InputStream input=r.openRawResource(R.raw.mybook);//读取ID
Scanner scan=new Scanner(input);
StringBuffer buf=new StringBuffer();//读取数据
while(scan.hasNext()){ //循环读取
buf.append(scan.next()).append("\n");
}
scan.close();
try {
input.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.text.setText(buf.toString());
}
实现效果为:
- DOM
使用文件存储固然方便,但是如果数据多了以后,就不太好管理了,现在我们把数据存到xml文件形式进行存储,然后这个格式必须进行解析,解析就要用到DOM解析。
DOM解析虽然我们在android中并不推荐使用,但是这并不代表着不可以实现。dom的原理是把xml文件的各种部分都看成是节点,所有的节点因为层级关系最后形成了一颗节点树。而DOM的解析方式便是在内存中生存这棵树,并允许用户进行相关的操作。
现在我们实现一个目前我们第一个人机交互保存、
就是用户输入资料,程序保存
并必要时可以读出供用户阅览
定义DOM,也就是布局文件去解析:
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/TableLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<TableRow
android:id="@+id/TableRow01"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名" />
<EditText
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10" />
</TableRow>
<TableRow
android:id="@+id/tableRow1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/邮箱"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
<EditText
android:id="@+id/email"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10" >
<requestFocus />
</EditText>
</TableRow>
<TableRow
android:id="@+id/tableRow2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<Button
android:id="@+id/but"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保存" />
</TableRow>
</TableLayout>
Activity代码:
public class MainActivity extends Activity {
private EditText name = null ;
private EditText email = null ;
private Button but = null ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.activity_main);
this.name = (EditText) super.findViewById(R.id.name) ;
this.email = (EditText) super.findViewById(R.id.email) ;
this.but = (Button) super.findViewById(R.id.but) ;
this.but.setOnClickListener(new OnClickListenerImpl()) ;
}
private class OnClickListenerImpl implements OnClickListener{
@Override
public void onClick(View v) {
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) { // 不存在不操作
return; // 返回到程序的被调用处
}
File file = new File(Environment.getExternalStorageDirectory()
+ File.separator + "eedata" + File.separator
+ "ee.xml"); // 要输出文件的路径
if (!file.getParentFile().exists()) { // 父路径不存在
file.getParentFile().mkdirs() ; // 创建父文件夹
}
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance() ;
DocumentBuilder builder = null ;
try {
builder = factory.newDocumentBuilder() ;
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
Document doc = null ;
doc = builder.newDocument() ; // 创建一个新的文档
Element addresslist = doc.createElement("addresslist") ;
Element linkman = doc.createElement("linkman") ;
Element name = doc.createElement("name") ;
Element email = doc.createElement("email") ;
name.appendChild(doc.createTextNode(MainActivity.this.name.getText()
.toString()));
email.appendChild(doc.createTextNode(MainActivity.this.email.getText()
.toString()));
linkman.appendChild(name) ;
linkman.appendChild(email) ;
addresslist.appendChild(linkman) ;
doc.appendChild(addresslist) ;
TransformerFactory tf = TransformerFactory.newInstance() ;
Transformer t = null ;
try {
t = tf.newTransformer() ;
} catch (TransformerConfigurationException e) {
e.printStackTrace();
}
t.setOutputProperty(OutputKeys.ENCODING, "GBK") ;
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(file) ;
try {
t.transform(source, result) ;
} catch (TransformerException e) {
e.printStackTrace();
}
}
}
}
实现效果如下:
接下来我们来读取刚才我们保存的文件:
定义类似的布局文件:
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/TableLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TableRow
android:id="@+id/TableRow01"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名" />
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</TableRow>
<TableRow
android:id="@+id/tableRow1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="邮箱" />
<TextView
android:id="@+id/email"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</TableRow>
<TableRow
android:id="@+id/tableRow2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<Button
android:id="@+id/but"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读取" />
</TableRow>
</TableLayout>
Activity代码:
public class MainActivity extends Activity {
private TextView name = null;
private TextView email = null;
private Button but = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.activity_main);
this.name = (TextView) super.findViewById(R.id.name);
this.email = (TextView) super.findViewById(R.id.email);
this.but = (Button) super.findViewById(R.id.but);
this.but.setOnClickListener(new OnClickListenerImpl());
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) { // 不存在不操作
return; // 返回到程序的被调用处
}
File file = new File(Environment.getExternalStorageDirectory()
+ File.separator + "eedata" + File.separator
+ "ee.xml"); // 要输出文件的路径
if (!file.exists()) { // 文件不存在
return;
}
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
//定义document类对象接口,通过DocumentBuilder进行DOM树转化
Document doc = null;
try {
doc = builder.parse(file); // 通过文件转化文档,读取指定路径的xml文件
} catch (SAXException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
//查找节点
NodeList nl = doc.getElementsByTagName("linkman");
for (int x = 0; x < nl.getLength(); x++) {
Element e = (Element) nl.item(x); // 取得元素
MainActivity.this.name.setText(e.getElementsByTagName("name")
.item(0).getFirstChild().getNodeValue());
MainActivity.this.email.setText(e.getElementsByTagName("email")
.item(0).getFirstChild().getNodeValue());
}
}
}
}
这一章涉及到很多知识,大家需要好好消化
实现效果如图: