पिछले उत्तरों को संक्षेप में (और किसी तरह पॉलिश और अपडेट करने के लिए)। निम्नलिखित तीन विधियां व्यावहारिक रूप से समतुल्य हैं। (मैंने स्पष्ट टाइमआउट जोड़ा क्योंकि मुझे लगता है कि वे बहुत जरूरी हैं, जब कनेक्शन खो जाता है तो कोई भी हमेशा के लिए फ्रीज नहीं करना चाहता है।)
public static void saveUrl1(final Path file, final URL url,
int secsConnectTimeout, int secsReadTimeout))
throws MalformedURLException, IOException {
// Files.createDirectories(file.getParent()); // optional, make sure parent dir exists
try (BufferedInputStream in = new BufferedInputStream(
streamFromUrl(url, secsConnectTimeout,secsReadTimeout) );
OutputStream fout = Files.newOutputStream(file)) {
final byte data[] = new byte[8192];
int count;
while((count = in.read(data)) > 0)
fout.write(data, 0, count);
}
}
public static void saveUrl2(final Path file, final URL url,
int secsConnectTimeout, int secsReadTimeout))
throws MalformedURLException, IOException {
// Files.createDirectories(file.getParent()); // optional, make sure parent dir exists
try (ReadableByteChannel rbc = Channels.newChannel(
streamFromUrl(url, secsConnectTimeout,secsReadTimeout)
);
FileChannel channel = FileChannel.open(file,
StandardOpenOption.CREATE,
StandardOpenOption.TRUNCATE_EXISTING,
StandardOpenOption.WRITE)
) {
channel.transferFrom(rbc, 0, Long.MAX_VALUE);
}
}
public static void saveUrl3(final Path file, final URL url,
int secsConnectTimeout, int secsReadTimeout))
throws MalformedURLException, IOException {
// Files.createDirectories(file.getParent()); // optional, make sure parent dir exists
try (InputStream in = streamFromUrl(url, secsConnectTimeout,secsReadTimeout) ) {
Files.copy(in, file, StandardCopyOption.REPLACE_EXISTING);
}
}
public static InputStream streamFromUrl(URL url,int secsConnectTimeout,int secsReadTimeout) throws IOException {
URLConnection conn = url.openConnection();
if(secsConnectTimeout>0) conn.setConnectTimeout(secsConnectTimeout*1000);
if(secsReadTimeout>0) conn.setReadTimeout(secsReadTimeout*1000);
return conn.getInputStream();
}
मुझे महत्वपूर्ण अंतर नहीं मिला, सब मुझे सही लगता है। वे सुरक्षित और कुशल हैं। (गति में अंतर शायद ही प्रासंगिक लगता है - मैं स्थानीय सर्वर से एसएसडी डिस्क में 180Mb लिखता हूं जो कि 1.2 से 1.5 सेगमेंट के आसपास उतार-चढ़ाव करता है)। उन्हें बाहरी पुस्तकालयों की आवश्यकता नहीं है। सभी मनमाने आकार और (मेरे अनुभव के साथ) HTTP पुनर्निर्देशन के साथ काम करते हैं।
इसके अतिरिक्त, FileNotFoundException
यदि संसाधन नहीं मिला है तो सभी फेंक देते हैं (त्रुटि 404, आमतौर पर), और java.net.UnknownHostException
यदि DNS रिज़ॉल्यूशन विफल हो गया; अन्य IOException ट्रांसमिशन के दौरान त्रुटियों के अनुरूप हैं।
(समुदाय विकि के रूप में चिह्नित, जानकारी या सुधार जोड़ने के लिए स्वतंत्र महसूस करें)