Java 에서의 형식으로 a java.net.URL
또는 a String
를 http://www.example.com/some/path/to/a/file.xml
지정하면 확장자를 뺀 파일 이름을 얻는 가장 쉬운 방법은 무엇입니까? 따라서이 예에서는을 반환하는 것을 찾고 "file"
있습니다.
나는 이것을 할 수있는 여러 가지 방법을 생각할 수 있지만 읽기 쉽고 짧은 것을 찾고 있습니다.
Java 에서의 형식으로 a java.net.URL
또는 a String
를 http://www.example.com/some/path/to/a/file.xml
지정하면 확장자를 뺀 파일 이름을 얻는 가장 쉬운 방법은 무엇입니까? 따라서이 예에서는을 반환하는 것을 찾고 "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
}
}
URL#getPath
및 String#substring
or Path#getFileName
또는 참조 File#getName
).
String fileName = url.substring( url.lastIndexOf('/')+1, url.length() );
String fileNameWithoutExtn = fileName.substring(0, fileName.lastIndexOf('.'));
substring()
http://example.org/file#anchor
, http://example.org/file?p=foo&q=bar
도http://example.org/file.xml#/p=foo&q=bar
String url = new URL(original_url).getPath()
파일 이름이 포함되지 않은 파일 이름에 특별한 경우를 허용 하고 추가하면 .
정상적으로 작동합니다.
파일 확장자를 제거 할 필요가없는 경우 오류가 발생하기 쉬운 문자열 조작이나 외부 라이브러리를 사용하지 않고 파일 확장자를 제거하는 방법이 있습니다. 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()
URI.getPath()
는 String
작동하지 않는 이유를 모르겠습니다
getPath
하고 대신 URI 오버로드를 사용 하더라도 여전히 작동 합니다.
Paths.get(new URI(url))
인가요? 저에게는 효과가없는 것 같습니다
이것으로 잘라야합니다 (오류 처리를 남겨 두겠습니다).
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);
}
http://www.example.com/
또는 http://www.example.com/folder/
)을 빈 문자열로 전달하면 빈 문자열로 끝나는 것입니다.
lastIndexOf
이런 식으로 작동하지 않습니다. 그러나 의도는 분명하다.
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;
}
짧막 한 농담:
new File(uri.getPath).getName
완전한 코드 (스칼라 REPL에서) :
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
쿼리 매개 변수와 프로토콜 체계를 제거하기에 충분히 지능적입니다. 예 :
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
가져 오기 파일의 확장자 이름 , 확장하지 않고 , 단지 확장 단지 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
그것이 도움이되기를 바랍니다.
몇 가지 방법이 있습니다.
Java 7 파일 I / O :
String fileName = Paths.get(strUrl).getFileName().toString();
아파치 커먼즈 :
String fileName = FilenameUtils.getName(strUrl);
Jersey 사용 :
UriBuilder buildURI = UriBuilder.fromUri(strUrl);
URI uri = buildURI.build();
String fileName = Paths.get(uri.getPath()).getFileName();
부분 문자열 :
String fileName = strUrl.substring(strUrl.lastIndexOf('/') + 1);
Paths.get(new URL(strUrl).getFile()).getFileName().toString();
아이디어 주셔서 감사합니다!
간단하게 유지하십시오.
/**
* 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];
}
url.getFile()
로 바꾸고 경로에서 url.toString()
작동 #
합니다.
안드로이드에서 가장 간단한 방법은 다음과 같습니다. 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;
}
문자열에서 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
}
java.net.URL에서 파일 이름 만 가져 오려면 (쿼리 매개 변수는 포함하지 않음) 다음 함수를 사용할 수 있습니다.
public static String getFilenameFromURL(URL url) {
return new File(url.getPath().toString()).getName();
}
예를 들어이 입력 URL은 다음과 같습니다.
"http://example.com/image.png?version=2&modificationDate=1449846324000"
이 출력 문자열로 변환됩니다.
image.png
FilenameUtils.getName
원치 않는 결과 를 반환 하기 위해 직접 전달할 때 일부 URL이 발견 되었으며 악용을 피하기 위해이 URL 을 래핑해야합니다.
예를 들어
System.out.println(FilenameUtils.getName("http://www.google.com/.."));
보고
..
나는 누군가가 허락하고 싶어하는 것을 의심한다.
다음 함수는 정상적으로 작동하는 것으로 보이며 이러한 테스트 사례 중 일부를 보여 주며 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;
}
}
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;
}
}
}
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;
}
/
조각으로 나타날 수 있습니다. 잘못된 것을 추출 할 것입니다.
urllib 의 Url
객체 를 사용하면 경로의 이스케이프되지 않은 파일 이름에 액세스 할 수 있습니다. 여기 몇 가지 예가 있어요.
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());
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 "";
}
}
모든 고급 방법 외에도 간단한 요령은 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);
}
}
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 "";
}
}
나는 당신과 같은 문제가 있습니다. 나는 이것을 해결했다.
var URL = window.location.pathname; // Gets page name
var page = URL.substring(URL.lastIndexOf('/') + 1);
console.info(page)
수입 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");
}
이것이 도움이되기를 바랍니다.