Javaからwgetを呼び出してファイルをダウンロードしようとしていますが、ファイルサイズが制限されるという奇妙な問題が発生し続けています。
たとえば、「wget https://speed.hetzner.de/1GB.bin "」を発行すると、ファイルサイズが1,048,576,000(正確に1 GB)の1GB.binが正しく表示されます。しかし、Javaから同じコマンドを呼び出すと、一貫して約40MBのファイルになります。
JDKがインストールされていると仮定すると、この動作を再現する [〜#〜] mcve [〜#〜] があります。
echo 'class RunCommand {
public static void main(String[] args) throws Exception {
String s = "";
for (int i=0; i < args.length; i++)
s += (i > 0 ? " " : "") + args[i];
System.out.println(Runtime.getRuntime().exec(s).waitFor());
}
}' > RunCommand.Java
javac RunCommand.Java
Java RunCommand wget https://speed.hetzner.de/1GB.bin
私はこれをクリーンなAWSCentOS7.6マシンで次のすべてを使用して試しました。
私はいつも同じ結果になります:Javaがハングし、ファイルサイズは約40MBです。
また、-Xms1024m -Xmx1024m
を使用してヒープサイズを増やしてみましたが、ヒープサイズは問題ではないと結論付けました。
代わりにcurlを使用してまったく同じことを再度実行します。
Java RunCommand curl https://speed.hetzner.de/1GB.bin -o 1GB.bin
これは驚くほど機能し、1GBのファイルになりました。
したがって、ここには多くの質問があります。
-XX:+PrintFlagsFinal
で40をgrepしても、手がかりはありません)コマンドに--quietを追加してみてください。入力ストリームを介して読み取っていないため、おそらく標準出力はいっぱいです。
これはwgetのマニュアルから抜粋したものです。
-q
--quiet
Turn off Wget’s output.
以下のコードスニペットを確認してください。
import Java.util.ArrayList;
import Java.util.Arrays;
import Java.util.List;
/**
* Created on 2/13/2019.
*
* @author Julien Saab
*/
public class TestCommand {
public static void main(String[] args) throws Exception {
final List<String> commands = new ArrayList<>(Arrays.asList(args));
commands.add("--quiet");
final Process process = new ProcessBuilder().command(commands).start();
final int i = process.waitFor();
System.out.printf("Process exited with code %1$s\n", i);
}
}
あなたが使用しているのと同じファイルを試しましたが、41 MBを超えています(もちろん、完全にはダウンロードしていません)。
Java TestCommand wget https://speed.hetzner.de/1GB.bin