首页 > 解决方案 > Android:openStream 在 URL 对象上失败

问题描述

我正在尝试在 android 上测试下载一个文件,但它失败了。在代码中,我首先从 URL 对象打开一个流:

import android.util.Log;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;



public class Downloader {
    public static void downloadFile(String address, String outputFileName) throws IOException {
        Log.e("JAVA_FILE_DOWNLOADER", "0");
        URL url = new URL(address);
        Log.e("JAVA_FILE_DOWNLOADER", "1");
        try
        {
            Log.e("JAVA_FILE_DOWNLOADER", "1.5");
            InputStream in = url.openStream();
            Log.e("JAVA_FILE_DOWNLOADER", "2");
            ReadableByteChannel rbc = Channels.newChannel(in);
            Log.e("JAVA_FILE_DOWNLOADER", "3");
            FileOutputStream fos = new FileOutputStream(outputFileName);
            Log.e("JAVA_FILE_DOWNLOADER", "4");
            fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
            Log.e("JAVA_FILE_DOWNLOADER", "5");
        }catch (IOException e) {
            Log.e("JAVA_FILE_DOWNLOADER", "exception catched 1", e);
            e.printStackTrace();
        }
    }
}

然后我让代码在一个线程中运行:

        new Thread(new Runnable() {
            public void run() {
                try {
                    Downloader.downloadFile("http://ipv4.download.thinkbroadband.com/5MB.zip", "/sdcard/data/Cat03.jpg");;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();

打印后代码失败JAVA_FILE_DOWNLOADER 1.5"。并且堆栈跟踪如下所示:

 java.net.UnknownHostException: Unable to resolve host "ipv4.download.thinkbroadband.com": No address associated with hostname
     at java.net.InetAddress.lookupHostByName(InetAddress.java:424)
     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
     at java.net.InetAddress.getAllByName(InetAddress.java:214)
     at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28)
     at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216)
     at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122)
     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292)
     at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
     at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
     at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
     at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:179)
     at java.net.URL.openStream(URL.java:470)
     at worldline.atos.com.spicatemplate.Downloader.downloadFile(Downloader.java:27)
     at worldline.atos.com.spicatemplate.MyService$1.run(MyService.java:178)
     at java.lang.Thread.run(Thread.java:841)
 Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
     at libcore.io.Posix.getaddrinfo(Native Method)
     at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:61)
     at java.net.InetAddress.lookupHostByName(InetAddress.java:405)
    ... 15 more

有人可以告诉我该怎么做吗?

标签: javaandroid

解决方案


推荐阅读