从URL获取文件名
在Java中,给定一个java.net.URL
或http://www.example.com/some/path/to/a/file.xml
forms的String
,获取文件名最简单的方法是什么,减去扩展名? 所以,在这个例子中,我正在寻找返回"file"
东西。
我可以想到几种方法来做到这一点,但我正在寻找一些容易阅读和简短的东西。
如何使用Apache commons-io ,而不是重新发明轮子:
import org.apache.commons.io.FilenameUtils; public class FilenameUtilTest { public static void main(String[] args) throws Exception { URL url = new URL("http://www.example.com/some/path/to/a/file.xml?foo=bar#test"); System.out.println(FilenameUtils.getBaseName(url.getPath())); // -> file System.out.println(FilenameUtils.getExtension(url.getPath())); // -> xml System.out.println(FilenameUtils.getName(url.getPath())); // -> file.xml } }
String fileName = url.substring( url.lastIndexOf('/')+1, url.length() ); String fileNameWithoutExtn = fileName.substring(0, fileName.lastIndexOf('.'));
这应该关于它(我将离开error handling给你):
int slashIndex = url.lastIndexOf('/'); int dotIndex = url.lastIndexOf('.', slashIndex); String filenameWithoutExtension; if (dotIndex == -1) { filenameWithoutExtension = url.substring(slashIndex + 1); } else { filenameWithoutExtension = url.substring(slashIndex + 1, dotIndex); }
public static String getFileName(URL extUrl) { //URL: "http://photosaaaaa.net/photos-ak-snc1/v315/224/13/659629384/s659629384_752969_4472.jpg" String filename = ""; //PATH: /photos-ak-snc1/v315/224/13/659629384/s659629384_752969_4472.jpg String path = extUrl.getPath(); //Checks for both forward and/or backslash //NOTE:**While backslashes are not supported in URL's //most browsers will autoreplace them with forward slashes //So technically if you're parsing an html page you could run into //a backslash , so i'm accounting for them here; String[] pathContents = path.split("[\\\\/]"); if(pathContents != null){ int pathContentsLength = pathContents.length; System.out.println("Path Contents Length: " + pathContentsLength); for (int i = 0; i < pathContents.length; i++) { System.out.println("Path " + i + ": " + pathContents[i]); } //lastPart: s659629384_752969_4472.jpg String lastPart = pathContents[pathContentsLength-1]; String[] lastPartContents = lastPart.split("\\."); if(lastPartContents != null && lastPartContents.length > 1){ int lastPartContentLength = lastPartContents.length; System.out.println("Last Part Length: " + lastPartContentLength); //filenames can contain . , so we assume everything before //the last . is the name, everything after the last . is the //extension String name = ""; for (int i = 0; i < lastPartContentLength; i++) { System.out.println("Last Part " + i + ": "+ lastPartContents[i]); if(i < (lastPartContents.length -1)){ name += lastPartContents[i] ; if(i < (lastPartContentLength -2)){ name += "."; } } } String extension = lastPartContents[lastPartContentLength -1]; filename = name + "." +extension; System.out.println("Name: " + name); System.out.println("Extension: " + extension); System.out.println("Filename: " + filename); } } return filename; }
获取 带有扩展名的文件名 , 不带扩展名 , 只有带3行的扩展名 :
String urlStr = "http://www.example.com/yourpath/foler/test.png"; String fileName = urlStr.substring(urlStr.lastIndexOf('/')+1, urlStr.length()); String fileNameWithoutExtension = fileName.substring(0, fileName.lastIndexOf('.')); String fileExtension = urlStr.substring(urlStr.lastIndexOf(".")); Log.i("File Name", fileName); Log.i("File Name Without Extension", fileNameWithoutExtension); Log.i("File Extension", fileExtension);
日志结果:
File Name(13656): test.png File Name Without Extension(13656): test File Extension(13656): .png
希望它会帮助你。
如果你不需要去除文件扩展名,这里有一个方法来做到这一点,而不是采取容易出错的string操作,而不使用外部库。 适用于Java 1.7+:
import java.net.URI import java.nio.file.Paths String url = "http://example.org/file?p=foo&q=bar" String filename = Paths.get(new URI(url).getPath()).getFileName().toString()
我已经想出了这个:
String url = "http://www.example.com/some/path/to/a/file.xml"; String file = url.substring(url.lastIndexOf('/')+1, url.lastIndexOf('.'));
String fileName = url.substring(url.lastIndexOf('/') + 1);
这是在Android中最简单的方法。 我知道它不会在Java中工作,但它可以帮助Android应用程序开发人员。
import android.webkit.URLUtil; public String getFileNameFromURL(String url) { String fileNameWithExtension = null; String fileNameWithoutExtension = null; if (URLUtil.isValidUrl(url)) { fileNameWithExtension = URLUtil.guessFileName(url, null, null); if (fileNameWithExtension != null && !fileNameWithExtension.isEmpty()) { String[] f = fileNameWithExtension.split("."); if (f != null & f.length > 1) { fileNameWithoutExtension = f[0]; } } } return fileNameWithoutExtension; }
把事情简单化 :
/** * This function will take an URL as input and return the file name. * <p>Examples :</p> * <ul> * <li>http://example.com/a/b/c/test.txt -> test.txt</li> * <li>http://example.com/ -> an empty string </li> * <li>http://example.com/test.txt?param=value -> test.txt</li> * <li>http://example.com/test.txt#anchor -> test.txt</li> * </ul> * * @param url The input URL * @return The URL file name */ public static String getFileNameFromUrl(URL url) { String urlString = url.getFile(); return urlString.substring(urlString.lastIndexOf('/') + 1).split("\\?")[0].split("#")[0]; }
从string创build一个URL对象。 首先你有一个URL对象,有一些方法可以很容易地把你需要的任何信息片断拉出来。
我可以强烈推荐Javaalmanac网站,它有很多的例子,但从那以后, 您可能会发现http://exampledepot.8waytrips.com/egs/java.io/File2Uri.html有趣:;
// Create a file object File file = new File("filename"); // Convert the file object to a URL URL url = null; try { // The file need not exist. It is made into an absolute path // by prefixing the current working directory url = file.toURL(); // file:/d:/almanac1.4/java.io/filename } catch (MalformedURLException e) { } // Convert the URL to a file object file = new File(url.getFile()); // d:/almanac1.4/java.io/filename // Read the file contents using the URL try { // Open an input stream InputStream is = url.openStream(); // Read from is is.close(); } catch (IOException e) { // Could not open the file }
url最后可以有参数,这个
/** * Getting file name from url without extension * @param url string * @return file name */ public static String getFileName(String url) { String fileName; int slashIndex = url.lastIndexOf("/"); int qIndex = url.lastIndexOf("?"); if (qIndex > slashIndex) {//if has parameters fileName = url.substring(slashIndex + 1, qIndex); } else { fileName = url.substring(slashIndex + 1); } if (fileName.contains(".")) { fileName = fileName.substring(0, fileName.lastIndexOf(".")); } return fileName; }
如果只想从java.net.URL中获取文件名(不包括任何查询参数),则可以使用以下函数:
public static String getFilenameFromURL(URL url) { return new File(url.getPath().toString()).getName(); }
例如,这个inputurl:
"http://example.com/image.png?version=2&modificationDate=1449846324000"
会被转换成这个输出string:
image.png
安迪的回答使用split()重做:
Url u= ...; String[] pathparts= u.getPath().split("\\/"); String filename= pathparts[pathparts.length-1].split("\\.", 1)[0];
public String getFileNameWithoutExtension(URL url) { String path = url.getPath(); if (StringUtils.isBlank(path)) { return null; } if (StringUtils.endsWith(path, "/")) { //is a directory .. return null; } File file = new File(url.getPath()); String fileNameWithExt = file.getName(); int sepPosition = fileNameWithExt.lastIndexOf("."); String fileNameWithOutExt = null; if (sepPosition >= 0) { fileNameWithOutExt = fileNameWithExt.substring(0,sepPosition); }else{ fileNameWithOutExt = fileNameWithExt; } return fileNameWithOutExt; }
这个怎么样:
String filenameWithoutExtension = null; String fullname = new File( new URI("http://www.xyz.com/some/deep/path/to/abc.png").getPath()).getName(); int lastIndexOfDot = fullname.lastIndexOf('.'); filenameWithoutExtension = fullname.substring(0, lastIndexOfDot == -1 ? fullname.length() : lastIndexOfDot);
为了返回没有扩展名和不带参数的文件名 ,使用以下命令:
String filenameWithParams = FilenameUtils.getBaseName(urlStr); // may hold params if http://example.com/a?param=yes return filenameWithParams.split("\\?")[0]; // removing parameters from url if they exist
为了返回没有参数的扩展名的文件使用这个:
/** Parses a URL and extracts the filename from it or returns an empty string (if filename is non existent in the url) <br/> * This method will work in win/unix formats, will work with mixed case of slashes (forward and backward) <br/> * This method will remove parameters after the extension * * @param urlStr original url string from which we will extract the filename * @return filename from the url if it exists, or an empty string in all other cases */ private String getFileNameFromUrl(String urlStr) { String baseName = FilenameUtils.getBaseName(urlStr); String extension = FilenameUtils.getExtension(urlStr); try { extension = extension.split("\\?")[0]; // removing parameters from url if they exist return baseName.isEmpty() ? "" : baseName + "." + extension; } catch (NullPointerException npe) { return ""; } }
我发现一些直接传递给FilenameUtils.getName
url会返回不需要的结果,这需要被封装以避免漏洞。
例如,
System.out.println(FilenameUtils.getName("http://www.google.com/.."));
回报
..
我怀疑有人愿意允许。
下面的函数似乎工作正常,并显示一些这些testing用例,并且当文件名不能确定时它返回null
。
public static String getFilenameFromUrl(String url) { if (url == null) return null; try { // Add a protocol if none found if (! url.contains("//")) url = "http://" + url; URL uri = new URL(url); String result = FilenameUtils.getName(uri.getPath()); if (result == null || result.isEmpty()) return null; if (result.contains("..")) return null; return result; } catch (MalformedURLException e) { return null; } }
在下面的例子中,这包含了一些简单的testing用例:
import java.util.Objects; import java.net.URL; import org.apache.commons.io.FilenameUtils; class Main { public static void main(String[] args) { validateFilename(null, null); validateFilename("", null); validateFilename("www.google.com/../me/you?trex=5#sdf", "you"); validateFilename("www.google.com/../me/you?trex=5 is the num#sdf", "you"); validateFilename("http://www.google.com/test.png?test", "test.png"); validateFilename("http://www.google.com", null); validateFilename("http://www.google.com#test", null); validateFilename("http://www.google.com////", null); validateFilename("www.google.com/..", null); validateFilename("http://www.google.com/..", null); validateFilename("http://www.google.com/test", "test"); validateFilename("https://www.google.com/../../test.png", "test.png"); validateFilename("file://www.google.com/test.png", "test.png"); validateFilename("file://www.google.com/../me/you?trex=5", "you"); validateFilename("file://www.google.com/../me/you?trex", "you"); } private static void validateFilename(String url, String expectedFilename){ String actualFilename = getFilenameFromUrl(url); System.out.println(""); System.out.println("url:" + url); System.out.println("filename:" + expectedFilename); if (! Objects.equals(actualFilename, expectedFilename)) throw new RuntimeException("Problem, actual=" + actualFilename + " and expected=" + expectedFilename + " are not equal"); } public static String getFilenameFromUrl(String url) { if (url == null) return null; try { // Add a protocol if none found if (! url.contains("//")) url = "http://" + url; URL uri = new URL(url); String result = FilenameUtils.getName(uri.getPath()); if (result == null || result.isEmpty()) return null; if (result.contains("..")) return null; return result; } catch (MalformedURLException e) { return null; } } }
除了所有的高级方法之外,我的简单技巧是StringTokenizer
:
import java.util.ArrayList; import java.util.StringTokenizer; public class URLName { public static void main(String args[]){ String url = "http://www.example.com/some/path/to/a/file.xml"; StringTokenizer tokens = new StringTokenizer(url, "/"); ArrayList<String> parts = new ArrayList<>(); while(tokens.hasMoreTokens()){ parts.add(tokens.nextToken()); } String file = parts.get(parts.size() -1); int dot = file.indexOf("."); String fileName = file.substring(0, dot); System.out.println(fileName); } }
一个class轮:
new File(uri.getPath).getName
完整的代码:
import java.io.File import java.net.URI val uri = new URI("http://example.org/file.txt?whatever") new File(uri.getPath).getName res18: String = file.txt
注意 : URI#gePath
已经足够智能去除查询参数和协议的scheme。 例子:
new URI("http://example.org/hey/file.txt?whatever").getPath res20: String = /hey/file.txt new URI("hdfs:///hey/file.txt").getPath res21: String = /hey/file.txt new URI("file:///hey/file.txt").getPath res22: String = /hey/file.txt
urllib中的Url
对象允许您访问path的非转义文件名。 这里有些例子:
String raw = "http://www.example.com/some/path/to/a/file.xml"; assertEquals("file.xml", Url.parse(raw).path().filename()); raw = "http://www.example.com/files/r%C3%A9sum%C3%A9.pdf"; assertEquals("résumé.pdf", Url.parse(raw).path().filename());
create a new file with string image path String imagePath; File test = new File(imagePath); test.getName(); test.getPath(); getExtension(test.getName()); public static String getExtension(String uri) { if (uri == null) { return null; } int dot = uri.lastIndexOf("."); if (dot >= 0) { return uri.substring(dot); } else { // No extension. return ""; } }
import java.io. *;
import java.net.*; public class ConvertURLToFileName{ public static void main(String[] args)throws IOException{ BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Please enter the URL : "); String str = in.readLine(); try{ URL url = new URL(str); System.out.println("File : "+ url.getFile()); System.out.println("Converting process Successfully"); } catch (MalformedURLException me){ System.out.println("Converting process error"); }
我希望这能帮到您。