একটি ইউআরএল থেকে ইনপুট স্ট্রিম


117

আমি কীভাবে কোনও ইউআরএল থেকে ইনপুট স্ট্রিম পেতে পারি?

উদাহরণস্বরূপ, আমি url এ ফাইলটি নিতে চাই wwww.somewebsite.com/a.txtএবং এটি একটি সার্লেটের মাধ্যমে জাভাতে একটি ইনপুটস্ট্রিম হিসাবে পড়তে চাই।

আমি চেষ্টা করেছিলাম

InputStream is = new FileInputStream("wwww.somewebsite.com/a.txt");

তবে আমি যা পেয়েছি তা একটি ত্রুটি ছিল:

java.io.FileNotFoundException

1
আপনি servletsট্যাগটি সরানোর ক্ষেত্রে রোলব্যাক করলেন কেন ? এখানে কোনও javax.servlet.*এপিআই জড়িত নেই। কোনও main()পদ্ধতিতে প্লেইন ভ্যানিলা জাভা ক্লাসে এমন করার সময় আপনার ঠিক একই সমস্যা হবে ।
বালুস সি

1
ইউআরএল কী তা সম্ভবত আপনার নিজের পরিচিত হওয়া উচিত: ডকস.ওরকল
জ্যাভিজ

উত্তর:


228

ব্যবহার করুন java.net.URL#openStream()একটি সঠিক URL সহ (প্রোটোকল সহ!)। যেমন

InputStream input = new URL("http://www.somewebsite.com/a.txt").openStream();
// ...

আরো দেখুন:


2
আপনি কি জানেন যে এটি যদি ইনপুটস্ট্রিমের প্রতিটি পড়ার জন্য একটি নেটওয়ার্ক অনুরোধ করে বা এটি একবারে পুরো ফাইলটি পড়ে তাই এটি কীভাবে নেটওয়ার্কে অনুরোধ করতে হবে না?
gsingh2011

অ্যান্ড্রয়েডে ইউআই থ্রেডে এই পদ্ধতিটি কল করা একটি ব্যতিক্রম বাড়াবে। এটি একটি পটভূমির থ্রেডে করুন। ব্যবহারের Bolts-অ্যান্ড্রয়েড
Behrouz.M

19

চেষ্টা করুন:

final InputStream is = new URL("http://wwww.somewebsite.com/a.txt").openStream();

10

(ক) wwww.somewebsite.com/a.txtকোনও 'ফাইল ইউআরএল' নয়। এটি মোটেও ইউআরএল নয়। আপনি যদি http://এটির সামনে রাখেন তবে এটি একটি এইচটিটিপি ইউআরএল হবে, এটি এখানে আপনি কী চান তা স্পষ্ট।

(খ) FileInputStreamফাইলগুলির জন্য, URL গুলি নয়।

(গ) যে কোনও ইউআরএল থেকে ইনপুট স্ট্রিম পাওয়ার উপায়টি হয় যা সমান URL.openStream(),বা URL.getConnection().getInputStream(),সমান তবে আপনার এটি পাওয়ার আগে URLConnectionএবং এটির সাথে খেলতে যাওয়ার অন্যান্য কারণ থাকতে পারে ।


4

আপনার আসল কোডটি ফাইলআইপুট স্ট্রিম ব্যবহার করে যা ফাইল সিস্টেম হোস্ট করা ফাইল অ্যাক্সেসের জন্য।

আপনি যে কন্সট্রাক্টরটি ব্যবহার করেছেন সেটি বর্তমান ওয়ার্কিং ডিরেক্টরি (সিস্টেম সম্পত্তি ইউজার.ডির মান) এর www.somewebsite.com সাবফোল্ডারটিতে a.txt নামের একটি ফাইল সন্ধান করার চেষ্টা করবে। আপনার সরবরাহ করা নামটি ফাইল শ্রেণি ব্যবহার করে কোনও ফাইলের সমাধান করা হয়।

ইউআরএল অবজেক্টস এটি সমাধান করার সাধারণ উপায়। আপনি স্থানীয় ফাইল অ্যাক্সেস করতে ইউআরএলগুলি ব্যবহার করতে পারেন তবে নেটওয়ার্ক হোস্টেড সংস্থানগুলিতেও। URL ক্লাসটি http: // বা https: // এর পাশাপাশি ফাইলটি: // প্রোটোকলটি সমর্থন করে যাতে আপনি যেতে ভাল to


2

খাঁটি জাভা:

 urlToInputStream(url,httpHeaders);

কিছু সাফল্যের সাথে আমি এই পদ্ধতিটি ব্যবহার করি। এটি পুনঃনির্দেশগুলি পরিচালনা করে এবং একটি হিসাবে এইচটিটিপি শিরোনামের একটি পরিবর্তনশীল নম্বর পাস করতে পারে Map<String,String>। এটি এইচটিটিপি থেকে এইচটিটিপিএসে পুনঃনির্দেশগুলিও মঞ্জুরি দেয়

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

পুরো উদাহরণ কল

private InputStream getInputStreamFromUrl(URL url, String user, String passwd) throws IOException {
        String encoded = Base64.getEncoder().encodeToString((user + ":" + passwd).getBytes(StandardCharsets.UTF_8));
        Map<String,String> httpHeaders=new Map<>();
        httpHeaders.put("Accept", "application/json");
        httpHeaders.put("User-Agent", "myApplication");
        httpHeaders.put("Authorization", "Basic " + encoded);
        return urlToInputStream(url,httpHeaders);
    }

HttpURLConnectionআপনি ইতিমধ্যে পুনঃনির্দেশগুলি অনুসরণ করবেন যদি না আপনি এটি না জানান, যা আপনি করেননি।
লার্নের মারকুইস

1
আমি জানি ওপি শিরোনামের কথা উল্লেখ করে নি তবে আমি সংক্ষেপটির প্রশংসা করেছি (ভাল, এটি জাভা বিবেচনা করে) উদাহরণ।
chbrown

@ এজেপি আমি ইনলাইন মন্তব্য হিসাবে কিছু ব্যাখ্যা যুক্ত করেছি। আমি মনে করি, আমি মূলত কেসটির জন্য পুনর্নির্দেশ ব্লকটি চালু করেছি যখন HTTP 301 এইচটিটিপিএস ঠিকানায় এইচটিটিপিএস ঠিকানাতে পুনঃনির্দেশ করে। অবশ্যই এটি মূল প্রশ্নের বাইরে চলে গেছে তবে এটি একটি সাধারণ ব্যবহারের ক্ষেত্রে যা ডিফল্ট প্রয়োগের দ্বারা পরিচালিত হয় না। দেখুন: stackoverflow.com/questions/1884230/...
jschnasse

আপনার কোড পুনঃনির্দেশকৃত ব্লক ছাড়াই সমানভাবে ভাল কাজ HttpURLConnectionকরে, যেমনটি আমি ইতিমধ্যে বলেছি, পূর্বনির্ধারিতভাবে পূর্বনির্ধারিত অনুসরণ করে।
লার্নের মার্কুইস

@ user207421 এটি আংশিকভাবে সঠিক। পুনঃনির্দেশ ব্লকটি প্রোটোকল সুইচগুলির জন্য যেমন HT-> https যা ডিফল্টরূপে সমর্থিত নয় for আমি ইন-কোড মন্তব্যে তা প্রকাশ করার চেষ্টা করেছি। স্ট্যাকওভারফ্লো . com/ জিজ্ঞাসা / 1884230/ … দেখুন ।
jschnasse

-1

এখানে একটি পূর্ণ উদাহরণ দেওয়া হয়েছে যা প্রদত্ত ওয়েব পৃষ্ঠার সামগ্রীগুলি পড়বে reads ওয়েব পৃষ্ঠাটি একটি HTML ফর্ম থেকে পড়া হয় from আমরা স্ট্যান্ডার্ড InputStreamক্লাস ব্যবহার করি তবে এটি জাসপ লাইব্রেরির মাধ্যমে আরও সহজে করা যায়।

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>

</dependency>

<dependency>
    <groupId>commons-validator</groupId>
    <artifactId>commons-validator</artifactId>
    <version>1.6</version>
</dependency>  

এগুলি মাভেন নির্ভরতা। আমরা ইউআরএল স্ট্রিং যাচাই করতে অ্যাপাচি কমন্স লাইব্রেরি ব্যবহার করি।

package com.zetcode.web;

import com.zetcode.service.WebPageReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "ReadWebPage", urlPatterns = {"/ReadWebPage"})
public class ReadWebpage extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/plain;charset=UTF-8");

        String page = request.getParameter("webpage");

        String content = new WebPageReader().setWebPageName(page).getWebPageContent();

        ServletOutputStream os = response.getOutputStream();
        os.write(content.getBytes(StandardCharsets.UTF_8));
    }
}

ReadWebPageসার্ভলেট প্রদত্ত ওয়েব পৃষ্ঠার বিষয়বস্তু পড়ে এবং এটি ফিরিয়ে ক্লায়েন্ট প্লেইন টেক্সট বিন্যাসে পাঠায়। পৃষ্ঠাটি পড়ার কাজটি অর্পণ করা হয়েছে WebPageReader

package com.zetcode.service;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.apache.commons.validator.routines.UrlValidator;

public class WebPageReader {

    private String webpage;
    private String content;

    public WebPageReader setWebPageName(String name) {

        webpage = name;
        return this;
    }

    public String getWebPageContent() {

        try {

            boolean valid = validateUrl(webpage);

            if (!valid) {

                content = "Invalid URL; use http(s)://www.example.com format";
                return content;
            }

            URL url = new URL(webpage);

            try (InputStream is = url.openStream();
                    BufferedReader br = new BufferedReader(
                            new InputStreamReader(is, StandardCharsets.UTF_8))) {

                content = br.lines().collect(
                      Collectors.joining(System.lineSeparator()));
            }

        } catch (IOException ex) {

            content = String.format("Cannot read webpage %s", ex);
            Logger.getLogger(WebPageReader.class.getName()).log(Level.SEVERE, null, ex);
        }

        return content;
    }

    private boolean validateUrl(String webpage) {

        UrlValidator urlValidator = new UrlValidator();

        return urlValidator.isValid(webpage);
    }
}

WebPageReaderইউআরএলকে বৈধতা দেয় এবং ওয়েব পৃষ্ঠার সামগ্রীগুলি পড়ে reads এটি পৃষ্ঠার এইচটিএমএল কোডযুক্ত একটি স্ট্রিং প্রদান করে।

<!DOCTYPE html>
<html>
    <head>
        <title>Home page</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <form action="ReadWebPage">

            <label for="page">Enter a web page name:</label>
            <input  type="text" id="page" name="webpage">

            <button type="submit">Submit</button>

        </form>
    </body>
</html>

শেষ পর্যন্ত, এটি এইচটিএমএল ফর্মযুক্ত হোম পৃষ্ঠা form এটি এই বিষয় সম্পর্কে আমার টিউটোরিয়াল থেকে নেওয়া হয়েছে ।

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