Java >> Java tutorial >  >> Java

Sådan downloader du en fil fra en URL i Java

Leder du efter at skabe din helt egen applikation, der kan downloade enhver fil med et enkelt klik? Hvis du ønsker en sådan funktion i din Java-applikation, er du på det rigtige sted. Mange udviklere kræver sådanne filoverførselsfunktioner i deres Java-applikation. I denne artikel lærer du, hvordan du downloader en fil ved hjælp af en URL i Java.

Hvad er at downloade en fil ved hjælp af en URL?

At downloade en fil gennem en Java-kode ved hjælp af en URL giver Java-applikationen mulighed for at downloade en fil direkte til et lokalt system fra et fjernlager eller ethvert andet lokalt lager. Denne proces læser en fil fra URL'en og skriver den til en lokal fil. Java tilbyder tre forskellige måder at downloade en fil ved hjælp af en URL.

1:Almindelig Java-struktur:

Hvis vi bruger Java uden at bruge noget eksternt bibliotek, tager det filen som input og læser disse data byte for byte. Hvis vi nu tager byte-for-byte-data fra en inputstrøm og skriver bytes til en filoutputstrøm, kan vi opnå download ved hjælp af URL.

Program:

import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.net.URL;
class Main{
    public static void URLDnldFile(URL urlink, String fileName) throws IOException{
        try (InputStream inp = urlink.openStream();
                BufferedInputStream bis = new BufferedInputStream(inp);
                FileOutputStream fops = new FileOutputStream(fileName)){
 
            byte[] d = new byte[1024];
            int i;
            while ((i = bis.read(d, 0, 1024)) != -1){
                fops.write(d, 0, i);
            }}}
    public static void main(String[] args) throws Exception{
        System.out.println("Call this method when you want your application to have this.");
        //Call the URLDnldFile() method
    }}

Forklaring:

Her skal vi importere BufferInputStream, FileInputStream, InputStream, IOException og java.net.URL. Opret nu en hovedklasse med en metode URLDnldFile(), der kaster IO-undtagelse. Funktionen bruger to parametre, et URL-link og det andet filnavn. Opret en variabel 'd' af typen byte. Strømmen af ​​bytes vil blive læst inden for denne metode ved hjælp af while-løkken.

2:Bruger Java.IO-pakken:

java.io er den traditionelle Java-pakke, der indeholder forskellige klasser. Den har nogle indbyggede klasser, der bruges eksplicit til at læse og skrive til en stream.

Program:

import java.net.URL;
import java.net.URLConnection;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
public class Main{
   public static void main(String[] args){
      OutputStream ops = null;
      InputStream ins = null;
      String fileLink = "http://200.156.21.23:8080/karlos/project1.txt";
      String oppath = "G:\\Downloads\\urlfile.txt";
      try {
    	URL url = new URL(fileLink);
        URLConnection connection = url.openConnection();
        ins = connection.getInputStream();
        ops = new FileOutputStream(oppath);
	final byte[] bt = new byte[1024];
	int len;
	while ((len = ins.read(bt)) != -1){
	   ops.write(bt, 0, len);}
      }catch (IOException ex){
	   ex.printStackTrace();
      }finally{
           // close streams
           System.out.println("URL's File downloaded....");   
      }}}

Forklaring:

Her skal vi importere URLConnection, FileOutputStream, IOException, InputStream og OutputStream. Indenfor main() skal du oprette et OutputStream- og InputStream-objekt og to strengvariabler til at holde URL-linket og filplaceringen. Indenfor prøveblokken skal du indstille URL'en og URLConnection ved hjælp af getInputStream(). Den følgende catch-blok vil håndtere enhver input-output-undtagelse og udføre printStackTrace(). Den endelige blok (som udføres automatisk som en obligatorisk del af programmet) vil vise meddelelsen "URL's fil downloadet."

3:Brug af NIO:

Java NIO (forkortet New IO) er en alternativ input-output Java API, der også kommer som en Java-pakke. NIO fungerer som et alternativ til standard Java IO og Java Networking API. Mens du bruger Java IO-biblioteket, læser strømmene data byte for byte. Men i Java NIO-pakken læses data som kanaler og buffere.

Program

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.io.File;

public class Main{
   public static void main(String[] args){
     try{
        String fileLink = "http://200.156.21.23:8080/karlos/project1.txt";
        String oppath = "G:\\Downloads\\urlfile.txt";
	URL link = new URL(fileLink);
        InputStream ins = link.openStream();
        ReadableByteChannel chh = Channels.newChannel(link.openStream());
	FileOutputStream fos = new FileOutputStream(new File(oppath));
	fos.getChannel().transferFrom(chh, 0, Long.MAX_VALUE);
	fos.close();
	chh.close();
     } catch(IOException ex){
          ex.printStackTrace();
     }}}

Forklaring:

Her skal vi importere URL'en, Channels (som er en del af NIO-pakken), FileOutputStream, IOException, InputStream OutputStream og java.io.File. Nu har vi inden for Main-klassen oprettet main(). Inde i main() og i try-blokken har vi oprettet to String-objekter med navnet fileLink og oppath, hvor vi har defineret URL-linket og filplaceringen. Så har vi lavet en input-stream til den fil, vi vil downloade. Derefter skal vi producere en ny kanal, der er ansvarlig for at læse dataene fra denne inputstrøm. Dernæst skal vi oprette en outputstrøm, der vil skrive filindholdet efter at have lagt det fra kanalobjektet. Nu skal vi hente kanalen fra denne outputstrøm og definere dens indhold fra kanalen. Den følgende catch-blok vil håndtere enhver input-output-undtagelse og udføre printStackTrace().

4:Brug af Apache Commons IO:

Apache Commons IO er en Java-hjælpepakke, der har en org.apache.commons.io.FileUtils-klasse. Den omfatter en copyURLToFile-metode, der kan hjælpe med at programmere IO-operationer. Denne metode tager 2 argumenter – Det første er java.net.URL-objektet, der peger på kildefilen, mens det andet er java.io.File-objektet, der peger på outputfilstien. Bemærk, at begge stier skal bestå af filnavn i slutningen. Outputstien skal være filplaceringen på dit lokale system, hvorfra filen bliver downloadet.

Program:

import org.apache.commons.io.FileUtils;
 
public class Main {
   public static void main(String[] args) {
      String fileLink = "http://200.156.21.23:8080/karlos/proj.zip";
      String oppath = "G:\\downloads\\proj.zip";
      FileUtils.copyURLToFile(new URL(fileLink), new File(oppath));
   }
}

You can further append Apache Commons IO dependency in your project.
<!– Maven –>
<dependency>
<groupId> org.apache.commons </groupId>
<artifactId> commons-io </artifactId>
<version> 1.3.2 </version>
</dependency>

// Gradle
compile group: ‘org.apache.commons’, name: ‘commons-io’, version: ‘1.3.2’

Forklaring:

Først skal vi importere apache.commons.io.FileUtils. Indenfor Main-klassen skal vi oprette main() inde i hvilken vi skal oprette to String-variabler til at holde URL-linket og filplaceringen. Brug nu metoden FileUtils.copyURLToFile() til at få programmet til at downloade en fil (fra den angivne placering) ved hjælp af URL'en (angivet). Denne metode tager to parametre fileLink og oppath, som vi har oprettet tidligere.

Konklusion:

Blandt disse fire teknikker er Apache Commons IO den nemmeste. Men det øger programstørrelsen og reducerer hastigheden på grund af inkludering af eksternt bibliotek. Metode 2, som bruger den allerede eksisterende IO-pakke, er den hurtigste, men ikke den nyeste tilgang. New Input-Output (NIO-pakke), som navnet antyder, er den nyeste IO-pakke, som er et alternativ til IO-pakken, kan også gavne dig, hvis du ønsker at udføre anderledes og nyeste I/O-operationer inden for dit program.


Java tag