从服务器下载文件

时间:2012-03-22 07:50:07

标签: 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 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。 请帮帮我吗?我的代码有问题还是有其他问题?

2 个答案:

答案 0 :(得分:1)

首先,这一行:

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

让我觉得你是直接在事件线程上这样做的,这是不好的做法。如果连接超时或需要很长时间,那么您将冻结GUI。你通常会产生一个工作线程来执行这样的长任务。

那就是说,你的代码可以工作,但它并不是很强大。很多事情都会变坏。例如,这一行:

HttpConnection connection = (HttpConnection) Connector.open("http://127.0.0.1/xml/home.xml");

返回的连接可以为null,因此您必须检查它。您最好使用ConnectionFactory,因为它会为每种连接(WiFi,BES,TCP,...)附加正确的后缀。在模拟器中,我不确定您是否可以使用localhost URL,因为它是您工作站的本地URL,但模拟的BB设备必须通过MDS模拟器。

使用FileConnection时,您还必须检查它是否为空,并且fconn.canRead也返回true。考虑到并非每个设备都有SD卡插槽(最近的设备都有)。您可以检查卡是否可用,如this article中所述,或让catch处理异常。如果您在模拟器上进行测试,则必须“安装”虚拟SD卡。

也是这个电话:

ds.read(data);

将阻止,直到服务器实际向您发送内容。这可能是正在发生的事情。

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

ApplicationPermissions.PERMISSION_FILE_API 

对于网络连接,根据您连接的位置,您需要以下其中一个:

ApplicationPermissions.PERMISSION_INTERNET
ApplicationPermissions.PERMISSION_SERVER_NETWORK

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

答案 1 :(得分:0)

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

Connector.open("http://127.0.0.1/xml/home.xml");行上尝试将网址更改为http://127.0.0.1/xml/home.xml?interface=wifi

这将迫使模拟器使用模拟的WLAN连接,这实际上是您PC的网络接口。确保模拟器已连接到Default WLAN connection

此外,不是在屏幕上添加UI字段以查看代码中发生了什么,而是最好添加调试消息(例如System.out.println("Got connection"))并使用调试器 - 只需按F11即可在日食中。