কিভাবে জাভা ব্যবহার করে ইন্টারনেট থেকে একটি ফাইল ডাউনলোড এবং সংরক্ষণ করবেন?


425

একটি অনলাইন ফাইল আছে (যেমন http://www.example.com/information.asp) আমাকে দখল করতে হবে এবং একটি ডিরেক্টরিতে সংরক্ষণ করতে হবে। আমি জানি অনলাইন ফাইল (ইউআরএল) লাইন বাই লাইন দখল এবং পড়ার জন্য বেশ কয়েকটি পদ্ধতি রয়েছে তবে জাভা ব্যবহার করে কেবল ফাইলটি ডাউনলোড এবং সংরক্ষণ করার কোনও উপায় আছে?


উত্তর:


559

দিন জাভা Nio ব্যবহার করে দেখুন:

URL website = new URL("http://www.website.com/information.asp");
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream("information.html");
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);

ব্যবহার transferFrom()হয় সম্ভাব্য অনেক একটি সহজ লুপ উৎস চ্যানেল থেকে পড়ে এবং এই চ্যানেলে লিখেছেন অধিক কার্যকরী। অনেক অপারেটিং সিস্টেমগুলি সরাসরি সোর্স চ্যানেল থেকে বাইটগুলি সরাসরি ফাইল সিস্টেম ক্যাশে অনুলিপি করতে পারে।

এটি সম্পর্কে এখানে আরও চেক করুন

দ্রষ্টব্য : স্থানান্তর তৃতীয় প্যারামিটার হ'ল স্থানান্তরিত করতে সর্বাধিক সংখ্যক বাইট। Integer.MAX_VALUEসর্বাধিক 2 ^ 31 বাইট স্থানান্তর করবে, Long.MAX_VALUEসর্বাধিক 2 ^ 63 বাইট (অস্তিত্বের কোনও ফাইলের চেয়ে বড়) অনুমতি দেবে।


22
জাভা Java দিয়ে তিনটিই রিসোর্স-দিয়ে রিসোর্স দিয়ে বন্ধ করুন: চেষ্টা করুন (ইনপুটস্ট্রিম ইনপুটস্ট্রিম = ওয়েবসাইট.পেনস্ট্রিম (); রিডেবলবাইটচ্যানেল রিডেবলবাইটচ্যানেল = চ্যানেলস.নিউচ্যানেল (ইনপুটস্ট্রিম); ফাইলআউটপ্রেম স্ট্রিম ফাইলআউটপ্রেম স্ট্রিম = নতুন ফাইলআউটপুটস্ট্রিম (আউটপুটফ্রন্টমর্ম)। (পঠনযোগ্য বাইট চ্যানেল, 0, 1 << 24); }
mazatwork

80
এটি কেবলমাত্র কোনও ফাইলের প্রথম 16 এমবি ডাউনলোড করবে: স্ট্যাকওভারফ্লো
বেন ম্যাকক্যান

31
@ কিরডি আর আমি যদি 8388608টিবি এর চেয়ে বেশি চাই ?
ক্রંચার

22
একটি একক কল পর্যাপ্ত নয়। transferFrom()একক কলে পুরো ট্রান্সফার সম্পন্ন করার জন্য নির্দিষ্ট করা হয়নি। এজন্য এটি একটি গণনা ফেরত দেয়। আপনাকে লুপ করতে হবে।
মারকুইস

11
কেন এই উত্তর এমনকি গ্রহণ করা হয়েছিল? URL::openStream()কেবল একটি নিয়মিত স্ট্রিম ফেরায়, এর অর্থ পুরো ট্র্যাফিক এখনও জাভা বাইট [] অ্যারে মাধ্যমে দেশীয় বাফারগুলিতে না গিয়ে অনুলিপি করা হচ্ছে। কেবলমাত্র fos.getChannel()একটি নেটিভ চ্যানেল তাই ওভারহেড পূর্ণ থাকে। এই ক্ষেত্রে এনআইও ব্যবহার করা শূন্যের লাভ। ভাঙা ছাড়াও, যেমনটি ইজেপি এবং বেন ম্যাকক্যান সঠিকভাবে লক্ষ্য করেছে।
Ext3h

494

অ্যাপাচি কমন্স-আইও , কেবল একটি লাইন কোড ব্যবহার করুন:

FileUtils.copyURLToFile(URL, File)

22
নিস! আমি যা খুঁজছি! আমি জানতাম আপাচি গ্রন্থাগারগুলি ইতিমধ্যে এটি কভার করবে। বিটিডাব্লু, এটি টাইমআউট পরামিতিগুলির সাথে ওভারলোড হওয়া সংস্করণ ব্যবহার করার পরামর্শ দেওয়া হচ্ছে!
হেন্ডি ইরাওয়ান

6
... এবং সেই ওভারলোড হওয়া সংস্করণটি ব্যবহার করার সময় মনে রাখবেন যে টাইমআউটগুলি সেকেন্ড নয়, মিলিসেকেন্ডে নির্দিষ্ট রয়েছে।
Láslól ভ্যান ডেন Hoek

5
লক্ষ্য করুন যে copyURLToFileটাইমআউট প্যারামিটারটি কেবল কমন্স আইও লাইব্রেরির ২.০ সংস্করণ থেকে উপলব্ধ। জাভা ডক্স
স্ট্যানলি

6
মৌলিক প্রমাণীকরণ শিরোনামটি যদি অনুরোধে যুক্ত করতে হয় তবে কী হবে? এখানে কি কাজ আছে?
দামিয়ান

3
যদিও এটি "সংক্ষিপ্ত", এটি আসলে খুব ধীর।
মিনক্রাফ্ট

123

সহজ নিও ব্যবহার:

URL website = new URL("http://www.website.com/information.asp");
try (InputStream in = website.openStream()) {
    Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING);
}

5
দুর্ভাগ্যক্রমে "302 পাওয়া" এর মতো পুনর্নির্দেশের ক্ষেত্রে নিঃশব্দে এটি নিঃশব্দে ব্যর্থ হয় (0 বাইট ডাউনলোডগুলি)।
আলেকজান্ডার কে

1
@ আলেকজান্দারক তবে আপনি কেন অন্ধভাবে কেন এই জাতীয় উত্স ডাউনলোড করবেন?
xesheng

5
এটি একটি মার্জিত সমাধান হওয়া সত্ত্বেও, পর্দার আড়ালে এই পদ্ধতিটি আপনাকে নিঃশব্দে বিশ্বাসঘাতকতা করতে পারে। ফাইলসকপি (ইনপুটস্ট্রিম, পাথস, ফাইলঅપ્শন) অনুলিপি প্রক্রিয়া ফাইলসকপি (ইনপুটস্ট্রিম, আউটপুট স্ট্রিম) এর হাতে দেয়। এই শেষ পদ্ধতিটি স্ট্রিমের সমাপ্তি (-1) যাচাই করে না তবে বাইট না পড়ে (0) পরীক্ষা করে। এর অর্থ হ'ল, যদি আপনার নেটওয়ার্কটিতে কিছুটা বিরতি থাকে তবে এটি 0 বাইট পড়তে এবং অনুলিপি প্রক্রিয়াটি শেষ করতে পারে, এমনকি যদি ওএস দ্বারা স্ট্রিম ডাউনলোড করা শেষ না হয়।
মিয়ার

6
@ মিয়ের InputStream.read()আপনি শূন্য দৈর্ঘ্যের বাফার বা গণনা, 'সামান্য বিরতি' বা অন্যথায় সরবরাহ না করা হলে শূন্য ফিরে পাওয়া অসম্ভব । কমপক্ষে একটি বাইট স্থানান্তরিত বা স্ট্রিমের শেষ বা ত্রুটি না হওয়া পর্যন্ত এটি অবরুদ্ধ থাকবে। ইন্টার্নালগুলি সম্পর্কে আপনার দাবি Files.copy()ভিত্তিহীন।
লার্নের মারকুইস

3
আমার একটি ইউনিট পরীক্ষা আছে যা 2.6TiB সহ বাইনারি ফাইল পড়ে। ফাইলসকপি ব্যবহার করা এটি সর্বদা আমার এইচডিডি স্টোরেজ সার্ভারে (এক্সএফএস) ব্যর্থ হয় তবে এটি আমার এসএসএইচ থেকে কয়েকগুণ ব্যর্থ হয়। JDK 8 ফাইলপোপির কোডটি দেখে আমি সনাক্ত করেছি যে এটি '> 0' 'লুপটি' ছেড়ে যাওয়ার জন্য পরীক্ষা করে। আমি ঠিক একই কোডটি -1 দিয়ে অনুলিপি করেছি এবং উভয় ইউনিট পরীক্ষা আর কখনও থামেনি। একবার ইনপুট স্ট্রিম নেটওয়ার্ক এবং স্থানীয় ফাইল বর্ণনাকারীদের উপস্থাপন করতে পারে এবং উভয় আইও ক্রিয়াকলাপ ওএস প্রসঙ্গের স্যুইচিংয়ের সাপেক্ষে, আমি বুঝতে পারি না যে আমার দাবিটি ভিত্তিহীন। কেউ দাবি করতে পারে এটি ভাগ্যক্রমে কাজ করছে, তবে এটি আর মাথাব্যথা দেয় না।
মিয়ার

85
public void saveUrl(final String filename, final String urlString)
        throws MalformedURLException, IOException {
    BufferedInputStream in = null;
    FileOutputStream fout = null;
    try {
        in = new BufferedInputStream(new URL(urlString).openStream());
        fout = new FileOutputStream(filename);

        final byte data[] = new byte[1024];
        int count;
        while ((count = in.read(data, 0, 1024)) != -1) {
            fout.write(data, 0, count);
        }
    } finally {
        if (in != null) {
            in.close();
        }
        if (fout != null) {
            fout.close();
        }
    }
}

আপনার ব্যতিক্রমগুলি পরিচালনা করতে হবে, সম্ভবত এই পদ্ধতির বাইরে to


6
খুব দ্রুত ডাউনলোড কিভাবে? ডাউনলোড এক্সিলারেটর পছন্দ?
digz6666

11
যদি in.closeব্যতিক্রম নিক্ষেপ করে, fout.closeতাকে বলা হয় না।
বেরিলিয়াম

1
পছন্দ করেছেন BufferedInputStreamসকেট টাইমআউটগুলিতে একটি ব্যবহার করা সুনির্দিষ্টভাবে শূন্য প্রভাব ফেলে। আপনি উদ্ধৃত করেছেন 'ব্যাকগ্রাউন্ডের বিশদ' আমার মন্তব্যে আমি এরই মধ্যে 'নগরকথার' হিসাবে খণ্ডন করেছি। তিন বছর আগে।
মারকুইস

@ এজেপি সংশোধনের জন্য আপনাকে ধন্যবাদ! আমি আমার মন্তব্য সরিয়ে নিয়েছি (সংরক্ষণাগারটির জন্য: আমি এই উত্তরের সাথে লিঙ্ক দিয়েছিলাম যে BufferedInputStream"অপ্রত্যাশিত ব্যর্থতার কারণ হতে পারে")।
কমফ্রিচ

+1 এই উত্তরের (এবং অন্যদের এখানে) আমার একমাত্র আপত্তিটি হ'ল কলার কিছু সংযোগ ত্রুটি থেকে "খুঁজে পাওয়া যায়নি" ইভেন্টটিকে পৃথক করতে পারে না (যার উপর আপনি আবার চেষ্টা করতে চাইতে পারেন)।
লিওনব্লায়

24

এটি একটি পুরানো প্রশ্ন তবে এখানে একটি সংক্ষিপ্ত, পঠনযোগ্য, সঠিকভাবে বদ্ধ সম্পদ সহ জেডিকে একমাত্র সমাধান:

public static void download(String url, String fileName) throws Exception {
    try (InputStream in = URI.create(url).toURL().openStream()) {
        Files.copy(in, Paths.get(fileName));
    }
}

দুটি লাইনের কোড এবং কোনও নির্ভরতা নেই।


যারা ভাবছেন, তাদের কোডের এই স্নিপেটের জন্য প্রয়োজনীয় আমদানি এখানে রয়েছে:import java.io.InputStream; import java.net.URI; import java.nio.file.Files; import java.nio.file.Paths;
BelovedFool

23

কোনও ফাইল ডাউনলোড করার জন্য আপনাকে এটি পড়তে হবে, যেভাবেই আপনাকে কোনওভাবে ফাইলটি দিয়ে যেতে হবে। লাইনে বাই লাইনের পরিবর্তে, আপনি কেবল স্ট্রিমের বাইট দ্বারা এটি পড়তে পারেন:

BufferedInputStream in = new BufferedInputStream(new URL("http://www.website.com/information.asp").openStream())
    byte data[] = new byte[1024];
    int count;
    while((count = in.read(data,0,1024)) != -1)
    {
        out.write(data, 0, count);
    }

17

যখন ব্যবহার Java 7+ব্যবহার নিম্নলিখিত পদ্ধতি ইন্টারনেট থেকে কোনো ফাইল ডাউনলোড করুন কিছু নির্দেশিকাতে চিহ্নিত করে সংরক্ষণ করুন:

private static Path download(String sourceURL, String targetDirectory) throws IOException
{
    URL url = new URL(sourceURL);
    String fileName = sourceURL.substring(sourceURL.lastIndexOf('/') + 1, sourceURL.length());
    Path targetPath = new File(targetDirectory + File.separator + fileName).toPath();
    Files.copy(url.openStream(), targetPath, StandardCopyOption.REPLACE_EXISTING);

    return targetPath;
}

ডকুমেন্টেশন এখানে


16

এই উত্তরটি প্রায় নির্বাচিত উত্তরের মতো তবে দুটি বর্ধনের সাথে: এটি একটি পদ্ধতি এবং এটি ফাইলআউটপুট স্ট্রিম অবজেক্টটিকে বন্ধ করে দেয়:

    public static void downloadFileFromURL(String urlString, File destination) {    
        try {
            URL website = new URL(urlString);
            ReadableByteChannel rbc;
            rbc = Channels.newChannel(website.openStream());
            FileOutputStream fos = new FileOutputStream(destination);
            fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
            fos.close();
            rbc.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2
একটি একক কল পর্যাপ্ত নয়। transferFrom()একক কলে পুরো ট্রান্সফার সম্পন্ন করার জন্য নির্দিষ্ট করা হয়নি। এজন্য এটি একটি গণনা ফেরত দেয়। আপনাকে লুপ করতে হবে।
লার্নের মারকুইস

10
import java.io.*;
import java.net.*;

public class filedown {
    public static void download(String address, String localFileName) {
        OutputStream out = null;
        URLConnection conn = null;
        InputStream in = null;

        try {
            URL url = new URL(address);
            out = new BufferedOutputStream(new FileOutputStream(localFileName));
            conn = url.openConnection();
            in = conn.getInputStream();
            byte[] buffer = new byte[1024];

            int numRead;
            long numWritten = 0;

            while ((numRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, numRead);
                numWritten += numRead;
            }

            System.out.println(localFileName + "\t" + numWritten);
        } 
        catch (Exception exception) { 
            exception.printStackTrace();
        } 
        finally {
            try {
                if (in != null) {
                    in.close();
                }
                if (out != null) {
                    out.close();
                }
            } 
            catch (IOException ioe) {
            }
        }
    }

    public static void download(String address) {
        int lastSlashIndex = address.lastIndexOf('/');
        if (lastSlashIndex >= 0 &&
        lastSlashIndex < address.length() - 1) {
            download(address, (new URL(address)).getFile());
        } 
        else {
            System.err.println("Could not figure out local file name for "+address);
        }
    }

    public static void main(String[] args) {
        for (int i = 0; i < args.length; i++) {
            download(args[i]);
        }
    }
}

5
যদি in.closeব্যতিক্রম নিক্ষেপ করে, out.closeতাকে বলা হয় না।
বেরিলিয়াম

8

ব্যক্তিগতভাবে, আমি এ্যাপাচির এইচটিপিপ্লিনেন্টকে এই বিষয়টির সাথে আমার যা করার দরকার ছিল তার চেয়ে বেশি সক্ষম হিসাবে খুঁজে পেয়েছি। এইচটিটিপিপ্লেন্ট ব্যবহার করার জন্য একটি দুর্দান্ত টিউটোরিয়াল এখানে


2
কমন্স-আইও একটি দুর্দান্ত পাঠাগার
ডিএফএ

6

ট্রাই -উইথ স্টেটমেন্টের ব্যবহারের সাথে ব্রায়ান রিস্কের উত্তরের উপর ভিত্তি করে এটি আর একটি জাভা var বৈকল্পিক :

public static void downloadFileFromURL(String urlString, File destination) throws Throwable {

      URL website = new URL(urlString);
      try(
              ReadableByteChannel rbc = Channels.newChannel(website.openStream());
              FileOutputStream fos = new FileOutputStream(destination);  
              ){
          fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
      }

  }

একটি একক কল পর্যাপ্ত নয়। transferFrom()একক কলে পুরো ট্রান্সফার সম্পন্ন করার জন্য নির্দিষ্ট করা হয়নি। এজন্য এটি একটি গণনা ফেরত দেয়। আপনাকে লুপ করতে হবে।
লার্নের মারকুইস

আপনি কেন আমাকে বোকা প্রশ্নটি সম্বোধন করছেন তা আমি জানি না। আমি যা বলেছিলাম তার সাথে এর কোনও যোগসূত্র নেই এবং আমি মুখে শব্দটি reallyোকাতে অস্বীকার করি।
মারকুইস

2

HttpComponentsপরিবর্তে অ্যাপাচি ব্যবহার করে ফাইলটি ডাউনলোড করা সম্ভব Commons-IO। এই কোডটি আপনাকে জাভাতে একটি ইউআরএল অনুযায়ী একটি ফাইল ডাউনলোড করতে এবং নির্দিষ্ট গন্তব্যে এটি সংরক্ষণ করার অনুমতি দেয়।

public static boolean saveFile(URL fileURL, String fileSavePath) {

    boolean isSucceed = true;

    CloseableHttpClient httpClient = HttpClients.createDefault();

    HttpGet httpGet = new HttpGet(fileURL.toString());
    httpGet.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0");
    httpGet.addHeader("Referer", "https://www.google.com");

    try {
        CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
        HttpEntity fileEntity = httpResponse.getEntity();

        if (fileEntity != null) {
            FileUtils.copyInputStreamToFile(fileEntity.getContent(), new File(fileSavePath));
        }

    } catch (IOException e) {
        isSucceed = false;
    }

    httpGet.releaseConnection();

    return isSucceed;
}

কোডের একক লাইনের বিপরীতে:

FileUtils.copyURLToFile(fileURL, new File(fileSavePath),
                        URLS_FETCH_TIMEOUT, URLS_FETCH_TIMEOUT);

এই কোডটি আপনাকে একটি প্রক্রিয়াতে আরও নিয়ন্ত্রণ প্রদান করবে এবং আপনাকে কেবল সময়সীমা ছাড়াই নয় User-Agentএবং Refererমানগুলি নির্দিষ্ট করতে দেয় যা অনেকগুলি ওয়েবসাইটের জন্য সমালোচনাযোগ্য।


2

এখানে অনেক মার্জিত এবং দক্ষ উত্তর রয়েছে। তবে সংক্ষিপ্ততা আমাদের কিছু দরকারী তথ্য হারাতে পারে। বিশেষত, একটি প্রায়শই কোনও সংযোগ ত্রুটিটিকে একটি ব্যতিক্রম হিসাবে বিবেচনা করতে চায় না বিবেচনা করতে চায় না এবং কোনও ব্যক্তি কোনও নেটওয়ার্ক-সম্পর্কিত ত্রুটি আলাদাভাবে আচরণ করতে চায় - উদাহরণস্বরূপ, আমাদের ডাউনলোডটি আবার চেষ্টা করা উচিত কিনা তা সিদ্ধান্ত নিতে।

এখানে একটি পদ্ধতি যা নেটওয়ার্ক ত্রুটির জন্য ব্যতিক্রম ছুঁড়ে না ফেলে (শুধুমাত্র সত্যিকারের ব্যতিক্রমী সমস্যার জন্য, ত্রুটিযুক্ত url বা ফাইলটিতে লেখার ক্ষেত্রে সমস্যা হিসাবে)

/**
 * Downloads from a (http/https) URL and saves to a file. 
 * Does not consider a connection error an Exception. Instead it returns:
 *  
 *    0=ok  
 *    1=connection interrupted, timeout (but something was read)
 *    2=not found (FileNotFoundException) (404) 
 *    3=server error (500...) 
 *    4=could not connect: connection timeout (no internet?) java.net.SocketTimeoutException
 *    5=could not connect: (server down?) java.net.ConnectException
 *    6=could not resolve host (bad host, or no internet - no dns)
 * 
 * @param file File to write. Parent directory will be created if necessary
 * @param url  http/https url to connect
 * @param secsConnectTimeout Seconds to wait for connection establishment
 * @param secsReadTimeout Read timeout in seconds - trasmission will abort if it freezes more than this 
 * @return See above
 * @throws IOException Only if URL is malformed or if could not create the file
 */
public static int saveUrl(final Path file, final URL url, 
  int secsConnectTimeout, int secsReadTimeout) throws IOException {
    Files.createDirectories(file.getParent()); // make sure parent dir exists , this can throw exception
    URLConnection conn = url.openConnection(); // can throw exception if bad url
    if( secsConnectTimeout > 0 ) conn.setConnectTimeout(secsConnectTimeout * 1000);
    if( secsReadTimeout > 0 ) conn.setReadTimeout(secsReadTimeout * 1000);
    int ret = 0;
    boolean somethingRead = false;
    try (InputStream is = conn.getInputStream()) {
        try (BufferedInputStream in = new BufferedInputStream(is); OutputStream fout = Files
                .newOutputStream(file)) {
            final byte data[] = new byte[8192];
            int count;
            while((count = in.read(data)) > 0) {
                somethingRead = true;
                fout.write(data, 0, count);
            }
        }
    } catch(java.io.IOException e) { 
        int httpcode = 999;
        try {
            httpcode = ((HttpURLConnection) conn).getResponseCode();
        } catch(Exception ee) {}
        if( somethingRead && e instanceof java.net.SocketTimeoutException ) ret = 1;
        else if( e instanceof FileNotFoundException && httpcode >= 400 && httpcode < 500 ) ret = 2; 
        else if( httpcode >= 400 && httpcode < 600 ) ret = 3; 
        else if( e instanceof java.net.SocketTimeoutException ) ret = 4; 
        else if( e instanceof java.net.ConnectException ) ret = 5; 
        else if( e instanceof java.net.UnknownHostException ) ret = 6;  
        else throw e;
    }
    return ret;
}

2

জাভা কোড সহ ইন্টারনেট থেকে মুভি ডাউনলোড করার জন্য নমুনা কোডটি নীচে রয়েছে:

URL url = new 
URL("http://103.66.178.220/ftp/HDD2/Hindi%20Movies/2018/Hichki%202018.mkv");
    BufferedInputStream bufferedInputStream = new  BufferedInputStream(url.openStream());
    FileOutputStream stream = new FileOutputStream("/home/sachin/Desktop/test.mkv");


    int count=0;
    byte[] b1 = new byte[100];

    while((count = bufferedInputStream.read(b1)) != -1) {
        System.out.println("b1:"+b1+">>"+count+ ">> KB downloaded:"+new File("/home/sachin/Desktop/test.mkv").length()/1024);
        stream.write(b1, 0, count);
    }

সাধারণত, উত্তরগুলি আরও কার্যকর হয় যদি সেগুলিতে কোডটি কী করা উচিত এবং কেন এটি অন্যকে পরিচয় করিয়ে না দিয়ে সমস্যার সমাধান করে তার ব্যাখ্যা অন্তর্ভুক্ত করে।
টিম ডিকম্যান

1

এর সাধারণ ব্যবহার নিয়ে একটি সমস্যা রয়েছে:

org.apache.commons.io.FileUtils.copyURLToFile(URL, File) 

আপনার যদি খুব বড় ফাইল ডাউনলোড এবং সংরক্ষণ করতে হয় বা সাধারণভাবে সংযোগটি বাদ দেওয়া হয় তবে আপনার যদি স্বয়ংক্রিয় পুনরায় চেষ্টা করার প্রয়োজন হয়।

Org.apache.commons.io.FileUtils এর সাথে অ্যাপাচি এইচটিপিপ্লিনেন্টের সাথে আমি এ জাতীয় ক্ষেত্রে যা পরামর্শ দিচ্ছি তা। উদাহরণ স্বরূপ:

GetMethod method = new GetMethod(resource_url);
try {
    int statusCode = client.executeMethod(method);
    if (statusCode != HttpStatus.SC_OK) {
        logger.error("Get method failed: " + method.getStatusLine());
    }       
    org.apache.commons.io.FileUtils.copyInputStreamToFile(
        method.getResponseBodyAsStream(), new File(resource_file));
    } catch (HttpException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
    method.releaseConnection();
}

1

পূর্ববর্তী উত্তরগুলি সংক্ষিপ্ত করে (এবং কোনওভাবে পোলিশ এবং আপডেট করুন)। নিম্নলিখিত তিনটি পদ্ধতি ব্যবহারিকভাবে সমতুল্য। (আমি স্পষ্ট সময়সীমা যুক্ত করেছি কারণ আমি মনে করি সেগুলি অবশ্যই আবশ্যক nobody

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ডিএনএস রেজোলিউশন ব্যর্থ হলে; অন্যান্য আইওএক্সেপশন ট্রান্সমিশনের সময় ত্রুটির সাথে মিলে যায়।

(সম্প্রদায় উইকি হিসাবে চিহ্নিত, তথ্য বা সংশোধন যোগ করতে নির্দ্বিধায়)


1

পদ্ধতিতে ইউ.ফ্যাচ (ইউআরএল) রয়েছে আন্ডারস্কোর-জাভাতে লাইব্রেরিতে ।

pom.xml:

  <groupId>com.github.javadev</groupId>
  <artifactId>underscore</artifactId>
  <version>1.45</version>

কোড উদাহরণ:

import com.github.underscore.lodash.U;

public class Download {
    public static void main(String ... args) {
        String text = U.fetch("https://stackoverflow.com/questions"
        + "/921262/how-to-download-and-save-a-file-from-internet-using-java").text();
    }
}

এই উত্তরটি কীভাবে কার্যকর, যখন লিঙ্কটি অবৈধ হয়ে যায়? দয়া করে কীভাবে উত্তর দিন
জিমহকিন্স

আপনার কোডটি সংকলন করবে না। প্রশ্নটি সমাধানের জন্য জিজ্ঞাসা করুন Java, তবে আপনার উত্তরটি দেখতে দেখতেJavaScript
টেক্সেক্স

@ ট্যালেক্স আমি pom.xML বিভাগ এবং কোডের উন্নত উদাহরণ যুক্ত করেছি।
ভ্যালেন্টাইন কোলেস্নিকভ

0
public class DownloadManager {

    static String urls = "[WEBSITE NAME]";

    public static void main(String[] args) throws IOException{
        URL url = verify(urls);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        InputStream in = null;
        String filename = url.getFile();
        filename = filename.substring(filename.lastIndexOf('/') + 1);
        FileOutputStream out = new FileOutputStream("C:\\Java2_programiranje/Network/DownloadTest1/Project/Output" + File.separator + filename);
        in = connection.getInputStream();
        int read = -1;
        byte[] buffer = new byte[4096];
        while((read = in.read(buffer)) != -1){
            out.write(buffer, 0, read);
            System.out.println("[SYSTEM/INFO]: Downloading file...");
        }
        in.close();
        out.close();
        System.out.println("[SYSTEM/INFO]: File Downloaded!");
    }
    private static URL verify(String url){
        if(!url.toLowerCase().startsWith("http://")) {
            return null;
        }
        URL verifyUrl = null;

        try{
            verifyUrl = new URL(url);
        }catch(Exception e){
            e.printStackTrace();
        }
        return verifyUrl;
    }
}

আপনার কোডটি কেবল ডাম্পিংয়ের পরিবর্তে কীভাবে কাজ করে তা তথ্য সরবরাহ করে আপনি নিজের উত্তরকে উন্নত করতে পারেন।
মতেজ কোর্মুথ


0

আপনি যদি প্রক্সিটির পিছনে থাকেন তবে আপনি নীচে জাভা প্রোগ্রামে প্রক্সিগুলি সেট করতে পারেন:

        Properties systemSettings = System.getProperties();
        systemSettings.put("proxySet", "true");
        systemSettings.put("https.proxyHost", "https proxy of your org");
        systemSettings.put("https.proxyPort", "8080");

যদি আপনি কোনও প্রক্সি পিছনে না থাকেন তবে আপনার কোডে উপরের লাইনগুলি অন্তর্ভুক্ত করবেন না। আপনি যখন কোনও প্রক্সি পিছনে থাকবেন তখন কোনও ফাইল ডাউনলোড করার জন্য সম্পূর্ণ কার্যকারী কোড।

public static void main(String[] args) throws IOException {
        String url="https://raw.githubusercontent.com/bpjoshi/fxservice/master/src/test/java/com/bpjoshi/fxservice/api/TradeControllerTest.java";
        OutputStream outStream=null;
        URLConnection connection=null;
        InputStream is=null;
        File targetFile=null;
        URL server=null;
        //Setting up proxies
        Properties systemSettings = System.getProperties();
            systemSettings.put("proxySet", "true");
            systemSettings.put("https.proxyHost", "https proxy of my organisation");
            systemSettings.put("https.proxyPort", "8080");
            //The same way we could also set proxy for http
            System.setProperty("java.net.useSystemProxies", "true");
            //code to fetch file
        try {
            server=new URL(url);
            connection = server.openConnection();
            is = connection.getInputStream();
            byte[] buffer = new byte[is.available()];
            is.read(buffer);

                targetFile = new File("src/main/resources/targetFile.java");
                outStream = new FileOutputStream(targetFile);
                outStream.write(buffer);
        } catch (MalformedURLException e) {
            System.out.println("THE URL IS NOT CORRECT ");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("Io exception");
            e.printStackTrace();
        }
        finally{
            if(outStream!=null) outStream.close();
        }
    }

0

নতুন চ্যানেলটি ব্যবহার করার 1 ম পদ্ধতি

ReadableByteChannel aq = Channels.newChannel(new url("https//asd/abc.txt").openStream());
FileOutputStream fileOS = new FileOutputStream("C:Users/local/abc.txt")
FileChannel writech = fileOS.getChannel();

ফাইল ইউটিলস ব্যবহারের দ্বিতীয় পদ্ধতি

FileUtils.copyURLToFile(new url("https//asd/abc.txt",new local file on system("C":/Users/system/abc.txt"));

3 য় পদ্ধতি ব্যবহার

InputStream xy = new ("https//asd/abc.txt").openStream();

এইভাবে আমরা বেসিক জাভা কোড এবং অন্যান্য তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করে ফাইল ডাউনলোড করতে পারি। এগুলি কেবল দ্রুত রেফারেন্সের জন্য। বিস্তারিত তথ্য এবং অন্যান্য বিকল্পগুলি পেতে দয়া করে উপরের কীওয়ার্ডগুলির সাথে গুগল করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.