2014-11-05 6 views
6

Desidero scaricare un file di testo da un URL Web e salvarlo localmente sul dispositivo e utilizzarlo nella mia app.Scaricamento di un file di testo dal web

Codice:

try { 
    File file = new File(getFilesDir(), "file.txt"); 
    if (file.length() > 0) { 
     //File already exists and it is not empty 
     return; 
    } 
    URL url = new URL("https://www.abc.com/file.txt"); 
    FileOutputStream fos = new FileOutputStream(file); 
    InputStream in = url.openStream(); 
    byte[] buffer = new byte[1024]; 
    int length = 0; 
    while ((length = in.read(buffer)) > 0) { 
     fos.write(buffer, 0, length); 
    } 
    fos.flush(); 
    fos.close(); 
} catch (Exception e) { 
    // TODO: 
} 

Come si può vedere, il codice va con getFilesDir() partendo dal presupposto che esiste sempre. Tuttavia ci sono alcune domande, con corretta connessione di rete e permessi:

  1. La mia ipotesi di getFilesDir() fallisce in ogni caso?
  2. Esistono casi di file non scaricati/contenuto errato ecc., Con questo codice?
  3. Una volta affrontato un problema in cui il file è stato scaricato ma ha tutti i caratteri codificati, non importa quante volte lo ho scaricato, aveva ancora lo stesso testo codificato. Solo quando ho reinstallato la mia app, è stato scaricato il testo corretto. E non ha mai avuto quel problema da allora. Qualche ragione per quel comportamento strano?

EDIT: Ecco che cosa ottengo come il contenuto quando si tenta di leggere il file che ho scaricato (succede a volte, 1 su 10) mostrato in logcat:

enter image description here

codice per leggere il file:

BufferedReader inputReader= = new BufferedReader(
     new InputStreamReader(new FileInputStream(file))); 
String inputString; 
StringBuffer stringBuffer = new StringBuffer(); 
while ((inputString = inputReader.readLine()) != null) { 
    Log.e("inputString: ", inputString); 
} 
inputReader.close(); 

Thank You

+0

getFilesDir() recapiterà sempre una directory di file. Ma potrebbe non esistere ancora penso. Quindi il codice viene scaricato? – greenapps

+0

Finora ciò che mai il dispositivo/emulatore ho testato, scarica il file correttamente. Ma vedo alcuni utenti che segnalano alcuni problemi. – Housefly

+0

Dai un'occhiata a questa domanda: [Android: come scaricare il file dal server e salvarlo nella cartella specifica in sdcard] (http://stackoverflow.com/questions/16117067/androidhow-to-download-the-file- from-the-server-and-save-it-in-specific-folder) –

risposta

2

La mia assunzione di getFilesDir() sicuro in ogni caso?

Secondo lo documentation, dovrebbe sempre funzionare senza autorizzazioni richieste.

Sono presenti casi di file non scaricati/contenuto errato ecc., con questo codice?

Certo, voglio dire solo una semplice goccia di connessione causerà scaricare fallimento e tante altre cose possono andare male come mancare autorizzato (android.permission.INTERNET), codifica sbagliata, disco pieno, ...

una volta ho dovuto affrontare un problema in cui il file viene scaricato, ma ha tutti codificati personaggi, non importa quanto possa volte ho scaricato, aveva ancora lo stesso testo codificato . Solo quando ho reinstallato la mia app, è stato scaricato il testo corretto . E non ha mai avuto quel problema da allora. Qualche ragione per quel comportamento strano?

Potrebbe essere stato un problema di codifica, avvolgere il vostro FileOutputStream in un OutputStreamWriter, che permette di passare la codifica dei parametri nel costruttore.

Writer writer = new OutputStreamWriter(fos); 
. 
. 
. 
writer.write(buffer, 0, length); 
0

Questa non è davvero una risposta, ma un consiglio, utilizzare ion una libreria di rete per Android.

Da esempi:

Ion.with(context) 
.load("http://example.com/really-big-file.zip") 
// have a ProgressBar get updated automatically with the percent 
.progressBar(progressBar) 
// and a ProgressDialog 
.progressDialog(progressDialog) 
// can also use a custom callback 
.progress(new ProgressCallback() {@Override 
    public void onProgress(int downloaded, int total) { 
     System.out.println("" + downloaded + "/" + total); 
    } 
}) 
.write(new File("/sdcard/really-big-file.zip")) 
.setCallback(new FutureCallback<File>() { 
    @Override 
    public void onCompleted(Exception e, File file) { 
     // download done... 
     // do stuff with the File or error 
    } 
}); 

Tutte le operazioni sono fatte non nel thread UI, in modo che l'utente vede sempre un'applicazione sensibile.

1

Il seguente esempio può essere utile:

try { 
    // Create a URL for the desired page 
    URL url = new URL("mysite.com/thefile.txt"); 

    // Read all the text returned by the server 
    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
    String str; 
    while ((str = in.readLine()) != null) { 
     // str is one line of text; readLine() strips the newline character(s) 
    } 
    in.close(); 
    } catch (MalformedURLException e) { 
    } catch (IOException e) { 
} 
+0

per Ulteriori dettagli è anche possibile fare riferimento [download di file dal server] (http://wininterview.blogspot.in/2013/04/download-file -in-android-from-remote.html) –

+0

E scriverlo usando 'FileOutputStream f = new FileOutputStream (file); f.write (str.getBytes()); '?? – Housefly

0

non posso commentare davvero su ciò che va male nel tuo caso, mi post un frammento di un codice che sto usando per rilevare il tipo di file' m targeting e poi ottenerlo. Questo ha sempre funzionato come previsto per me. Ho modificato il mio metodo "onPostExecute" per soddisfare la mia risposta qui e ho cercato di mantenere i nomi delle mie variabili simili ai tuoi. Ho omesso la barra di indicazione dello stato del download per semplificare lo snippet. Il download deve essere eseguito in background, quindi viene utilizzato "AsyncTask". Per lo snippet uso file di testo a caso da google.

final String file_url = "https://www.kernel.org/doc/Documentation/power/drivers-testing.txt"; 
String fileExtension = MimeTypeMap.getFileExtensionFromUrl(file_url); 
final String fileName = URLUtil.guessFileName(file_url, null, fileExtension); 
final String path = Environment.getExternalStorageDirectory().toString() + "/" + fileName; 

new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       URL url = new URL(file_url); 
       URLConnection connection = url.openConnection(); 
       connection.connect(); 

       // download the file 
       InputStream in = new BufferedInputStream(url.openStream()); 
       OutputStream output = new FileOutputStream(path); 
       byte buffer[] = new byte[1024]; 
       int length; 
       while ((length = in.read(buffer)) != -1) { 
        output.write(buffer, 0, length); 
       } 
       output.flush(); 
       output.close(); 
       in.close(); 
      } catch (IOException e) { 
       Log.e("Downloading file", "Download Error", e); 
      } 
      return null; 
     } 

     @Override 
     public void onPostExecute(Void result) { 
      try { 
       File file = new File(path); 

       BufferedReader inputReader = new BufferedReader(new FileReader(file)); 
       String inputString; 

       while ((inputString = inputReader.readLine()) != null) { 
        Log.e("inputString: ", inputString); 
       } 
       inputReader.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }.execute(); 
0

Prova con codice qui sotto:

public void downloadFile(){ 
    String DownloadUrl = "Paste Url to download a text file here…"; 
    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(DownloadUrl)); 
    request.setDescription("sample text file for testing"); //appears the same in Notification bar while downloading 
    request.setTitle("Sample.txt");     
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     request.allowScanningByMediaScanner(); 
     request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
    } 
    request.setDestinationInExternalFilesDir(getApplicationContext(),null, "sample.pdf"); 

    // get download service and enqueue file 
    DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
    manager.enqueue(request); 
} 

public static boolean isDownloadManagerAvailable(Context context) { 
    try { 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD) { 
      return false; 
     } 
     Intent intent = new Intent(Intent.ACTION_MAIN); 
     intent.addCategory(Intent.CATEGORY_LAUNCHER); 
     intent.setClassName("com.android.providers.downloads.ui","com.android.providers.downloads.ui.DownloadList"); 
     List <resolveinfo> list = context.getPackageManager().queryIntentActivities(intent, 
       PackageManager.MATCH_DEFAULT_ONLY); 
     return list.size() > 0; 
    } catch (Exception e) { 
     return false; 
    } 
} 
Problemi correlati