Autor Tema: Leer archivo txt de un servidor remoto java y android studio URL api Java  (Leído 23012 veces)

ciberdrac

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
Después de varios días probando, no consigo leer un archivo txt que tengo alojado en el dropbox, consultando por la red he recopilado el siguiente código, pero la aplicación se detiene, a ver si alguien puede decirme dónde está el error y me saca del atasco.


Código: [Seleccionar]
public class MainActivity extends ActionBarActivity {

@override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);


String contents = "";
TextView t = (TextView) findViewById(R.id.TvProba);
t.setText("probando");

try {
URLConnection conn = new URL("https://www.dropbox.com/s/g0fythqeht80e53/version.txt?dl=0").openConnection();
InputStream in = conn.getInputStream();
contents = readStream(in);
} catch (MalformedURLException e) {
Log.w("", "MALFORMED URL EXCEPTION");
} catch (IOException e) {
Log.w(e.getMessage(), e);
}

t.setText( contents );
}

public String readStream(InputStream in) throws IOException {

BufferedReader r = null;
r = new BufferedReader(new InputStreamReader(in));
StringBuilder total = new StringBuilder();
String line;
while ((line = r.readLine()) != null) {
total.append(line);
}
if (r != null) {
r.close();
}
in.close();
return total.toString();
}


}
« Última modificación: 28 de Junio 2015, 12:57 por César Krall »

ciberdrac

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
Re:Leer archivo txt alojado en dropbox
« Respuesta #1 en: 21 de Junio 2015, 14:11 »
Bueno, finalmente he conseguido leer un archivo de un servidor remoto, aquí abajo os dejo el código, lo que pasa es que no me sirve, por que resulta que el archivo al que quiero acceder está en un servidor seguro, del tipo https, para ese tipo de acceso con este código no me vale, a ver si hay alguien que pueda orientarme como puedo utilizar el HttpsUrlConnection.

Código: [Seleccionar]
Thread leerarchivo = new Thread(){
            public void run() {
                try {
                        String contents = "";
                        TextView t = (TextView) findViewById(R.id.TvProba);
                        t.setText("probando");
                        URLConnection conn = new URL("http://www.LinkDelArchivo").openConnection();
                        InputStream in = conn.getInputStream();
                        contents = readStream(in);
                        t.setText(contents);
                } catch (MalformedURLException e) {
                    Log.w("", "MALFORMED URL EXCEPTION");
                } catch (IOException e) {
                    Log.w(e.getMessage(), e);
                }


            }
        };
        leerarchivo.start();
    }

    public String readStream(InputStream in) throws IOException {
        BufferedReader r = null;
        r = new BufferedReader(new InputStreamReader(in));
        StringBuilder total = new StringBuilder();
        String line;
        while ((line = r.readLine()) != null) {
            total.append(line);
        }
        if (r != null) {
            r.close();
        }
        in.close();
        return total.toString();
« Última modificación: 23 de Junio 2015, 18:37 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:Leer archivo txt alojado en dropbox
« Respuesta #2 en: 21 de Junio 2015, 18:26 »
Hola, para poner código en los foros hazlo como se indica en https://www.aprenderaprogramar.com/foros/index.php?board=1.0

No has indicado con qué lenguaje o versión de lenguaje estás trabajando ¿Puedes explicar con qué estás trabajando?

Salu2

ciberdrac

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
Re:Leer archivo txt alojado en dropbox
« Respuesta #3 en: 21 de Junio 2015, 19:32 »
Vaya, perdona no me había dado cuenta que aquí se postea de varios lenguajes, estoy trabajando con el android studio en java.

Gracias por avisarme del despiste.

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Re:Leer archivo txt alojado en dropbox
« Respuesta #4 en: 21 de Junio 2015, 21:25 »
Esta muy bien el código ciberdrac, gracias por el aporte, le daré un vistazo mas detenidamente luego.

Interesante la función append para concatenar en un String. Me la apunto :)

ciberdrac

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
Re:Leer archivo txt alojado en dropbox
« Respuesta #5 en: 21 de Junio 2015, 22:26 »
Gracias Lorenzo31, avisame si consigues algo parecido pero para servidores seguros (https), estoy rebuscando por la red pero hay muy poca informacion.

Un saludo.

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Hola no sé si tiene que ver pero la ruta que define el archivo en dropbox no permite la descarga directa, sino que lleva a una vista html. Puede que el problema esté en que deba usarse una url directa. Por ejemplo una ruta como esta lleva directo a un archivo txt: https://projecteuler.net/project/resources/p022_names.txt pero al escribir la ruta de dropbox hace una redirección y lleva a una vista en lugar del archivo txt propiamente dicho. A lo mejor el problema viene de ahí y no de que sea htpps ¿?

Salu2

ciberdrac

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
No quiero descargar el archivo, solamente leerlo, en mi modesta opinión el problema radica en que Java para el acceso a un archivo alojado en servidor remoto seguro, utiliza el HttpsUrl, y al intentar acceder con HttpUrl devuelve  error, eso es lo que creo

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Yo no estoy seguro de si es ese o no el problema, pero ten en cuenta una cosa: si no tienes acceso al archivo no podrás leerlo, de ahí la importancia de si la url da acceso al archivo o genera una redirección. Puedes hacer pruebas con este archivo que también está en una https: https://projecteuler.net/project/resources/p022_names.txt

Si puedes leer ese archivo y no el de dropbox el problema posiblemente esté relacionado con la ruta.

Salu2

ciberdrac

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
No puedo leer ninguno ni el mio del dropbox ni el tuyo, acceder a ellos via web sin problema, así es que definitivamente el problema está en el acceso a servidores seguros por medio de la instrucción HttpUrl; se debe utilizar el HttpsUrl, y no veo ningún ejemplo para orientarme, por la red hay poca información al respecto, a ver si alguien me saca del atasco...

Saludos.

javi in the sky

  • Avanzado
  • ****
  • Mensajes: 393
    • Ver Perfil
Hola a todos con este código he logrado leer el fichero de texto puesto de ejemplo por Ogramar (he utilizado java 8 ):

Código: [Seleccionar]
import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.io.IOException;

public class Ejemplo1{

    public static void main(String[]args){
        System.out.println("Resultado: "+leerFicheroUrl());

        }
   
public static String leerFicheroUrl() {
    String str1="";
    String str2="";
    try {
    // Create a URL for the desired page
    URL url = new URL("https://projecteuler.net/project/resources/p022_names.txt");
 
    // Read all the text returned by the server
    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
   
    while ((str1 = in.readLine()) != null) {
        str2 = str2 + str1;
    }
    in.close();
} catch (MalformedURLException e) {
} catch (IOException e) {
}
return str2;
}
   
}

Saludos!  ;D
« Última modificación: 27 de Junio 2015, 13:01 por javi in the sky »

ciberdrac

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
Estoy probando el código con el android studio y me saca de la aplicación, sabes si es compatible con android, o para utilizarla con el android studio hay que añadirle algo más ?

Saludos.

Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Hola

En android es posible que no te admita System.out.println

En su lugar debes usar Log.d("MENSAJE1", "Aqui el contenido del mensaje");

Al escribir Log.d la d indica que se trata de un mensaje de depuración (debug). También se puede usar Log.e para mensajes de error y Log.i para mensajes de información. Para ver la salida de las instrucciones Log se debe usar logcat, que es una herramienta en el SDK de Android. Si usas Eclipse y los plugins Android Developer Tools puedes usarlos para mostrar el logcat.

 ;D

ciberdrac

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
Hola, he intentado adaptar el código de  javi in the sky al android pero el programa se para en la linea en la que se crea el Buffer de lectura del archivo, si pongo una trayectoria a un archivo alojado en un servidor remoto no seguro (sin la s después del http) si que funciona, os dejo el código por si alguien ve donde está el error.

Saludos.

Código: [Seleccionar]
public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Thread leerarchivo = new Thread(){
            public void run() {
        try {
            String str1 = "";
            String str2 = "";
            TextView t = (TextView) findViewById(R.id.TvProba);
            URL url = new URL("https://projecteuler.net/project/resources/p022_names.txt");
            BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));  //////////   EL PROGRAMA SE PARA EN ESTA LINEA
            while ((str1 = in.readLine()) != null) {
                str2 = str2 + str1;
            }
            in.close();
            t.setText(str2);
        } catch (MalformedURLException e) {
            Log.w("", "MALFORMED URL EXCEPTION");
        } catch (IOException e) {
            Log.w(e.getMessage(), e);
        }
            }
        };
        leerarchivo.start();

    }
}
« Última modificación: 30 de Junio 2015, 14:26 por Ogramar »

Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Hola comprobaciones:

Comprobar que en el manifest.xml figure

<uses-permission android:name="android.permission.INTERNET" />

Además las operaciones de conexión con internet no deben ejecutarse en el hilo principal (UI), que debe quedar reservado para interactuar con el usuario  y mostrar componentes de interfaz de usuario. Para establecer conexiones debe usarse AsyncTask ó Thread.

Ejemplo 1:

Código: [Seleccionar]
private class MyAsyncTask extends AsyncTask<Void, Void, Void>{

    @Override
    protected Void doInBackground(Void... arg0) {
       URL url = null;
       try {
           url = new URL("https://projecteuler.net/project/resources/p022_names.txt");

           BufferedInputStream bis = new BufferedInputStream(url.openStream());
           byte[] buffer = new byte[1024];
           StringBuilder sb = new StringBuilder();
           int bytesRead = 0;
           while((bytesRead = bis.read(buffer)) > 0) {
               String text = new String(buffer, 0, bytesRead);
               sb.append(text);
           }
           bis.close();

       } catch (MalformedURLException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } catch (IOException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }

       return yourResult;
    }
}

Ejemplo 2:

Código: [Seleccionar]
private class MyAsyncTask extends AsyncTask<Void, Void, Void>{

    @Override
    protected Void doInBackground(Void... arg0) {
        doInBackground();   //your methods
        return null;
    }

    protected void doInBackground() {
        URL url = null;
        try {
            url = new URL("https://projecteuler.net/project/resources/p022_names.txt");

            BufferedInputStream bis = new BufferedInputStream(url.openStream());
            byte[] buffer = new byte[1024];
            StringBuilder sb = new StringBuilder();
            int bytesRead = 0;
            while((bytesRead = bis.read(buffer)) > 0) {
               String text = new String(buffer, 0, bytesRead);
               sb.append(text);
            }
           bis.close();


       } catch (MalformedURLException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } catch (IOException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }

   }

}

ciberdrac

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
Hola Mastermind, he adaptado tu código a la necesidad que tengo, utilizando el Thread, se trata de leer solamente los 6 primeros bytes de un fichero, con la primera url que no es https funciona con las otras dos que llevan el https no me funciona, sabes a que se debe ??.

Por supuesto que en el manifest lleva el permiso de acceso a internet.

Saludos y gracias por vuestra ayuda.

Código: [Seleccionar]
Thread leerarchivo = new Thread(){
            public void run() {
                URL url = null;
        try {
             TextView t = (TextView) findViewById(R.id.TvProba);

            url = new URL("http://www.benisport.net/p022_names.txt");  // Funciona           

          //url = new URL("https://projecteuler.net/project/resources/p022_names.txt");    // No Funciona
           //url = new URL("https://www.dropbox.com/s/p9qw6szq2p2whfe/p022_names.txt?dl=0");// No Funciona
           
           
            BufferedInputStream bis = new BufferedInputStream(url.openStream());
           
            byte[] buffer = new byte[6];
           
            int bytesRead = 0;
            bytesRead = bis.read(buffer);
            String text = new String(buffer, 0, bytesRead);
            bis.close();

            t.setText(text);

        } catch (MalformedURLException e) {
            Log.w("", "MALFORMED URL EXCEPTION");
        } catch (IOException e) {
            Log.w(e.getMessage(), e);
        }
            }
        };
        leerarchivo.start();
« Última modificación: 03 de Julio 2015, 15:05 por César Krall »

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".