使用OutPutStream写数据的问题及其它

原创 2015年07月10日 23:27:07

从下午一直调试bug到现在,终于解决了问题!

今天主要做的是自己用tomcat配置了一个服务器,在服务器里放了一个xml文件,然后通过手机去下载这个文件,然后再解析出来。


       遇到的第一个bug是无法下载文件,因为连接不上,tomcat服务器的地址是:http://127.0.0.1:8080/mp3/resources.xml ,即我在电脑浏览器中输入这个地址能够访问这个文件,但是在andorid手机上访问这个文件时,需要使用电脑的ip地址。比如我的ip地址是:192.168.1.1 ,那么在访问服务器时使用的地址应该是:http://192.168.1.1:8080/mp3/resources.xml 

     

      第二个问题是:通过Ip地址获得文件的InputStream后,需要把输入流还原为文件(即写入到文件夹中)

     刚开始我使用的是如下方式:

                        byte[] buffer = new byte[512];
			while ((input.read(buffer)) != -1) {
				output.write(buffer);
			}
			output.flush();
     后来logcat老提示xml文件格式警告,通过File Explore导出下载的xml文件才发现文件的末尾多了很多空字符。这过程中还遇到另一个问题,就是导出文件的时候提示导出失败,后来把eclipse关了重启就好了。我明白了因为每个buffer的长度都是512字节,最后一次写buffer的时候,buffer中可能有空余的长度没有数据可写,因此多了空白字符。

所以后来用了如下方式:就彻底解决了。这也得到一个经验,即以后写文件的时候,一定要用wirte(buffer,0,length)方法,而不要用write(buffer)方法。

			byte[] buffer = new byte[512];
			int length=0;
			while ((length=input.read(buffer)) != -1) {
				output.write(buffer, 0, length);
			}
			output.flush();


    第三个问题是解析xml的时候遇到的,如下:

<resources>
   <resource>
      <id>0001</id>
      <mp3_name>You Can'T Always Get What You Want</mp3_name>
      <mp3_size>7182702</mp3_size>
      <lrc_name>You Can'T Always Get What You Want</lrc_name>
      <lrc_size>2021</lrc_size>
   </resource>
   <resource>
      <id>0002</id>
      <mp3_name>そばにいるね-青山テルマ</mp3_name>
      <mp3_size>4859626</mp3_size>
      <lrc_name>そばにいるね-青山テルマ</lrc_name>
      <lrc_size>4151</lrc_size>
   </resource>
   <resource>
      <id>0003</id>
      <mp3_name>青山黛玛</mp3_name>
      <mp3_size>4993259</mp3_size>
      <lrc_name>青山黛玛</lrc_name>
      <lrc_size>1615</lrc_size>
   </resource>
</resources>

java代码部分:

        public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException{
		if(localName.equals("id")){
			currentState=ID;
			return;
		}
		if(localName.equals("mp3_name")){
			currentState=MP3NAME;
			return;
		}
		if(localName.equals("mp3_size")) {
			currentState=MP3SIZE;
			return;
		}
		if(localName.equals("lrc_name")) {
			currentState=LRCNAME;
			return;
		}
		if(localName.equals("lrc_size")) {
			currentState=LRCSIZE;
			return;
		}
	}
	@Override
	public void characters(char[] ch,int start,int length)throws SAXException{
		String charact = new String(ch,start,length);
		switch (currentState) {
		case ID:
			musicInfo.setId(charact);
			break;
		case MP3NAME:
			musicInfo.setMp3_name(charact);
			break;
		case MP3SIZE:
			musicInfo.setMp3_size(Long.parseLong(charact));
			break;
		case LRCNAME:
			musicInfo.setLrc_name(charact);
			break;
		case LRCSIZE:
			musicInfo.setLrc_size(Long.parseLong(charact));

		default:
			break;
		}
	}
	@Override
	public void endElement(String uri,String localName,String qName)throws SAXException{
		currentState=0;
		if(localName.equals("resource")){
		    musicList.add(musicInfo);
		}
	}
    如上,解析xml标签的时候,定义了一个全局变量currentState ,在startElement中,每当遇到一个标签就给currentState一个对应的值,这样在character方法中,通过判断现在currentSate的值就可以获取相应标签的属性。而在endElement方法中,一定要将currentState的值还原为0。假如不做这一步,那么当第一个resource标签解析完的时候,currentState的值会是LRCSIZE,当开始解析第二个resource标签的时候,在character方法中会响应case LRCSIZE,resource的属性无法转换为Long类型,所以在
musicInfo.setLrc_size(Long.parseLong(charact));
的时候会造成数据类型转换异常。实际上是整个逻辑错误,所以一定要记得在标签解析完时将currentState赋值为0。


          以上就是今天的全部收获,希望能再接再厉。

     

相关文章推荐

在servlet中用outputStream输出数据以及中文数据的问题

在servlet中用outputStream输出数据以及中文数据的问题 今天学习了servlet中比较重要的一个知识点,在servlet中用reponse对象的outputStream输出数据以...

在servlet中用outputStream输出数据的问题,以及输出中文的问题

在servlet中用outputStream输出数据的问题,以及输出中文的问题

关于Java OutputStream 线程安全问题

今天偶尔发现java的输出流的线程安全问题 先看代码吧 import java.io.File; import java.io.FileInputStream; import java.io.Fi...

DFSClient技术内幕(数据的写入--OutputStream的初始化)

以下是本人研究源代码成果, 此文僅献给我和我的小伙伴们,不足之处,欢迎斧正-------------------------------------------------致谢道格等人! 注:h...

怎么解决Outputstream乱码的问题?

相信很多同学和我一样遇到过在通过服务器响应界面界面浏览器界面出现乱码的问题吧,今天我们就来思考一下如何解决乱码问题! 乱码产生的原因: 1.Servlet程序输出给浏览器的内容,不是任何一...

InputStream和OutputStream进行读、写、删除文件

JAVA中我们经常会从一个文件中读取数据或者写数据或者删除删除数据 下面来看一下串流的继承架构: 图片参考:http://blog.csdn.net/wh4656438/artic...

Java文件读写数据流大全(InputStream、OutputStream、FileInpuStream)

http://wolfgangkiefer.blog.163.com/blog/static/86265503201182795254987/ 数据流可分节点流(想象成一管子直接接文件或...

Java IO 文件流的读,文件流写Writer,Reader,InputStream,OutputStream封装

package com.app.io;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import jav...

InputStream与OutputStream的使用例子

package com.hanchao.test; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; ...

JAVA中inputStream/OutputStream字节输入流、输出流读写文件

好记性不如赖笔头…… 注意:InputStream/OutputStream是抽象类,不能被实例化,只能实例化其子类,且是字节流,不是字符流InputStream is = new FileInpu...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用OutPutStream写数据的问题及其它
举报原因:
原因补充:

(最多只允许输入30个字)