Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java应用程序下载文件_Java_File_Class_Url - Fatal编程技术网

从java应用程序下载文件

从java应用程序下载文件,java,file,class,url,Java,File,Class,Url,嗨,我需要一些帮助从我的java应用程序下载一个文件 URL为“http://my.site.com/UICFEWebroot/QueryOneDateAllCur?lang=ita&rate=0&initDay=11&initMonth=10&initYear=2010&refCur=euro&R1=csv" 我尝试使用此代码,但结果是一个空文件 URL urlAgg = new URL(address); int lf = urlAgg.openConnection().getCont

嗨,我需要一些帮助从我的java应用程序下载一个文件

URL为“http://my.site.com/UICFEWebroot/QueryOneDateAllCur?lang=ita&rate=0&initDay=11&initMonth=10&initYear=2010&refCur=euro&R1=csv"

我尝试使用此代码,但结果是一个空文件

URL urlAgg = new URL(address);  

int lf = urlAgg.openConnection().getContentLength();  
FileOutputStream fos = new FileOutputStream("agg" + File.separator + "cambio" + gg + mm + aaaa + ".csv");   
InputStream in = urlAgg.openStream();  
for (int i = 0; i < lf; i++)
  {
   byte[] b = new byte[1];   
   in.read(b);  
   fos.write(b);   
  }

fos.close();  
in.close();
URL-urlAgg=新的URL(地址);
int lf=urlAgg.openConnection().getContentLength();
FileOutputStream fos=新的FileOutputStream(“agg”+File.separator+“cambio”+gg+mm+aaaa+“.csv”);
InputStream in=urlAgg.openStream();
for(int i=0;i
您可以暂时更改“for”子句。如果内容长度不正确,请确保下载:

 String urlTemp = "the URL";
 File saveFile = new File("File to save path");  
 URL url = new URL(urlTemp);
 URLConnection connection = url.openConnection();
 InputStream is = connection.getInputStream();
 FileOutputStream fos = new FileOutputStream(saveFile);


 byte[] buffer = new byte[1024];
 int read = 0;
 while ((read = is.read(buffer, 0, buffer.length)) >= 0) {
     fos.write(buffer, 0, read);
 }

 fos.flush();
 fos.close();
 is.close();
此外,还需要try/catch部分。如果要下载的文件很大,则可能需要在连接对象上设置更大的超时:

connection .setConnectTimeout(timeoutonnect);
connection .setReadTimeout(timeoutRead );
希望代码片段对您有所帮助

这对我很有用:

package download;

import java.io.*;
import java.net.URL;

/**
 * DownloadDemo
 * User: Michael
 * Date: Oct 11, 2010
 * Time: 10:19:34 AM
 */
public class DownloadDemo
{
    public static void main(String[] args)
    {
        StringBuilder contents = new StringBuilder(4096);
        BufferedReader br = null;

        try
        {
            String downloadSite = ((args.length > 0) ? args[0] : "http://www.google.com");
            String outputFile = ((args.length > 1) ? args[1] : "currencies.csv");
            URL url = new URL(downloadSite);
            InputStream is = url.openConnection().getInputStream();
            br = new BufferedReader(new InputStreamReader(is));
            PrintStream ps = new PrintStream(new FileOutputStream(outputFile));
            String line;
            String newline = System.getProperty("line.separator");
            while ((line = br.readLine()) != null)
            {
                contents.append(line).append(newline);
            }
            ps.println(contents.toString());
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try { if (br != null) br.close(); } catch(IOException e) { e.printStackTrace(); }
        }
    }
}
以下是部分结果(太大,无法容纳整个结果):


我总是使用一个库来跳过这个样板代码。这是一个例子:

编辑(duffymo): 以下是实际可运行的代码:


编辑(seanizer):

文件非常小。我认为问题在于地址字符串不是一个文件,而是一个php或simil请求。url不是问题,这段代码将以流的形式下载url的内容。如果您的文件不大,连接超时也很重要,但是如果服务器或连接速度较慢,那么在代码中,您是逐字节下载文件,这不是很有效;)内容长度不一定不正确。这是一个可选的标题。当它不存在时,响应通常只是使用分块编码传输。没错,如果你在firebug中检查对url请求的响应,你会发现内容长度不存在,但如果我想以cvs格式保存文件,你能帮我吗?看起来它已经是CSV格式了,除了新词。我已经添加了它们,并用修改过的代码将结果写入一个文件。如果我添加了使代码运行实际需要的东西(例如,导入、类、主方法等),那么您的版本最终会有49行Java代码;我的只有44个。两种款式都一样。我想说我的比较短,而你的比较依赖。如果你愿意,我可以把它寄出去。@duffymo真的吗?在我的机器上是我的35()和你的45(),两者都包括一些空行。但这不是我的观点:我更喜欢使用描述性的高级方法,在这种方法中,每个人都能立即看到代码所做的事情,你可以使用高效但不太容易沟通的代码。是的:您的代码可能执行得更好,但我的代码对于没有经验的开发人员来说更具可读性和可维护性。我想说这两种方法都是有效的。是的,就像我说的,我可以发布它。我可以编辑你的答案,这样你就可以看到了。还有其他的东西在里面,我倾向于有一种不会减少线条的风格,但两者都是相似的。我怀疑这其中是否存在性能差异:网络下载淹没了我们可能进行的任何微优化。我猜你的库代码更有效。你的观点在可读性方面得到了很好的理解。我只是对你的“代码行数更少”的说法感到好奇。不正确,所以这不是决定因素。@duffymo行显然是一个复杂的指标,因为有很多方法可以编写java代码。我所做的是将我们的每一个代码都传递到eclipse中,并让格式化程序在不改变结果的情况下使用我的标准设置(我使用了您的主方法并粘贴到我现有的类中)。因此,是的,我的格式化程序设置会对结果产生偏差。如果你有时间的话,我会对你的版本感兴趣。衡量性能-这是一次失败。两种情况下均为1210-1240毫秒。
C:\JDKs\jdk1.6.0_13\bin\java -Didea.launcher.port=7533  com.intellij.rt.execution.application.AppMain download.DownloadDemo http://uif.bancaditalia.it/UICFEWebroot/QueryOneDateAllCur?lang=ita&rate=0&initDay=11&initMonth=10&initYear=2010&refCur=euro&R1=csv
Quotazioni in euro riferite al 11/10/2010""Paese,Valuta,Codice ISO,Codice UIC,Quotazione,Convenzione di cambio,Nota""AFGHANISTAN,Afghani,AFN,115,62.8792,Foreign currency amount for 1 Euro,CAMBI INDICATIVI CALCOLATI GIORNALMENTE DA BI SULLA BASE DELLE RILEVAZIONI DI MERCATOALBANIA,Lek,ALL,047,138.163,Foreign currency amount for 1 Euro,CAMBI INDICATIVI CALCOLATI GIORNALMENTE DA BI SULLA BASE DELLE RILEVAZIONI DI MERCATOALGERIA,Dinaro Algerino,DZD,106,103.035,Foreign currency amount for 1 Euro,CAMBI INDICATIVI CALCOLATI GIORNALMENTE DA BI SULLA BASE DELLE RILEVAZIONI DI MERCATOANGOLA,Readjustado Kwanza,AOA,087,128.395,Foreign currency amount for 1 Euro,CAMBI INDICATIVI CALCOLATI GIORNALMENTE DA BI SULLA BASE DELLE RILEVAZIONI DI MERCATOANTIGUA E BARBUDA,Dollaro Caraibi Est,XCD,137,3.76272,Foreign currency amount for 1 Euro,CAMBI INDICATIVI CALCOLATI GIORNALMENTE DA BI SULLA BASE DELLE RILEVAZIONI DI MERCATOANTILLE OLANDESI,Fiorino Antille Olandesi,ANG,132,2.48061,Foreign currency amount for 1 Euro,CAMBI INDICATIVI CALCOLATI GIORNALMENTE DA BI SULLA BASE DELLE RILEVAZIONI DI MERCATOARABIA SAUDITA,Riyal Saudita,SAR,075,5.22619,Foreign currency amount for 1 Euro,CAMBI INDICATIVI CALCOLATI GIORNALMENTE DA BI SULLA BASE DELLE RILEVAZIONI DI MERCATOARGENTINA,Peso Argentina,ARS,216,5.51578,Foreign currency amount for 1 EuroCAMBI INDICATIVI CALCOLATI GIORNALMENTE DA BI SULLA BASE DELLE RILEVAZIONI DI MERCATO

Process finished with exit code 0
final String url = "http://www.etc.etc";
final String fileName = "/foo/bar/baz.txt";

InputStream in = null;
OutputStream out = null;
try{
    in = new URL(url).openStream();
    final File f = new File(fileName);
    final File par = f.getParentFile();
    if(!par.exists() && !par.mkdirs()){
        throw new IllegalStateException(
            "Couldn't create folder " + par);
    }
    out = FileUtils.openOutputStream(f);
    IOUtils.copy(in, out);
} catch(final IOException e){
    // handle exception
} finally{
    IOUtils.closeQuietly(in);
    IOUtils.closeQuietly(out);
}