【问题标题】:How to download XML file from server and save it in SD card?如何从服务器下载 XML 文件并将其保存在 SD 卡中?
【发布时间】:2012-01-24 11:53:33
【问题描述】:

在我的应用程序中,我尝试从服务器下载 XML 文件并将其存储在 SD 卡中。为此,我使用以下代码..

        try {
               File root = android.os.Environment.getExternalStorageDirectory();               

               File dir = new File (root.getAbsolutePath() + "/project");
               if(dir.exists()==false) {
                    dir.mkdirs();
               }

               URL url = new URL("url"); //you can write here any link
               File file = new File(dir, name);

               long startTime = System.currentTimeMillis();
               Log.d("DownloadManager", "download begining");
               Log.d("DownloadManager", "download url:" + url);
               Log.d("DownloadManager", "downloaded file name:" + name);

               /* Open a connection to that URL. */
               URLConnection ucon = url.openConnection();

               /*
                * Define InputStreams to read from the URLConnection.
                */
               InputStream is = ucon.getInputStream();
               BufferedInputStream bis = new BufferedInputStream(is);

               /*
                * Read bytes to the Buffer until there is nothing more to read(-1).
                */
               ByteArrayBuffer baf = new ByteArrayBuffer(5000);
               int current = 0;
               while ((current = bis.read()) != -1) {
                  baf.append((byte) current);
               }



               /* Convert the Bytes read to a String. */
               FileOutputStream fos = new FileOutputStream(file);
               fos.write(baf.toByteArray());
               fos.flush();
               fos.close();
               Log.d("DownloadManager", "download ready in" + ((System.currentTimeMillis() - startTime) / 1000) + " sec");

       } catch (IOException e) {
           e.printStackTrace();
       }

这给了我 java.net.SocketException: The operation timed out 异常...请帮助我..我是 android 开发新手

【问题讨论】:

  • 你在 manifest.xml 中添加了 android.permission.INTERNET 吗?如果是,请检查设备中的互联网连接。
  • 试试这个链接可能对你有帮助stackoverflow.com/questions/4470457/…

标签: android


【解决方案1】:

您可以使用以下代码。这对我有用

URL url = new URL("some url");

//create the new connection

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

//set up some things on the connection

urlConnection.setRequestMethod("GET");

urlConnection.setDoOutput(true);

//and connect!

urlConnection.connect();

//set the path where we want to save the file

//in this case, going to save it on the root directory of the

//sd card.

File SDCardRoot = new File("/sdcard/"+"Some Folder Name/");

//create a new file, specifying the path, and the filename

//which we want to save the file as.

File file = new File(SDCardRoot,"some file name");

//this will be used to write the downloaded data into the file we created

FileOutputStream fileOutput = new FileOutputStream(file);

//this will be used in reading the data from the internet

InputStream inputStream = urlConnection.getInputStream();

//this is the total size of the file

int totalSize = urlConnection.getContentLength();

//variable to store total downloaded bytes

int downloadedSize = 0;

//create a buffer...

byte[] buffer = new byte[1024];

int bufferLength = 0; //used to store a temporary size of the buffer

//now, read through the input buffer and write the contents to the file

while ( (bufferLength = inputStream.read(buffer)) > 0 ) 

{

//add the data in the buffer to the file in the file output stream (the file on the sd card

fileOutput.write(buffer, 0, bufferLength);

//add up the size so we know how much is downloaded

downloadedSize += bufferLength;

int progress=(int)(downloadedSize*100/totalSize);

//this is where you would do something to report the prgress, like this maybe

//updateProgress(downloadedSize, totalSize);

}

//close the output stream when done

fileOutput.close();

【讨论】:

    【解决方案2】:
    public void DownloadFiles(){
    
        try {
            URL url = new URL("http://nodeload.github.com/nexes/Android-File-Manager/zipball/master");
            URLConnection conexion = url.openConnection();
            conexion.connect();
            int lenghtOfFile = conexion.getContentLength();
            InputStream is = url.openStream();
            File testDirectory = new File(Environment.getExternalStorageDirectory() + "/Folder");
            if (!testDirectory.exists()) {
                testDirectory.mkdir();
            }
            FileOutputStream fos = new FileOutputStream(testDirectory + "/zip.zip");
            byte data[] = new byte[1024];
            int count = 0;
            long total = 0;
            int progress = 0;
            while ((count = is.read(data)) != -1) {
                total += count;
                int progress_temp = (int) total * 100 / lenghtOfFile;
                if (progress_temp % 10 == 0 && progress != progress_temp) {
                    progress = progress_temp;
                }
                fos.write(data, 0, count);
            }
            is.close();
            fos.close();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    

    【讨论】:

    • 感谢代码运行良好。但我得到的文件是无用的。您提供了名称“zip/zip”,但我将这个“myxml.xml”保存为 xml,并且在更改扩展名后,它显示已损坏
    • 您是否更改了服务器地址?如果是,那么在写入时由于连接不正确而损坏。
    猜你喜欢
    • 2023-03-14
    • 2013-04-13
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    相关资源
    最近更新 更多