1. URLclase

Hemos estudiado cómo trabajar con flujos de E/S. Hemos estudiado cómo trabajar con archivos. ¿Qué debemos estudiar a continuación? ¿Qué pasa con el trabajo con la red, incluido Internet? Suena prometedor, ¿no?

En Java, trabajar con Internet no es más difícil que trabajar con archivos. Bueno, tal vez sólo un poco.

Para trabajar con recursos de Internet, Java tiene una clase especial: URL. Es tan simple como un taburete, como ahora verás.

Conseguir una página web

¿Cuántas líneas de código crees que necesitas escribir para descargar algún archivo de texto de Internet y mostrar su contenido en la pantalla? 10? 100? 1000? ¿O tal vez 5?

Código Nota
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();
byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
Crea un objeto de URL con la ruta a la página.
Obtiene un correo InputStreamelectrónico del objeto de URL.
Lee todos los bytes y devuelve una matriz de bytes.
Convierte la matriz en una cadena.
Muestra la cadena.

El contenido de un archivo HTML se mostrará en la pantalla:

Salida de consola
<!DOCTYPE html><html lang="ru" class="light"><head>
    <meta charset="utf-8″>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1″>
    ...

Comparando trabajar con FileyURL

URLes similar a Fileo Path, pero Pathalmacena la ruta a un recurso en el sistema de archivos y URLalmacena la ruta a un recurso en Internet.

Toda la magia sucede cuando obtenemos un InputStreamobjeto gracias a una sola llamada al openStream()método. Este es un objeto ordinario, y ya lo hemos estudiado por dentro y por fuera. Todo se vuelve obvio después de obtener el InputStreamobjeto. Después de todo, ya sabemos cómo obtener datos de él.

Echa un vistazo: solo las dos primeras líneas son diferentes, y solo un poco. Y ahora puede verlo: la ventaja de la estandarización y el trabajo con cadenas de flujos de datos:

Trabajando con Internet Trabajar con un archivo
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();

byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
File file = new File("c:\\readme.txt");
InputStream input = new FileInputStream(file);

byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);


2. URLConnectionclase

Además de simplemente leer datos de Internet, también podemos subir datos. Cargar datos es mucho más complicado que leerlos. Vas a necesitar algunos métodos más. Por ejemplo:

Código Nota
URL url = new URL("https://codegym.cc");
URLConnection connection = url.openConnection();

// Get a stream for sending data
OutputStream output = connection.getOutputStream();
output.write(1); // Send data

// Get a stream for reading data
InputStream input = connection.getInputStream();
int data = input.read(); // Read data
Crear un objeto URL con la ruta a la página
Crear una conexión bidireccional


Obtener un flujo de salida
Poner datos en él


Obtener un flujo de entrada
Leer datos de él

Tenga en cuenta que ya no llamamos al url.openStream()método aquí. En cambio, tomamos una ruta más larga:

  • Primero establecemos una conexión bidireccional estable usando el URLConnection.openConnection()método
  • Luego obtenemos un flujo para enviar datos usando el connection.getOutputStream()método y enviar datos al servidor
  • Luego obtenemos un flujo para leer datos usando el connection.getInputStream()método y comenzamos a leer datos de él.

Administracion de recursos

Estrictamente hablando, debemos envolver todas las transmisiones en un try-with-resourcesbloque para un manejo seguro. Y no estaría de más envolver lo desnudo InputStreamy OutputStreamen algo más conveniente. Por ejemplo, en PrintStreamy BufferedReader.

Si hacemos todo eso, entonces nuestro código se verá así:

URL url = new URL("https://codegym.cc");
URLConnection connection = url.openConnection();

// Send data
try (OutputStream output = connection.getOutputStream();
   PrintStream sender = new PrintStream(output))
{
   sender.println("Hello");
}

// Read data
try(InputStream input = connection.getInputStream();
   BufferedReader reader = new BufferedReader(new InputStreamReader(input)))
{
   while (reader.ready())
      System.out.println(reader.readLine());
}

3. Ejemplos de trabajo con la red

Descarguemos algo de Internet. Y no solo descargarlo, sino guardarlo en el disco.

Por ejemplo, escribamos un programa que guarde una imagen de la página de inicio de Google en el disco.

En principio, no hay nada complicado aquí. En su forma más simple, este código se vería así:

Guardar un archivo en el disco
String image = "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
URL url = new URL(image);
InputStream input = url.openStream();

Path path = Path.of("c:\\GoogleLogo.png");
Files.copy(input, path);

Con la ayuda de las primeras tres líneas, recibimos un flujo de datos de un recurso de Internet, de una imagen.

En la cuarta línea, creamos el nombre del archivo en el que guardaremos la imagen. El nombre puede ser cualquier cosa, pero la extensión del archivo debe coincidir con la extensión de la imagen en Internet. Eso permitirá a los visores de imágenes locales abrirlo correctamente.

Y finalmente, la última línea es uno de los métodos Filesde la clase copy. La Filesclase tiene varios de ellos. Este método, que usamos, toma un flujo de bytes ( InputStream) como primer parámetro y como segundo parámetro, el nombre del archivo donde se deben escribir los datos.

Teóricamente, si el URLde la imagen fuera corto, entonces este código podría incluso escribirse en una sola línea:

Copiar datos de una transmisión a un archivo
Files.copy(
   new URL("https://www.google.com/logo.png").openStream(),
   Path.of("c:\\GoogleLogo.png")
);

Por supuesto, no tiene que escribirlo así, pero este ejemplo demuestra cuán convenientes y poderosas son las secuencias de E/S en Java.