从互联网下载文件并将其中一些子串

时间:2015-03-13 17:15:09

标签: java download

我正在创建一个从互联网上下载文件的程序。 我对链接进行了子串,因为我想从链接中获取文件名。 这是我到目前为止所做的。

package main;

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

public class Main {

    public static void main(String[] args) {

        String url = "https://www.dropbox.com/s/8awaehjdh81fqam/CacheName.zip?dl=1";
        int lastSlashIndex = url.lastIndexOf('/');
        String filename= url.substring(lastSlashIndex + 1, 5);

        try{
            URL website = new URL(url);
            ReadableByteChannel rbc = Channels.newChannel(website.openStream());
            FileOutputStream fos = new FileOutputStream(filename);
            fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
        }catch(Exception e){ e.printStackTrace(); }

    }

}

它没有下载文件,我收到此错误:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -37
    at java.lang.String.substring(Unknown Source)
    at main.Main.main(Main.java:14)

3 个答案:

答案 0 :(得分:2)

@Hypino已经回答了你的问题,但我只是为了这个目的使用正则表达式。在我看来,对于这种情况,它是最简单,最易维护的解决方案:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DropboxAddressFileName {

    public static void main(String args[]) {
        String address = "https://www.dropbox.com/s/8awaehjdh81fqam/CacheName.zip?dl=1";
        Pattern p = Pattern.compile("^.*/(.*)\\?.*$");
        Matcher m = p.matcher(address);
        String match = m.group(1);
        System.out.println(match);
    }

}

您将在输出中获得CacheName.zip

答案 1 :(得分:2)

根据Java Docs,public String substring(int beginIndex, int endIndex)是如何调用substring方法的。你调用它的方式,它从lastSlashIndex + 1开始到结束于索引5(向后,不会工作)。这就是为什么例外情况是它在指数-37处超出范围。

您需要更像url.substring(lastSlashIndex + 1, lastSlashIndex + 1 + 5);

的内容

答案 2 :(得分:1)

String filename= url.substring(lastSlashIndex + 1, 55);