জাভা কোডের কয়েকটি লাইনে স্ট্রিং থেকে url পড়ুন


151

আমি জাভা এর গ্রোভির সমতুল্য সন্ধান করার চেষ্টা করছি:

String content = "http://www.google.com".toURL().getText();

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


6
কেন কেবল এমন একটি ইউটিলিটি ক্লাস তৈরি করবেন না যা সমস্ত "দূষিত" বাফার স্ট্রিম এবং লুপগুলিকে আবদ্ধ করে? স্ট্রিমটি শেষ হওয়ার আগে সকেট বন্ধ হওয়ার মতো জিনিসগুলি হ্যান্ডেল করার জন্য এবং ধীর সংযোগে I / O ব্লকগুলি হ্যান্ডেল করার জন্য আপনি সেই শ্রেণিটি ব্যবহার করতে পারেন। সর্বোপরি, এটি ওও - কার্যকারিতাটি encapsulate করুন এবং এটি আপনার প্রধান শ্রেণি থেকে আড়াল করুন।
জোনাথন বি

1
এটি এক বা দুটি লাইনে করা যায় না।
থরবজর্ন রাভন অ্যান্ডারসন

উত্তর:


130

আসল উত্তরটি গৃহীত হওয়ার পরে এখন কিছুটা সময় কেটে গেছে, আরও ভাল পদ্ধতির উপায় রয়েছে:

String out = new Scanner(new URL("http://www.google.com").openStream(), "UTF-8").useDelimiter("\\A").next();

আপনি যদি কিছুটা পূর্ণাঙ্গ বাস্তবায়ন চান যা কোন একক লাইন নয়, এটি করুন:

public static String readStringFromURL(String requestURL) throws IOException
{
    try (Scanner scanner = new Scanner(new URL(requestURL).openStream(),
            StandardCharsets.UTF_8.toString()))
    {
        scanner.useDelimiter("\\A");
        return scanner.hasNext() ? scanner.next() : "";
    }
}

14
শুধু ভুলে যাবেন না আপনাকে Scanner#close()পরে ফোন করার দরকার ।
মার্সেলো

2
নিয়মিত প্রকাশ \\ A ইনপুটটির শুরুর সাথে মেলে। এটি স্ক্যানারকে পরবর্তী প্রারম্ভ থেকে (অযৌক্তিক) পুরো প্রবাহকে টোকনাইজ করতে বলে tells
রুন

7
ঝরঝরে, তবে ব্যর্থ হয় যদি ওয়েবপৃষ্ঠা কোনও সামগ্রী ("") না ফেরায়। আপনার String result = scanner.hasNext() ? scanner.next() : "";এটি পরিচালনা করা দরকার need
নাটেস

3
@ চক্রটি এখানে আমদানি যুক্ত করা কার্যকর হবে, জাভাতে একাধিক স্ক্যানার এবং ইউআরএল রয়েছে
কিডিস্কটোস

2
@ চক্র আপনি কি এই লিঙ্কটি আপডেট করতে পারবেন "এটি \\ এ:" ব্যাখ্যা করে?
ইমাস্কার

95

এই উত্তরটি জাভার পুরানো সংস্করণকে বোঝায়। আপনি স্লেভের উত্তরটি দেখতে চাইতে পারেন।


এটি করার জন্য এখানে traditionalতিহ্যগত উপায়:

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

public class URLConnectionReader {
    public static String getText(String url) throws Exception {
        URL website = new URL(url);
        URLConnection connection = website.openConnection();
        BufferedReader in = new BufferedReader(
                                new InputStreamReader(
                                    connection.getInputStream()));

        StringBuilder response = new StringBuilder();
        String inputLine;

        while ((inputLine = in.readLine()) != null) 
            response.append(inputLine);

        in.close();

        return response.toString();
    }

    public static void main(String[] args) throws Exception {
        String content = URLConnectionReader.getText(args[0]);
        System.out.println(content);
    }
}

যেমন @ এক্সট্রেনন পরামর্শ দিয়েছে, আইউটিলস আপনাকে জাভা স্পিরিটে থাকা এখনও খুব স্পষ্টভাবে উপায়ে এটি করতে দেয়:

 InputStream in = new URL( "http://jakarta.apache.org" ).openStream();

 try {
   System.out.println( IOUtils.toString( in ) );
 } finally {
   IOUtils.closeQuietly(in);
 }

5
আপনি getTextইউআরএল স্ট্রিংকে প্যারামিটার হিসাবে পাস করার জন্য এবং ওয়ান-লাইনার রাখতে মূল পদ্ধতির নাম পরিবর্তন করতে পারেন:String content = URLConnectionReader.getText("http://www.yahoo.com/");
গোরান জোভিক

7
স্ট্রিংটিতে কোনও লাইন-সমাপ্তি অক্ষর থাকবে না (কারণ এগুলি সরানোর জন্য বাফাররিডার.ড্রেডলাইন () যা ব্যবহার করে), তাই এটি URL- এর সঠিক সামগ্রী হবে না।
বেনোত গুডাস

@ বেনোইট গুয়াদাস তাই লাইন বিরতি কিভাবে রাখবেন?
ব্যবহারকারী 1788736

76

অথবা কেবল অ্যাপাচি কমন্স IOUtils.toString(URL url)বা বৈকল্পিক যা কোনও এনকোডিং প্যারামিটার গ্রহণ করে তা ব্যবহার করুন।


12
+1 ধন্যবাদ, এটি পুরোপুরি কার্যকর হয়েছে worked কোডের একটি লাইন এবং এটি স্ট্রিমটি বন্ধ করে দেয়! নোট যে IOUtils.toString(URL)হ্রাস করা হয়েছে। IOUtils.toString(URL url, String encoding)পছন্দসই
gMale

1
IOUtils.toString(url, (Charset) null)অনুরূপ ফলাফল পৌঁছাতে।
ফ্রাঙ্কস্নিউ

3
কোডের একটি লাইন, এবং এখন দশক মেগাবাইট বহিরাগত শ্রেণীর ফাইল যা এখন আপনার রানটাইমটিতে রয়েছে। কয়েকটি (আসলে, একটি) লাইন কোডটি এড়াতে একটি বিশাল লাইব্রেরি সহ কোনও দুর্দান্ত সিদ্ধান্ত নয়।
জেফ্রি ব্লাটম্যান

1
@ জেফ্রে ব্ল্যাটম্যান যদি আপনি আপনার প্রয়োগে এটি একবার ব্যবহার করেন তবে এটি সম্ভবত এত স্মার্ট ডিসিশন নয়, তবে আপনি যদি এটি ঘন ঘন এবং কমন্স-আইও প্যাকেজ থেকে অন্য জিনিস ব্যবহার করে থাকেন তবে এটি আবার স্মার্ট ডিসিশন হতে পারে। এটি আপনি যে অ্যাপ্লিকেশনটি লিখছেন তার উপরও নির্ভর করে। এটি যদি কোনও মোবাইল বা ডেস্কটপ এপি হয় তবে আপনি অতিরিক্ত লাইব্রেরির সাহায্যে মেমরির পদচিহ্নগুলি ফুলে যাওয়ার বিষয়ে দু'বার ভাবেন। যদি এটি কোনও সার্ভার অ্যাপ্লিকেশন যদি 64 গিগাবাইট র‌্যাম মেশিনে চলছে, তবে কেবল এই 10 এমবিটিকে উপেক্ষা করুন - মেমরিটি আজকাল সস্তা এবং আপনার মোট স্মৃতিতে ডি বুনিয়াদি পদচিহ্ন 1,5% বা 2% কোনও ব্যাপার নয়
বড় ডেটা অহংকার

24

এখন যে আরও সময় কেটে গেছে, জাভা 8 তে এটি করার একটি উপায় এখানে রয়েছে:

URLConnection conn = url.openConnection();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
    pageText = reader.lines().collect(Collectors.joining("\n"));
}

ওয়েব http://www.worldcat.org/webservices/catalog/search/opensearchসার্ভিসে এই উদাহরণটি ব্যবহার করার সময় , আমি প্রথম দুটি লাইন এক্সএমএল পাচ্ছি।
অরটোমালা লোকনি

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

17

জাভা 9 এর মতো আরও ভাল উপায় রয়েছে:

URL u = new URL("http://www.example.com/");
try (InputStream in = u.openStream()) {
    return new String(in.readAllBytes(), StandardCharsets.UTF_8);
}

আসল গ্রোভির উদাহরণের মতো, এটি ধরে নেওয়া হয় যে সামগ্রীটি ইউটিএফ -8 এনকোডযুক্ত। (আপনার যদি এর থেকে আরও চালাক কিছু প্রয়োজন হয় তবে আপনার ইউআরএল সংযোগ তৈরি করতে হবে এবং এনকোডিংটি বের করার জন্য এটি ব্যবহার করতে হবে))


1
ধন্যবাদ, আমি ঠিক এটিই খুঁজছিলাম। এটি getClass().getResourceAsStream(...)জারের অভ্যন্তরে পাঠ্য ফাইলগুলি খুলতেও ব্যবহার করা যেতে পারে ।
আরজেএইচ

8

পেয়ারা ব্যবহার করে অতিরিক্ত উদাহরণ:

URL xmlData = ...
String data = Resources.toString(xmlData, Charsets.UTF_8);

1
পেয়ারা ডক্স লিঙ্কটি বলেছেন : নোট করুন যে এই পদ্ধতিগুলি l @ লিঙ্ক ইউআরএল} প্যারামিটারগুলি ব্যবহার করে, সাধারণত এটি HTTP বা অন্যান্য
শ্রেণিপথ


3

নিম্নলিখিত জাভা 7/8, সুরক্ষিত url সাথে কাজ করে এবং আপনার অনুরোধে কীভাবে কুকি যুক্ত করবেন তা দেখায়। নোট করুন এটি বেশিরভাগই এই পৃষ্ঠায় এই অন্য দুর্দান্ত উত্তরের প্রত্যক্ষ অনুলিপি , তবে কুকির উদাহরণ এবং স্পষ্টকরণ যে এটি সুরক্ষিত ইউআরএলগুলির সাথেও কাজ করে ;-)

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

উদাহরণ

String result = getUrlAsString("https://www.google.com");
System.out.println(result);

আউটপুট

<!doctype html><html itemscope="" .... etc

কোড

import java.net.URL;
import java.net.URLConnection;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public static String getUrlAsString(String url)
{
    try
    {
        URL urlObj = new URL(url);
        URLConnection con = urlObj.openConnection();

        con.setDoOutput(true); // we want the response 
        con.setRequestProperty("Cookie", "myCookie=test123");
        con.connect();

        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));

        StringBuilder response = new StringBuilder();
        String inputLine;

        String newLine = System.getProperty("line.separator");
        while ((inputLine = in.readLine()) != null)
        {
            response.append(inputLine + newLine);
        }

        in.close();

        return response.toString();
    }
    catch (Exception e)
    {
        throw new RuntimeException(e);
    }
}

3

এখানে জিনের মনমুগ্ধকর উত্তর, তবে আমার মতো মুপেটের জন্য পরিপাটি করে দেওয়া:

private static String getUrl(String aUrl) throws MalformedURLException, IOException
{
    String urlData = "";
    URL urlObj = new URL(aUrl);
    URLConnection conn = urlObj.openConnection();
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) 
    {
        urlData = reader.lines().collect(Collectors.joining("\n"));
    }
    return urlData;
}

0

খাঁটি জাভাতে স্ট্রিংয়ের ইউআরএল

উদাহরণ কল

 String str = getStringFromUrl("YourUrl");

বাস্তবায়ন

আপনি এই উত্তরে বর্ণিত পদ্ধতিটি ইনপুট স্ট্রিমের ইউআরএল কীভাবে পড়বেন এবং এই স্ট্রিং-এ ইনপুট স্ট্রিম কীভাবে পড়বেন তা এই উত্তরটির সাথে একত্রিত করতে পারেন

ফলাফল কিছু হবে

public String getStringFromUrl(URL url) throws IOException {
        return inputStreamToString(urlToInputStream(url,null));
}

public String inputStreamToString(InputStream inputStream) throws IOException {
    try(ByteArrayOutputStream result = new ByteArrayOutputStream()) {
        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) != -1) {
            result.write(buffer, 0, length);
        }

        return result.toString(UTF_8);
    }
}

private InputStream urlToInputStream(URL url, Map<String, String> args) {
    HttpURLConnection con = null;
    InputStream inputStream = null;
    try {
        con = (HttpURLConnection) url.openConnection();
        con.setConnectTimeout(15000);
        con.setReadTimeout(15000);
        if (args != null) {
            for (Entry<String, String> e : args.entrySet()) {
                con.setRequestProperty(e.getKey(), e.getValue());
            }
        }
        con.connect();
        int responseCode = con.getResponseCode();
        /* By default the connection will follow redirects. The following
         * block is only entered if the implementation of HttpURLConnection
         * does not perform the redirect. The exact behavior depends to 
         * the actual implementation (e.g. sun.net).
         * !!! Attention: This block allows the connection to 
         * switch protocols (e.g. HTTP to HTTPS), which is <b>not</b> 
         * default behavior. See: /programming/1884230 
         * for more info!!!
         */
        if (responseCode < 400 && responseCode > 299) {
            String redirectUrl = con.getHeaderField("Location");
            try {
                URL newUrl = new URL(redirectUrl);
                return urlToInputStream(newUrl, args);
            } catch (MalformedURLException e) {
                URL newUrl = new URL(url.getProtocol() + "://" + url.getHost() + redirectUrl);
                return urlToInputStream(newUrl, args);
            }
        }
        /*!!!!!*/

        inputStream = con.getInputStream();
        return inputStream;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

পেশাদাররা

  • এটি খাঁটি জাভা

  • এটি বিভিন্ন শিরোনাম (উপরের উদাহরণের মতো নাল বস্তুর পরিবর্তে), প্রমাণীকরণ ইত্যাদি যুক্ত করে সহজেই বাড়ানো যায়

  • প্রোটোকল স্যুইচ পরিচালনা করা সমর্থিত

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