• JSON XML IO数据操作


    一、XML解析

    通过继承org.xml.sax.helpers.DefaultHandler类,覆写characters(),startDocument(),startElement(),endElement()方法实现读取
      characters() --------读取结点中的字段值
      startDocument()------------进行读取的初始化
       startElement()-------------为每次读取初始化
      endElement()------------实现读取功能
      以下是实现解析功能的源代码:
    package org.hjw.service;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.hjw.model.Product;
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    public class XML2Product extends DefaultHandler {
    	private Product product;
    	private List<Product> products;
    	StringBuffer buffer = new StringBuffer();
    
    	public List<Product> getProducts() {
    		return products;
    	}
    
    	@Override
    	public void characters(char[] ch, int start, int length)
    			throws SAXException {
    		buffer.append(ch, start, length);
    		super.characters(ch, start, length);
    	}
    
    	@Override
    	public void startDocument() throws SAXException {
    		products = new ArrayList<Product>();
    	}
    
    	@Override
    	public void startElement(String uri, String localName, String qName,
    			Attributes attributes) throws SAXException {
    		if (localName.equals("product")) {
    			product = new Product();
    		}
    		super.startElement(uri, localName, qName, attributes);
    	}
    
    	@Override
    	public void endElement(String uri, String localName, String qName)
    			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, qName);
    	}
    
    }
    

    然后只需在主函数中:


    InputStream is = getResources().openRawResource(R.raw.products);
    	XML2Product xml2Product = new XML2Product();
    	android.util.Xml.parse(is, Xml.Encoding.UTF_8, xml2Product);	
    	List<Product> products = xml2Product.getProducts();



    打开输入流,通过工具类分析xml文件即可获得一个ArrayList类型的集合,然后实现解析功能。

    二、JSON解析

      主要是通过JsonWriter类和JsonReader类实现读写功能。
    JsonWriter----------具体的写操作如下代码:
    writer.beginObject();
    	writer.name("id").value(product.id);//key-value对应
    	writer.name("name").value(product.name);
    	writer.endObject();

    一般来说,我们要尽可能的分层次的解析,让代码实现更好的分离,流操作-数组操作-对象操作。

    JsonReader--------具体的读操作:

    reader.beginObject();
    		while (reader.hasNext())
    		{
    			String field = reader.nextName();//游标往后移
    
    					
    			if (field.equals("id"))
    			{
    				id = reader.nextString();//获取数据
    			}
    			else if (field.equals("name"))
    			{
    				name = reader.nextString();
    
    			}
    			else
    			{
    				reader.skipValue();
    			}
    		}
    		reader.endObject();

    一般来说,只要Reader初始化输入流,通过ArrayList接收,分层次的读取便可实现功能。



    三、IO操作

    和JavaIO操作类似。分为字节流和字符流,推荐用字节流。
    写文件:
    public void onClick_SaveImageToSDCard(View view)
    	{
    		try
    		{
    			FileOutputStream fos = new FileOutputStream(
    					android.os.Environment.getExternalStorageDirectory()
    							+ "/image.jpg");//获取sd卡根目录
    			InputStream is = getResources().getAssets().open("image.jpg");
    
    			byte[] buffer = new byte[8192];
    			int count = 0;
    			while ((count = is.read(buffer)) >= 0)
    			{
    				fos.write(buffer, 0, count);//写文件
    			}
    			fos.close();
    			is.close();
    			Toast.makeText(this, "已成功将图像文件写到SD卡上.", Toast.LENGTH_LONG).show();
    		}
    		catch (Exception e)
    		{
    			Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
    		}
    	}
    

    读文件:

    public void onClick_ReadImageFromSDCard(View view)
    	{
    		String filename = android.os.Environment.getExternalStorageDirectory()
    				+ "/image.jpg";
    		
    		if (!new File(filename).exists())
    		{
    			Toast.makeText(this, "还没有往SD卡写入图像文件", Toast.LENGTH_LONG).show();
    			return;
    		}
    		ImageView imageView = (ImageView) findViewById(R.id.imageview);
    		try
    		{
    			FileInputStream fis = new FileInputStream(filename);//初始化文件输入流
    			Bitmap bitmap = BitmapFactory.decodeStream(fis);
    			imageView.setImageBitmap(bitmap);
    
    			fis.close();
    		}
    		catch (Exception e)
    		{
    			
    		}
    	}


    如果不用数据库的话,以上操作都能实现数据操作,不过更推荐xml文件读写,当然如果在网络应用中,用JSON是最好的轻量级选择。


     
  • 相关阅读:
    java.lang.NoClassDefFoundError: org/springframework/dao/support/DaoSupport
    project configuration is not up-to-date with pom.xml
    消息列队5
    消息列队4
    消息列队3
    聊聊常见的数据库架构设计方案?
    消息队列2
    消息队列1
    搜索引擎5
    搜索引擎4
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3201363.html
Copyright © 2020-2023  润新知