欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android之资源文件存取及DOM解析(3)

程序员文章站 2022-07-12 18:10:02
...

                   学到这里我们就想到了绝对不能动的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,否则读出会是乱码。


Android之资源文件存取及DOM解析(3)
            
    
    博客分类: Android数据存储 androidDOM资源文件存储 
 将布局文件设为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());
	}

 

实现效果为:


Android之资源文件存取及DOM解析(3)
            
    
    博客分类: Android数据存储 androidDOM资源文件存储 
 

  • 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();
			}
		}
		
	}
}

 

实现效果如下:


Android之资源文件存取及DOM解析(3)
            
    
    博客分类: Android数据存储 androidDOM资源文件存储 
 
Android之资源文件存取及DOM解析(3)
            
    
    博客分类: Android数据存储 androidDOM资源文件存储 


Android之资源文件存取及DOM解析(3)
            
    
    博客分类: Android数据存储 androidDOM资源文件存储 

接下来我们来读取刚才我们保存的文件:

定义类似的布局文件:

<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());
			}
		}

	}
}

 这一章涉及到很多知识,大家需要好好消化

实现效果如图:


Android之资源文件存取及DOM解析(3)
            
    
    博客分类: Android数据存储 androidDOM资源文件存储 


Android之资源文件存取及DOM解析(3)
            
    
    博客分类: Android数据存储 androidDOM资源文件存储 
 
 


 
 

 

  • Android之资源文件存取及DOM解析(3)
            
    
    博客分类: Android数据存储 androidDOM资源文件存储 
  • 大小: 3.5 KB
  • Android之资源文件存取及DOM解析(3)
            
    
    博客分类: Android数据存储 androidDOM资源文件存储 
  • 大小: 22.7 KB
  • Android之资源文件存取及DOM解析(3)
            
    
    博客分类: Android数据存储 androidDOM资源文件存储 
  • 大小: 44.9 KB
  • Android之资源文件存取及DOM解析(3)
            
    
    博客分类: Android数据存储 androidDOM资源文件存储 
  • 大小: 27.6 KB
  • Android之资源文件存取及DOM解析(3)
            
    
    博客分类: Android数据存储 androidDOM资源文件存储 
  • 大小: 55 KB
  • Android之资源文件存取及DOM解析(3)
            
    
    博客分类: Android数据存储 androidDOM资源文件存储 
  • 大小: 34.2 KB
  • Android之资源文件存取及DOM解析(3)
            
    
    博客分类: Android数据存储 androidDOM资源文件存储 
  • 大小: 37.8 KB