Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: ciberdrac en 20 de Junio 2015, 19:23
-
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.
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();
}
}
-
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.
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();
-
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
-
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.
-
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 :)
-
Gracias Lorenzo31, avisame si consigues algo parecido pero para servidores seguros (https), estoy rebuscando por la red pero hay muy poca informacion.
Un saludo.
-
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
-
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
-
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
-
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.
-
Hola a todos con este código he logrado leer el fichero de texto puesto de ejemplo por Ogramar (he utilizado java 8 ):
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
-
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.
-
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
-
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.
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();
}
}
-
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:
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:
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();
}
}
}
-
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.
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();