Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 从服务器下载文件_Xml_Http_Blackberry_Download - Fatal编程技术网

Xml 从服务器下载文件

Xml 从服务器下载文件,xml,http,blackberry,download,Xml,Http,Blackberry,Download,在这里,我试图将一个文件从服务器下载到SD卡上。代码如下所示: try{ FileConnection fconn = (FileConnection)Connector.open("file:///SDCard/BlackBerry/documents/Report.xml"); if (fconn.exists()) { fconn.delete(); } fconn.create(); add(new RichTextField("Deleted

在这里,我试图将一个文件从服务器下载到SD卡上。代码如下所示:

try{
   FileConnection fconn = (FileConnection)Connector.open("file:///SDCard/BlackBerry/documents/Report.xml");
   if (fconn.exists()) {
      fconn.delete();
   }

   fconn.create();
   add(new RichTextField("Deleted and created", Field.NON_FOCUSABLE));

   HttpConnection connection = (HttpConnection)        
   Connector.open("http://127.0.0.1/xml/home.xml");
   add(new RichTextField("Connection success", Field.NON_FOCUSABLE));
   InputStream ds = connection.openInputStream(); 
   byte[] data = new byte[ds.available()];
   ds.read(data);
   add(new RichTextField("Data read", Field.NON_FOCUSABLE));
   OutputStream outStream = fconn.openOutputStream();
   outStream.write(data);
   outStream.close();
   add(new RichTextField("Data written succesfully", Field.NON_FOCUSABLE));
   fconn.close();

   }
   catch (Exception e) {
   // TODO: handle exception
}
问题是,在emulatora上,我看到前两条消息,即

  • 删除并创建
  • 连接成功
但是在这之后,没有给出数据是否被写入的消息。XML文件的大小为1KB。
请帮我解决这个问题好吗?我的代码中有问题吗?还是有其他问题?

首先,这一行:

add(new RichTextField("Deleted and created", Field.NON_FOCUSABLE));
HttpConnection connection = (HttpConnection) Connector.open("http://127.0.0.1/xml/home.xml");
让我觉得你是在事件线程上直接这么做的,这是一种糟糕的做法。如果连接超时或需要很长时间,那么此时您将冻结GUI。您通常会生成一个工作线程来执行这样的长任务

也就是说,您的代码可以工作,但并不真正健壮。很多事情都会变坏。例如,这一行:

add(new RichTextField("Deleted and created", Field.NON_FOCUSABLE));
HttpConnection connection = (HttpConnection) Connector.open("http://127.0.0.1/xml/home.xml");
返回的连接可以为null,因此必须检查它。您最好使用
ConnectionFactory
,因为它为每种连接(WiFi、BES、TCP等)添加了正确的后缀。在模拟器中,我不确定您是否可以使用localhost URL,因为它是您工作站的本地URL,但模拟的BB设备必须经过MDS模拟器

使用
FileConnection
时,还必须检查它是否不为null,以及
fconn.canRead
是否返回true。考虑到并非每个设备都有SD卡插槽(最近的设备有)。您可以按照中的说明检查卡是否可用,或者让
捕获
处理异常。若你们在模拟器上测试,你们必须“挂载”一个虚拟SD卡

此外,本电话:

ds.read(data);
将一直阻止,直到服务器实际向您发送内容为止。这可能就是正在发生的事情

您必须检查您是否具有正确的权限。对于文件连接,您需要:

ApplicationPermissions.PERMISSION_FILE_API 
对于网络连接,根据您连接到的位置,您需要:

ApplicationPermissions.PERMISSION_INTERNET
ApplicationPermissions.PERMISSION_SERVER_NETWORK

最后一个提示:在try-catch中添加一个finally子句,并关闭finally中的所有流和连接(如果它们不为null)。

HTTP连接仅在
InputStream ds=connection.openInputStream()行上尝试失败,因此在此之后您不会看到任何消息。失败的原因可能是模拟器无法访问指定的URL

在线路
连接器上。打开(“http://127.0.0.1/xml/home.xml");尝试将URL更改为
http://127.0.0.1/xml/home.xml?interface=wifi

这将迫使模拟器使用模拟的WLAN连接,该连接实际上是您电脑的网络接口。确保模拟器已连接到
默认WLAN连接


此外,与其向屏幕添加UI字段以查看代码中发生了什么,不如添加调试消息(例如,
System.out.println(“Got connection”)
)并使用调试器,只需在eclipse中按F11即可。

谢谢您的早日回复。我已经测试了所有的空值,我的连接也成功了,但问题在于输入流对象的创建。所以请给我一个输入流的解决方案,以及如何使用上面提到的所有权限。inputstream行是第一个真正建立HTTP连接的行。也许你有一个暂停。您应该让它运行至少3分钟,并记录异常。然后请发布。关于权限,我认为模拟器中不需要这些权限。在实际设备中,用户在安装时设置权限(或稍后通过“选项”菜单设置权限)。您是否发现问题所在?是的,首先是连接超时,而且我的防病毒软件(ESET)阻止了防火墙,这使我的工作更糟。。谢谢你的帮助,史密斯先生