जावा कोड की कुछ पंक्तियों में स्ट्रिंग को पढ़ें


151

मैं Groovy के जावा के समकक्ष खोजने की कोशिश कर रहा हूं:

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

मैं एक URL से स्ट्रिंग में सामग्री पढ़ना चाहता हूं। मैं अपने कोड को इतने सरल कार्य के लिए बफर स्ट्रीम और लूप के साथ प्रदूषित नहीं करना चाहता। मैंने अपाचे के HttpClient में देखा, लेकिन मुझे एक या दो लाइन कार्यान्वयन नहीं दिखता है।


6
सिर्फ एक उपयोगिता वर्ग क्यों नहीं बनाया गया है जो सभी "प्रदूषित" बफर धाराओं और छोरों को घेरता है? आप स्ट्रीम पूरा होने से पहले सॉकेट बंद होने जैसी चीजों को संभालने के लिए और धीमी कनेक्शन पर I / O ब्लॉक को संभालने के लिए भी उस वर्ग का उपयोग कर सकते हैं। आखिरकार, यह OO है - कार्यक्षमता को संक्षिप्त करता है और इसे अपने मुख्य वर्ग से छिपाता है।
जोनाथन बी

1
यह एक या दो लाइनों में नहीं किया जा सकता है।
Thorbjørn रावन एंडरसन

जवाबों:


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
नियमित अभिव्यक्ति \\ एक इनपुट की शुरुआत से मेल खाती है। यह स्कैनर को अगली शुरुआत से (अतार्किक) तक, संपूर्ण स्ट्रीम को टोकन देने के लिए कहता है।
रूण

7
नीट, लेकिन विफल रहता है अगर वेबपेज कोई सामग्री नहीं लौटाता ("")। आपको String result = scanner.hasNext() ? scanner.next() : "";उसे संभालने की आवश्यकता है।
नैट्स

3
@ यह सुनिश्चित करने के लिए कि यहां आयात जोड़ना उपयोगी होगा, जावा में कई स्कैनर्स और यूआरएल हैं
kiedysktos

2
@ क्या आप लिंक को अपडेट कर सकते हैं "यह \\ A:" बताता है?
इमस्कर

95

यह उत्तर जावा के पुराने संस्करण को संदर्भित करता है। हो सकता है कि आप कोवू के जवाब को देखना चाहते हों।


यहाँ यह करने का पारंपरिक तरीका है:

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);
    }
}

जैसा कि @extraneon ने सुझाव दिया है, ioutils आपको बहुत ही शानदार तरीके से ऐसा करने की अनुमति देता है जो अभी भी जावा आत्मा में है:

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

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

5
आप मुख्य विधि का नाम बदल सकते हैं, मान सकते हैं getText, URL स्ट्रिंग को एक पैरामीटर के रूप में पास कर सकते हैं और एक-लाइनर रख सकते हैं:String content = URLConnectionReader.getText("http://www.yahoo.com/");
गोरान जोविक

7
स्ट्रिंग में कोई भी लाइन-टर्मिनेशन वर्ण नहीं होगा (क्योंकि बफ़ररएडर.डरलाइन () जो उन्हें हटाते हैं) के उपयोग के कारण, इसलिए यह URL की सामग्री के समान नहीं होगा।
बेनोइट गुएदास

@ बेनोइट गुएदास तो लाइन कैसे तोड़ते हैं?
user1788736

76

या बस अपाचे कॉमन्स का उपयोग करें IOUtils.toString(URL url), या वैरिएंट जो एक एन्कोडिंग पैरामीटर भी स्वीकार करता है।


12
+1 धन्यवाद, इसने पूरी तरह से काम किया। कोड की एक पंक्ति और यह धारा बंद कर देती है! ध्यान दें कि IOUtils.toString(URL)पदावनत किया जाता है। IOUtils.toString(URL url, String encoding)पसंद है।
galeale

1
IOUtils.toString(url, (Charset) null)इसी तरह के परिणाम तक पहुँचने के लिए।
फ्रेंकसावेन

3
कोड की एक पंक्ति, और एक्स्ट्रासस वर्ग फ़ाइलों के मेगाबाइट्स के दसियों जो अब आपके रनटाइम में हैं। कोड की कुछ (वास्तव में, एक) लाइन लिखने से बचने के लिए एक विशाल पुस्तकालय शामिल करना एक महान निर्णय नहीं है।
बजे जेफरी ब्लाटमैन

1
@JeffreyBlattman यदि आप इसे अपने आवेदन में केवल एक बार उपयोग कर रहे हैं, तो यह शायद ऐसा स्मार्ट विघटन नहीं है, लेकिन यदि आप इसे कॉमन-आईओ पैकेज से अधिक बार और अन्य चीजों का उपयोग कर रहे हैं, तो यह फिर से एक स्मार्ट विघटन हो सकता है। यह आपके द्वारा लिखे जा रहे एप्लिकेशन पर भी निर्भर करता है। यदि यह एक मोबाइल या डेस्कटॉप एप है, तो आप अतिरिक्त पुस्तकालयों के साथ स्मृति पदचिह्न को फुलाने के बारे में दो बार सोच सकते हैं। यदि यह 64 जीबी रैम मशीन पर चलने वाला सर्वर एप्लिकेशन है, तो बस इस 10 एमबी को अनदेखा करें - मेमोरी आजकल सस्ती है और क्या डी मूल पदचिह्न 1,5% है या आपकी कुल मेमोरी का 2% कोई फर्क नहीं पड़ता
बड़ा डेटा nerd

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/opensearchWebservice पर इस उदाहरण का उपयोग करते समय , मुझे xml की केवल पहली दो लाइनें मिल रही हैं।
ओरोमला लोकनी

400 त्रुटि है क्योंकि आपको इस वेब सेवा का उपयोग करने के लिए एक कुंजी की आवश्यकता है। समस्या यह है कि यह webservice थोड़ी xml भेजती है, फिर कुछ प्रसंस्करण करने के लिए कई सेकंड लेती है और फिर xml का दूसरा भाग भेजती है। इनपुटस्ट्रीम इंटरवल के दौरान बंद रहता है और सभी सामग्री की खपत नहीं होती है। मैंने http घटक अपाचे लाइब्रेरी hc.apache.org/httpcompenders-client-ga
Ortomala Lokni

17

जावा 9 के रूप में एक बेहतर तरीका है:

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

मूल ग्रूवी उदाहरण की तरह, यह मानता है कि सामग्री UTF-8 एन्कोडेड है। (यदि आपको उससे अधिक चतुर कुछ चाहिए, तो आपको URLConnection बनाने और एन्कोडिंग का पता लगाने के लिए उपयोग करने की आवश्यकता है)


1
धन्यवाद, यह वही था जिसकी मुझे तलाश थी। इसका उपयोग getClass().getResourceAsStream(...)जार के अंदर पाठ फ़ाइलों को खोलने के लिए भी किया जा सकता है ।
आरजे

8

अमरूद का उपयोग कर अतिरिक्त उदाहरण:

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

1
अमरूद डॉक्स लिंक कहते हैं : ध्यान दें कि भले ही ये विधियां {@link URL} मापदंडों का उपयोग करती हैं, लेकिन वे आमतौर पर HTTP या अन्य गैर-वर्गीय संसाधनों के लिए उपयुक्त नहीं हैं
gal


3

निम्नलिखित जावा 7/8, सुरक्षित यूआरएल के साथ काम करता है, और दिखाता है कि आपके अनुरोध के साथ एक कुकी कैसे जोड़ें। ध्यान दें कि यह इस पृष्ठ पर अन्य महान उत्तर की एक सीधी प्रति है , लेकिन कुकी उदाहरण को जोड़ा, और इसमें स्पष्टीकरण दिया कि यह सुरक्षित यूआरएल के साथ भी काम करता है; ;-)

यदि आपको अमान्य प्रमाणपत्र या स्व-हस्ताक्षरित प्रमाणपत्र के साथ सर्वर से कनेक्ट करने की आवश्यकता है, तो यह सुरक्षा त्रुटियों को तब तक फेंक देगा जब तक आप प्रमाण पत्र आयात नहीं करते। आप इस कार्यक्षमता की जरूरत है, तो आप कर सकता है दृष्टिकोण इस उत्तर में दिए गए विवरण पर विचार यह करने के लिए StackOverflow पर संबंधित प्रश्न के ।

उदाहरण

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

यहाँ जीन का प्यारा जवाब है, लेकिन मेरे जैसे muppets के लिए एक साफ समारोह में लिपटे:

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

शुद्ध जावा में स्ट्रिंग का URL

उदाहरण कॉल

 String str = getStringFromUrl("YourUrl");

कार्यान्वयन

आप इस उत्तर में वर्णित विधि का उपयोग कर सकते हैं, कैसे एक InputStream URL को पढ़ने के लिए और इसे कैसे String के लिए InputStream पढ़ने के लिए इस उत्तर के साथ संयोजित करें

परिणाम कुछ इस तरह होगा

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);
    }
}

पेशेवरों

  • यह शुद्ध जावा है

  • अलग-अलग हेडर जोड़कर इसे आसानी से बढ़ाया जा सकता है (एक अशक्त वस्तु को पारित करने के बजाय, जैसे ऊपर दिया गया उदाहरण), प्रमाणीकरण आदि।

  • प्रोटोकॉल स्विच की हैंडलिंग समर्थित है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.