Быстрый способ чтения файла из входного потока, когда мы знаем размер с низким использованием памяти - PullRequest
0 голосов
/ 04 марта 2020

Есть ли более быстрый способ чтения из входного потока, когда мы знаем размер данных? Этот код у меня очень медленный:

File file = new File("file.jar");

if(!file.exists)file.createNewFile();
String url = "https://launcher.mojang.com/v1/objects/3870888a6c3d349d3771a3e9d16c9bf5e076b908/client.jar";
int len = 8461484;

InputStream is = new URL(url).openStream();

if(!file.exists())
    file.createNewFile();

PrintWriter writer = new PrintWriter(file);

for(long i = 0;i < len;i ++) {
    writer.write(is.read());
    writer.flush();
    System.out.println(i);
}
writer.close();

1 Ответ

0 голосов
/ 04 марта 2020

Использование буферизованных потоков ввода и вывода вместе с try-with-resources
(что обеспечивает закрытие всех потоков в EOJ)
Примерно так:

try(final InputStream  ist = new URL(url).openStream ();
    final InputStream  bis = new BufferedInputStream (ist);

    final OutputStream ost = new     FileOutputStream(file);
    final OutputStream bos = new BufferedOutputStream(ost))
{
    final byte[] bytes = new byte[64_000]; // <- as large as possible!
    /**/  int    count;

    while ((count = bis.read(bytes)) != -1) {
        bos.write(bytes, 0, count);
    }
}
...