HttpURLConnection java.io.FileNotFoundException

我目前使用下面的代码。 我是这个新function,所以它可能只是简单的东西,但我似乎无法得到这个与我的服务器一起工作。 下面的代码很好,如果我连接似乎是Apache服务器,但是当我尝试连接到我的.Net服务器,它会引发错误。 我猜这是一个标题的要求,但似乎无论在哪里尝试,都无法取得成功。

public String Download(String Url) { String filepath=null; try { //set the download URL, a url that points to a file on the internet //this is the file to be downloaded URL url = new URL(Url); //create the new connection HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); //set up some things on the connection urlConnection.setRequestMethod("GET"); urlConnection.setDoOutput(true); //and connect! urlConnection.connect(); //set the path where we want to save the file //in this case, going to save it on the root directory of the sd card. File SDCardRoot = Environment.getExternalStorageDirectory(); //create a new file, specifying the path, and the filename //which we want to save the file as. String filename= "effortback.png"; // you can download to any type of file ex:.jpeg (image) ,.txt(text file),.mp3 (audio file) Log.i("Local filename:",""+filename); File file = new File(SDCardRoot + "/",filename); //===================================== if(file.createNewFile()) { file.createNewFile(); } //===================================== //this will be used to write the downloaded data into the file we created FileOutputStream fileOutput = new FileOutputStream(file); //this will be used in reading the data from the internet InputStream inputStream = urlConnection.getInputStream(); //===================================== //this is the total size of the file int totalSize = urlConnection.getContentLength(); //variable to store total downloaded bytes int downloadedSize = 0; //===================================== //create a buffer... byte[] buffer = new byte[2048]; int bufferLength = 0; //used to store a temporary size of the buffer //now, read through the input buffer and write the contents to the file while ( (bufferLength = inputStream.read(buffer)) > 0 ) { //add the data in the buffer to the file in the file output stream (the file on the sd card fileOutput.write(buffer, 0, bufferLength); //add up the size so we know how much is downloaded downloadedSize += bufferLength; //this is where you would do something to report the prgress, like this maybe Log.i("Progress:","downloadedSize:"+downloadedSize+"totalSize:"+ totalSize) ; } //close the output stream when done fileOutput.close(); if(downloadedSize==totalSize) filepath=file.getPath(); //catch some possible errors... } catch (MalformedURLException e) { e.printStackTrace(); Log.i("URL-ERROR:",e.toString()); } catch (IOException e) { filepath=null; e.printStackTrace(); Log.i("IO-ERROR:",e.toString()); } Log.i("filepath:"," "+filepath) ; return filepath; } 

错误范围从:

 java.io.FileNotFoundException //I always get this with either one of the below org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1061) //or this one below libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionTmpl.java:186) 

似乎不pipe我尝试什么,我都无法让它工作。 如果我试图从谷歌或其他网站下载图片,但不是所有的,但绝对不是我的(.Net)。 我在这里错过了什么? 请帮忙。

如果服务器返回> = HTTPStatus.BAD_REQUEST (400),则可以从HttpUrlConnection (和OkHttpClient )获取FileNotFoundException 。 您应该首先检查状态码,以检查您需要阅读的stream。

 int status = connection.getResponseCode(); if(status >= HttpStatus.SC_BAD_REQUEST) in = connection.getErrorStream(); else in = connection.getInputStream(); 

HttpStatus弃用。 最新的语法似乎是:

  InputStream inputStream; int status = urlConnection.getResponseCode(); if (status != HttpURLConnection.HTTP_OK) inputStream = urlConnection.getErrorStream(); else inputStream = urlConnection.getInputStream(); 

有同样的问题,像你说的解决:

 urlConnection.setDoOutput(false); 

请注意,您必须将其设置为false,因为默认情况下为true。
请注意,您必须将其设置为false,因为Volley HurlStack将其设置为true。
保重 ;)

编辑:我刚刚检查了代码,默认情况下它是假的,@Abraham菲利普说。 但是我必须将它设置为false,因为如果我调用getDoOutput()它将返回true 。 我发现Volley HurlStack将其设置为true。 所以,我的结论是, setDoOutput为false,它将工作。

 package java.net; public abstract class URLConnection { ... /** * Specifies whether this {@code URLConnection} allows sending data. */ protected boolean doOutput; ... public boolean getDoOutput() { return doOutput; } public void setDoOutput(boolean newValue) { checkNotConnected(); this.doOutput = newValue; }