Multiple Ways to Download Files from Internet in Java

Larry Deng
2 min readApr 3, 2023

It's very common we need to download files from Internet and there are several ways to do in Java. Let me introduce them.

Java IO

We use BufferedInputStream to read and FileOutputStream to write to the local file:

private static void javaIO() {
try {
try (BufferedInputStream in = new BufferedInputStream(new URL(URL).openStream());
FileOutputStream fileOutputStream = new FileOutputStream("pkslow.io.html")) {
byte dataBuffer[] = new byte[1024];
int bytesRead;
while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) {
fileOutputStream.write(dataBuffer, 0, bytesRead);
}
} catch (Exception e) {
// handle exception
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}

Java NIO 1

Code as below:

private static void javaNIO1() {
try {
URL website = new URL(URL);
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream("pkslow.nio.html");
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}

Java NIO 2

We use Files.copy, code as below:

private static void javaNIO2() {
try {
URL website = new URL(URL);
try (InputStream in = website.openStream()) {
Files.copy(in, Paths.get("pkslow.nio2.html"), StandardCopyOption.REPLACE_EXISTING);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}

Apache Common IO

Add the dependency:

<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>

We use FileUtils.copyURLToFile method to download:

private static void apacheCommonIO() {
try {
URL website = new URL(URL);
FileUtils.copyURLToFile(website, new File("pkslow.commonsIO.html"));
} catch (Exception e) {
throw new RuntimeException(e);
}
}

OKHttpClient

Add the dependency:

<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.10.0</version>
</dependency>

Use FileOutputStream to save the response body:

private static void okHttpClient(String downloadUrl) {
try {
OkHttpClient client = new OkHttpClient();
okhttp3.Request request = new okhttp3.Request.Builder().url(downloadUrl).build();
okhttp3.Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
throw new IOException("Failed to download file: " + response);
}
FileOutputStream fos = new FileOutputStream("pkslow.okHttpClient.html");
fos.write(response.body().bytes());
fos.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}

AsyncHttpClient

Add the dependency:

<dependency>
<groupId>org.asynchttpclient</groupId>
<artifactId>async-http-client</artifactId>
<version>2.12.3</version>
</dependency>

Use FileOutputStream to save the file:

private static void asyncHttpClient() {
try {
AsyncHttpClient client = Dsl.asyncHttpClient();
FileOutputStream stream = new FileOutputStream("pkslow.asyncHttpClient.html");
client.prepareGet(URL).execute(new AsyncCompletionHandler<FileOutputStream>() {
@Override
public State onBodyPartReceived(HttpResponseBodyPart bodyPart)
throws Exception {
stream.getChannel().write(bodyPart.getBodyByteBuffer());
return State.CONTINUE;
}

@Override
public FileOutputStream onCompleted(Response response)
throws Exception {
return stream;
}
});
} catch (Exception e) {
throw new RuntimeException(e);
}
}

Code

Please check the code in GitHub.

--

--