1. URL
klasse
Vi har studeret arbejde med I/O-streams. Vi har studeret arbejdet med filer. Hvad skal vi så studere? Hvad med at arbejde med netværket, inklusive internettet? Det lyder lovende, gør det ikke?
I Java er det ikke sværere at arbejde med internettet end at arbejde med filer. Nå, måske bare en lille smule.
For at arbejde med internetressourcer har Java en speciel klasse — URL
. Det er så enkelt som en skammel, som du nu vil se.
At få en webside
Hvor mange linjer kode tror du, du skal skrive for at downloade en tekstfil fra internettet og vise dens indhold på skærmen? 10? 100? 1000? Eller måske 5?
Kode | Bemærk |
---|---|
|
Opretter et URL-objekt med stien til siden Henter et InputStream fra URL-objektet Læser alle bytes og returnerer et array af bytes Konverter arrayet til en streng Vis strengen |
Indholdet af en HTML-fil vil blive vist på skærmen:
Konsoludgang |
---|
|
Sammenligning af arbejde med File
ogURL
URL
ligner File
eller Path
, men Path
gemmer stien til en ressource i filsystemet og URL
gemmer stien til en ressource på internettet.
Al magien sker, når vi får et InputStream
objekt takket være et enkelt kald til openStream()
metoden. Dette er et almindeligt objekt, og vi har allerede studeret det inde og ude. Alt bliver tydeligt, efter vi har fået InputStream
genstanden. Vi ved jo allerede, hvordan man får data fra det.
Tag et kig: kun de to første linjer er forskellige, og kun lidt. Og nu kan du se det - fordelen ved standardisering og arbejde med kæder af datastrømme:
Arbejde med internettet | Arbejde med en fil |
---|---|
|
|
2. URLConnection
klasse
Udover blot at læse data fra internettet, kan vi også uploade data. At uploade data er meget mere kompliceret end at læse det. Du får brug for et par flere metoder. For eksempel:
Kode | Bemærk |
---|---|
|
Opret et URL-objekt med stien til siden Opret en tovejsforbindelse Hent en outputstrøm Læg data i den Få en inputstrøm Læs data fra den |
Bemærk, at vi ikke længere kalder url.openStream()
metoden her. I stedet tager vi en længere rute:
- Vi etablerer først en stabil tovejsforbindelse ved hjælp af
URLConnection.openConnection()
metoden - Så får vi en stream til at sende data ved hjælp af
connection.getOutputStream()
metoden og sende data til serveren - Så får vi en strøm til at læse data ved hjælp af
connection.getInputStream()
metoden og begynder at læse data fra den.
Ressourcestyring
Strengt taget bør vi pakke alle vandløb ind i en try-with-resources
blok for sikker håndtering. Og det ville ikke skade at pakke det bare InputStream
ind OutputStream
i noget mere bekvemt. For eksempel i PrintStream
og BufferedReader
.
Hvis vi gør alt det, vil vores kode se sådan ud:
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. Eksempler på at arbejde med netværket
Lad os downloade noget fra internettet. Og ikke bare downloade det, men gem det på disken.
Lad os f.eks. skrive et program, der gemmer et billede fra Googles hjemmeside til disk.
I princippet er der ikke noget kompliceret her. I sin enkleste form ville denne kode se sådan ud:
Gemmer en fil på disken |
---|
|
Ved hjælp af de første tre linjer modtager vi en datastrøm fra en internetressource - fra et billede.
I den fjerde linje opretter vi navnet på den fil, som vi vil gemme billedet til. Navnet kan være hvad som helst, men filtypenavnet skal svare til filtypenavnet på billedet på internettet. Det vil tillade lokale billedfremvisere at åbne det korrekt.
Og endelig er den sidste linje en af Files
klassens copy
metoder. Klassen Files
har flere af dem. Denne metode, som vi brugte, tager en bytestrøm ( InputStream
) som dens første parameter, og som den anden parameter - navnet på den fil, hvor dataene skal skrives.
Teoretisk set, hvis URL
billedet var kort, så kunne denne kode endda skrives på en enkelt linje:
Kopiering af data fra en stream til en fil |
---|
|
Du behøver selvfølgelig ikke skrive det sådan her, men dette eksempel viser, hvor praktiske og kraftfulde I/O-streams er i Java.
GO TO FULL VERSION