从 Internet 下载文件并对其进行子字符串化
Download file from internet and substring some of it
我正在创建一个从 Internet 下载文件的程序。
我对 link 进行子字符串化,因为我想从 link 中获取文件名。
这是我目前所拥有的。
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)
@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
。
根据 Java 文档,public String substring(int beginIndex, int endIndex)
是子字符串方法的调用方式。您调用它的方式是从 lastSlashIndex + 1
开始到索引 5 结束(倒退,行不通)。这就是异常说它在索引 -37 处超出范围的原因。
你想要更像 url.substring(lastSlashIndex + 1, lastSlashIndex + 1 + 5);
String filename= url.substring(lastSlashIndex + 1, 55);
我正在创建一个从 Internet 下载文件的程序。 我对 link 进行子字符串化,因为我想从 link 中获取文件名。 这是我目前所拥有的。
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)
@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
。
根据 Java 文档,public String substring(int beginIndex, int endIndex)
是子字符串方法的调用方式。您调用它的方式是从 lastSlashIndex + 1
开始到索引 5 结束(倒退,行不通)。这就是异常说它在索引 -37 处超出范围的原因。
你想要更像 url.substring(lastSlashIndex + 1, lastSlashIndex + 1 + 5);
String filename= url.substring(lastSlashIndex + 1, 55);