How to download XML file from server and save it in SD card?

In my application i'm trying to download XML file from server and storing it in SD card.For this i'm using following code..

        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();
       }

this is giving me java.net.SocketException: The operation timed out exception...Please help me..I'm new to android development


Solution 1:

You can use Following code. This works for me

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();

Solution 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();
    }
}