我需要从这个网页下载一个使用java的文件 http://www.okaa.gr/files/1/%CE%9F%CE%9A%CE%91%CE%91/%CE%A4%CE%99%CE%9C%CE%95%CE%A3 %CE%A7%CE%9F%CE%9D%CE%94%CE%A1%CE%99%CE%9A%CE%97%CE%A3/20150409-pasxa.pdf 希腊字母中有文字。 如果您在浏览器上使用此URL,它可以正常工作,并打开一个pdf文件。在Java中使用它,我得到400错误。 我使用了许多不同的方法,假设我做了我想要的,但他们都得到了同样的错误。 这适用于不同的站点和不同的文件
String okaa="http://www.okaa.gr/";
String link="gr/nea-kai-anakoinoseis/statistika-deltia-timon/?date=09&month=4&year=2015&catname=0";
URL okaaLink = new URL(okaa+link);
BufferedReader in = new BufferedReader(
new InputStreamReader(okaaLink.openStream()));
ArrayList<String> links =new ArrayList<String>();
String inputLine;
while ((inputLine = in.readLine()) != null)
{
if(inputLine.contains(".pdf"))
{
String newLink=inputLine.substring(inputLine.indexOf("href")+6,inputLine.indexOf("download")-2);
links.add(okaa+newLink);
}
}
in.close();
ArrayList<String> links =new ArrayList<String>();
links.add(url); //the url in question
for (int i=0;i<links.size();i++)
{
// download and save the file
URL website = new URL(links.get(i));//the url link
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream(i+".pdf");
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
}
任何帮助?
编辑:
更新的代码。我首先从主页面读取链接列表,删除html部分(substring命令)并将其传递给ArrayList。
然后使用数组列表上的URL我想下载文件
但即使我从浏览器中复制网址并将其直接粘贴到命令URL website = new URL("....");
解决:
谢谢@Yannick,我所要做的就是使用newLink=newLink.replaceAll("\\s","");
我永远都不会想到它!
答案 0 :(得分:3)
问题可能是链接包含空格
...%A3%CE ...
您的浏览器会自动将“”替换为“”,因为带有空格的链接无效。
newuserua_ext 的解决方案不包含此空格,这可能是它起作用的原因。
答案 1 :(得分:0)
这就是我尝试并下载的pdf文件;
ArrayList<String> links = new ArrayList<String>();
links.add("http://www.okaa.gr/files/1/%CE%9F%CE%9A%CE%91%CE%91/%CE%A4%CE%99%CE%9C%CE%95%CE%A3%20%CE%A7%CE%9F%CE%9D%CE%94%CE%A1%CE%99%CE%9A%CE%97%CE%A3/20150409-pasxa.pdf");
for (int i = 0; i < links.size(); i++) {
System.out.println("opening connection");
URL url = new URL(links.get(i));
InputStream in = url.openStream();
FileOutputStream fos = new FileOutputStream(new File(i + ".pdf"));
System.out.println("reading file...");
int length = -1;
byte[] buffer = new byte[1024];// buffer for portion of data from
// connection
while ((length = in.read(buffer)) > -1) {
fos.write(buffer, 0, length);
}
fos.close();
in.close();
System.out.println("file was downloaded");
}
输出;