Как получить имя файла из строки, содержащей путь к файлу Absolute?

String переменная содержит имя файла C:\Hello\AnotherFolder\The File Name.PDF. Как получить имя файла The File Name.PDF только как строку?

Я планировал разбить строку, но это не оптимальное решение.

Ответ 1

просто используйте File.getName()

File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getName());

используя методы String:

  File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");  
System.out.println(f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("\\")+1));

Ответ 2

Альтернативный вариант Path (Java 7 +):

Path p = Paths.get("C:\\Hello\\AnotherFolder\\The File Name.PDF");
String file = p.getFileName().toString();

Обратите внимание, что разделение строки на \\ зависит от платформы, поскольку разделитель файлов может отличаться. Path#getName заботится об этой проблеме для вас.

Ответ 3

Использование FilenameUtils в Apache Commons IO:

String name1 = FilenameUtils.getName("/ab/cd/xyz.txt");
String name2 = FilenameUtils.getName("c:\\ab\\cd\\xyz.txt");

Ответ 4

Учитывая String о которой вы спрашиваете,

C:\Hello\AnotherFolder\The File Name.PDF

нам нужно извлечь все после последнего разделителя, т.е. \. Это то, что нас интересует.

Ты можешь сделать

String fullPath = "C:\\Hello\\AnotherFolder\\The File Name.PDF";
int index = fullPath.lastIndexOf("\\");
String fileName = fullPath.substring(index + 1);

Это приведет к восстановлению индекса последнего \ в вашей String и извлечет все, что приходит после него, в fileName.

Если у вас есть String с другим разделителем, настройте lastIndexOf для использования этого разделителя. (Там даже перегрузка, которая принимает всю String в качестве разделителя.)

Я опустил его в приведенном выше примере, но если вы не знаете, откуда взялась String или что она может содержать, вы хотите проверить, что lastIndexOf возвращает неотрицательное значение, потому что Javadoc утверждает, что он вернется

-1, если таких случаев нет

Ответ 5

Так как 1.7

    Path p = Paths.get("c:\\temp\\1.txt");
    String fileName = p.getFileName().toString();
    String directory = p.getParent().toString();

Ответ 6

вы можете использовать path = C:\Hello\AnotherFolder\TheFileName.PDF

String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());

Ответ 7

Другие ответы не совсем сработали для моего конкретного сценария, где я читаю пути, которые возникли из ОС, отличной от моей текущей. Чтобы разработать, я сохраняю вложения электронной почты, сохраненные с платформы Windows на сервере Linux. Имя файла, возвращаемое из API JavaMail, похоже на "C:\temp\hello.xls"

Решение, с которым я закончил:

String filenameWithPath = "C:\\temp\\hello.xls";
String[] tokens = filenameWithPath.split("[\\\\|/]");
String filename = tokens[tokens.length - 1];

Ответ 8

В случае, если Java является мультиплатформенной:

int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
    fileName = fileName.substring(lastPath+1);
}

Ответ 9

Метод без какой-либо зависимости и заботится о .., . и дублирующих разделителях.

public static String getFileName(String filePath) {
    if( filePath==null || filePath.length()==0 )
        return "";
    filePath = filePath.replaceAll("[/\\\\]+", "/");
    int len = filePath.length(),
        upCount = 0;
    while( len>0 ) {
        //remove trailing separator
        if( filePath.charAt(len-1)=='/' ) {
            len--;
            if( len==0 )
                return "";
        }
        int lastInd = filePath.lastIndexOf('/', len-1);
        String fileName = filePath.substring(lastInd+1, len);
        if( fileName.equals(".") ) {
            len--;
        }
        else if( fileName.equals("..") ) {
            len -= 2;
            upCount++;
        }
        else {
            if( upCount==0 )
                return fileName;
            upCount--;
            len -= fileName.length();
        }
    }
    return "";
}

Тестовый пример:

@Test
public void testGetFileName() {
    assertEquals("", getFileName("/"));
    assertEquals("", getFileName("////"));
    assertEquals("", getFileName("//C//.//../"));
    assertEquals("", getFileName("C//.//../"));
    assertEquals("C", getFileName("C"));
    assertEquals("C", getFileName("/C"));
    assertEquals("C", getFileName("/C/"));
    assertEquals("C", getFileName("//C//"));
    assertEquals("C", getFileName("/A/B/C/"));
    assertEquals("C", getFileName("/A/B/C"));
    assertEquals("C", getFileName("/C/./B/../"));
    assertEquals("C", getFileName("//C//./B//..///"));
    assertEquals("user", getFileName("/user/java/.."));
    assertEquals("C:", getFileName("C:"));
    assertEquals("C:", getFileName("/C:"));
    assertEquals("java", getFileName("C:\\Program Files (x86)\\java\\bin\\.."));
    assertEquals("C.ext", getFileName("/A/B/C.ext"));
    assertEquals("C.ext", getFileName("C.ext"));
}

Может быть, getFileName немного запутан, потому что он также возвращает имена каталогов. Он возвращает имя файла или последнего каталога в пути.

Ответ 10

извлечь имя файла, используя java regex *.

public String extractFileName(String fullPathFile){
        try {
            Pattern regex = Pattern.compile("([^\\\\/:*?\"<>|\r\n]+$)");
            Matcher regexMatcher = regex.matcher(fullPathFile);
            if (regexMatcher.find()){
                return regexMatcher.group(1);
            }
        } catch (PatternSyntaxException ex) {
            LOG.info("extractFileName::pattern problem <"+fullPathFile+">",ex);
        }
        return fullPathFile;
    }