getInputStream() 上的 java.io.FileNotFoundException

Posted

技术标签:

【中文标题】getInputStream() 上的 java.io.FileNotFoundException【英文标题】:java.io.FileNotFoundException on getInputStream() 【发布时间】:2017-05-18 03:33:10 【问题描述】:

我正在尝试从 URL 获取输入流,连接响应代码是 200,但是当我尝试获取输入流时出现异常 FileNotFoundException,这是我的代码:

url = new URL("http://...");
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestMethod("POST");
int status = connection.getResponseCode();
if(status >= 400)
    request = new OutputStreamWriter(connection.getOutputStream());
    request.write(params);
    request.flush();
    request.close();
    String line;
    InputStreamReader isr = new InputStreamReader(connection.getInputStream());
    BufferedReader reader = new BufferedReader(isr);
    StringBuilder sb = new StringBuilder();
    while ((line = reader.readLine()) != null) 
        sb.append(line + "\n");
    

堆栈跟踪:

W/System.err: java.io.FileNotFoundException: http://...
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:238)
W/System.err:     at com.apps.topinformers.sharedreading.AddGroupMembersFragment.postText(AddGroupMembersFragment.java:112)
W/System.err:     at com.apps.topinformers.sharedreading.AddGroupMembersFragment.access$000(AddGroupMembersFragment.java:26)
W/System.err:     at com.apps.topinformers.sharedreading.AddGroupMembersFragment$PostDataAsyncTask.doInBackground(AddGroupMembersFragment.java:65)
W/System.err:     at com.apps.topinformers.sharedreading.AddGroupMembersFragment$PostDataAsyncTask.doInBackground(AddGroupMembersFragment.java:55)
W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:295)
W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
W/System.err:     at java.lang.Thread.run(Thread.java:818)

有什么问题,我该如何调试?

【问题讨论】:

我建议您编辑您的问题并发布与您的崩溃相关的整个 Java 堆栈跟踪。 @CommonsWare 查看编辑 我同意 EJP - 这符合您请求中的 404 响应代码。您可能会发现使用不同的 HTTP 客户端 API 会更容易,例如 OkHttp。 【参考方案1】:

连接响应码为200

不,不是。此代码中没有任何内容可以检查响应代码。 FileNotFoundException 表示响应码为 404。

NB setDoOutput(true) 将方法设置为 POST。你不需要自己设置,

【讨论】:

我检查了connection.getRespondeCode() 它返回200 我使用它只是为了确保连接,然后我将其删除。我不想处理或捕获错误,我想解决它! 你的测试完全证明了我的观点。响应码不是200,是>=400,否则不执行getInputStream()不会得到异常。注意你应该在写输出之后检查它 嘿,我的代码是 404..但我有一些 JSON 响应此代码。我该如何阅读它 @pritam001 难以置信。如果您的服务器确实提供 JSON 和 404,则说明它存在严重问题。【参考方案2】:

感谢@EJP,我检查了以下回复:

url = new URL("http://...");
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestMethod("POST");

request = new OutputStreamWriter(connection.getOutputStream());
request.write(params);
request.flush();
request.close();
String line;

int status = connection.getResponseCode();
if(status < 400) 

    InputStreamReader isr = new InputStreamReader(connection.getInputStream());
    ...
 else
    InputStreamReader isr = new InputStreamReader(connection.getErrorStream());
    ...

错误流显示我请求的 URL 的实现代码存在一些问题。

【讨论】:

如果您收到FileNotFoundException,则响应代码不是 200。是不可能的。这些陈述中的一项或多项是不真实的。您提供的相反证据正好为零。 @EJP 回答已编辑,反正问题已经解决了,连续编码13个小时后分心了,谢谢。 这没有回答所提出的问题。我建议你删除你的问题。一开始就没有任何意义。

以上是关于getInputStream() 上的 java.io.FileNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章

给 string 添加一个 GetInputStream 扩展方法

从 getInputStream 正确关闭 Java Process InputStream

Java HttpURLConnection.getInputStream 但得到 401 IOException

BufferedReader 上的 Java 客户端套接字阻塞?

Process.getInputStream() 使用哪种编码?

无法读取 ZipFile.getInputStream(ZipEntry) 方法返回的 ZipInputStream