2016-07-14 18 views
-1

Ich habe eine Textdatei (* .txt) auf einen Server hochgeladen, jetzt möchte ich die Textdatei lesen ...Android - Wie kann ich eine Textdatei von einer URL lesen?

Ich habe dieses Beispiel ohne Glück versucht.

ArrayList<String> urls=new ArrayList<String>(); //to read each line 
TextView t; //to show the result 
try { 
     // Create a URL for the desired page 
     URL url = new URL("mydomainname.de/test.txt"); //My text file location 
     // Read all the text returned by the server 
     BufferedReader in = new BufferedReader(new  InputStreamReader(url.openStream())); 

    t=(TextView)findViewById(R.id.TextView1); 
    String str; 
    while ((str = in.readLine()) != null) { 
     urls.add(str); 


    } 
    in.close(); 
    } catch (MalformedURLException e) { 
    } catch (IOException e) { 
} 
t.setText(urls.get(0)); // My TextFile has 3 lines 

App selbst endet ... Kann es mit dem Domainnamen sein up? Sollte es stattdessen eine IP geben? Ich habe herausgefunden, dass die While-Schleife nicht ausgeführt wird. Weil, wenn ich t.setText * in die while-Schleife setzen, gibt es keinen Fehler, und die TextView ist leer. LogCat Fehler: http://textuploader.com/5iijr es markieren die Linie mit t.setText(urls.get(0));

Vielen Dank im Voraus!

+3

"mydomainname.de/test.txt" keine gültige URL ist. Als Folge wird der 'URL'-Konstruktor eine' MalformedURLException' werfen, die Sie vollständig ignorieren. Als eine zweite Folge ist Ihre Liste in URLs nicht gefüllt und bleibt leer. – Seelenvirtuose

+0

Ich habe den Original-Link entfernt, der gültig ist, wie weit ist meine Liste nicht gefüllt? Ich habe es nicht verstanden. @Seelenvirtuose – killertoge

+0

Sie initialisieren die Variablen URLs mit einer leeren Liste. Dann haben Sie einen try-catch-Block, in dem Sie zuerst ein 'URL'-Objekt mit einer _malformed_ URL erstellen. Sie erhalten also eine Ausnahme. Und das lässt Ihre Variablen "URLs" unverändert. Nicht mehr und nicht weniger. Fazit: Ausnahmen nicht verschlucken! Drucken Sie zumindest den Stack-Trace: 'e.printStackTrace()'. – Seelenvirtuose

Antwort

4

Versuchen Sie, eine HttpURLConnection oder einen OKHTTP Antrag mit den Informationen zu erhalten, hier versuchen Sie dies:

immer jede Art tun, in einem Hintergrund-Thread sonst android Vernetzung wird eine NetworkOnMainThread Ausnahme

new Thread(new Runnable(){ 

    public void run(){ 


    ArrayList<String> urls=new ArrayList<String>(); //to read each line 
    //TextView t; //to show the result, please declare and find it inside onCreate() 



    try { 
     // Create a URL for the desired page 
     URL url = new URL("http://somevaliddomain.com/somevalidfile"); //My text file location 
     //First open the connection 
     HttpURLConnection conn=(HttpURLConnection) url.openConnection(); 
     conn.setConnectTimeout(60000); // timing out in a minute 

     BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 

     //t=(TextView)findViewById(R.id.TextView1); // ideally do this in onCreate() 
     String str; 
     while ((str = in.readLine()) != null) { 
      urls.add(str); 
     } 
     in.close(); 
    } catch (Exception e) { 
     Log.d("MyTag",e.toString()); 
    } 

    //since we are in background thread, to post results we have to go back to ui thread. do the following for that 

    Activity.this.runOnUiThread(new Runnable(){ 
     public void run(){ 
      t.setText(urls.get(0)); // My TextFile has 3 lines 
     } 
    }); 

    } 
}).start(); 
+0

urls.get (0) wird nur die erste Zeile erhalten -> ändern Sie es wie benötigt. – Kushan

0
werfen

Versuchen Sie es mit diesem. Für mich geht das.

private static String readText(){ 
    String link="http://.../file.txt"; 
    ArrayList<String> al=new ArrayList<>(); 

    try{ 
     URL url = new URL(link); 
     URLConnection conn = url.openConnection(); 
     conn.setDoOutput(true); 
     conn.connect(); 

     InputStream is = conn.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(is, "UTF-8"); 
     BufferedReader br = new BufferedReader(isr); 
     String line; 

     try { 
      while ((line = br.readLine()) != null) { 
       al.add(line); 
      } 
     } finally { 
      br.close(); 
     } 
    }catch (IOException e){ 
     e.printStackTrace(); 
    } 
    return al.get(0); 
} 

So

t.setText(readText()); 
1

1-) Internet-Erlaubnis Ihre Manifest-Datei hinzufügen.

2-) Stellen Sie sicher, dass Sie Ihren Code in einem separaten Thread starten.

Hier ist das Schnipsel, das für mich großartig funktioniert.

public List<String> getTextFromWeb(String urlString) 
    { 
     URLConnection feedUrl; 
     List<String> placeAddress = new ArrayList<>(); 

     try 
     { 
      feedUrl = new URL(urlString).openConnection(); 
      InputStream is = feedUrl.getInputStream(); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));   
      String line = null; 

      while ((line = reader.readLine()) != null) // read line by line 
      { 
       placeAddress.add(line); // add line to list 
      } 
      is.close(); // close input stream 

      return placeAddress; // return whatever you need 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

Unsere Leser Funktion ist bereit, nennen wir es von einem anderen Thread mit

  new Thread(new Runnable() 
      { 
       public void run() 
       { 
        final List<String> addressList = getTextFromWeb("http://www.google.com/sometext.txt"); // format your URL 
        runOnUiThread(new Runnable() 
        { 
         @Override 
         public void run() 
         { 
          //update ui 
         } 
        }); 
       } 
      }).start(); 
+0

das funktioniert, aber ich habe etwas Zeit genommen, um das Update zu füllen ui Kommentar, den Sie hinzugefügt haben, und ich wandle, um es hier zu erwähnen, möglicherweise jemand braucht es 'StringBuilder sb = new StringBuilder(); für (String s: placeAddress) { sb.append (s); sb.append ("\ n"); } Textansicht lyricsTextView = (Textansicht) getView(). FindViewById (R.id.lyricsTextView); lyricsTextView.setText (sb.toString()); ' –

Verwandte Themen