Java путь к файлу windows

Search code, repositories, users, issues, pull requests…

Provide feedback

Saved searches

Use saved searches to filter your results more quickly

Sign up

Creating a Path

Using the Paths Factory Class

A Path instance contains the information used to specify the location of a file or directory. At the time it is defined, a Path is provided with a series of one or more names. A root element or a file name might be included, but neither are required. A Path might consist of just a single directory or file name.

You can easily create a Path object by using one of the following get methods from the Paths (note the plural) helper class:

Path p1 = Paths.get("/tmp/foo");
Path p2 = Paths.get(args[0]);
Path p3 = Paths.get(URI.create("file:///Users/joe/FileTest.java"));

The Paths.get(String) method is shorthand for the following code:

Path p4 = FileSystems.getDefault().getPath("/users/sally");

The following example creates /u/joe/logs/foo.log assuming your home directory is /u/joe, or C:\joe\logs\foo.log if you are on Windows.

Path p5 = Paths.get(System.getProperty("user.home"),"logs", "foo.log");

Using the Path.of() Factory methods

Two factory methods have been added to the Path interface in Java SE 9.

The first method takes a string of characters, denoting the path string or the initial part of the path string. It can take further string of characters as a vararg that are joined to form the path string.

The second method takes a URI, which is converted to this path.

The following code used the first factory method to create a path.

Path debugFile = Path.of("/tmp/debug.log");

Retrieving Information about a Path

You can think of the Path as storing these name elements as a sequence. The highest element in the directory structure would be located at index 0. The lowest element in the directory structure would be located at index [n-1], where n is the number of name elements in the Path. Methods are available for retrieving individual elements or a subsequence of the Path using these indexes.

The examples in this section use the following directory structure.

Sample Directory Structure

Sample Directory Structure

The following code snippet defines a Path instance and then invokes several methods to obtain information about the path:

// None of these methods requires that the file corresponding
// to the Path exists.
// Microsoft Windows syntax
Path path = Paths.get("C:\\home\\joe\\foo");

// Solaris syntax
Path path = Paths.get("/home/joe/foo");

System.out.format("toString: %s%n", path.toString());
System.out.format("getFileName: %s%n", path.getFileName());
System.out.format("getName(0): %s%n", path.getName(0));
System.out.format("getNameCount: %d%n", path.getNameCount());
System.out.format("subpath(0,2): %s%n", path.subpath(0,2));
System.out.format("getParent: %s%n", path.getParent());
System.out.format("getRoot: %s%n", path.getRoot());

Here is the output for both Windows and the Solaris OS:

Methode invoked Returns in the Solaris OS Returns in Microsoft Windows Comments
toString() /home/joe/foo C:\home\joe\foo Returns the string representation of the Path. If the path was created using Filesystems.getDefault().getPath(String) or Paths.get() or Path.of() (the latter is a convenience method for getPath), the method performs minor syntactic cleanup. For example, in a UNIX operating system, it will correct the input string //home/joe/foo to /home/joe/foo.
getFileName() foo foo Returns the file name or the last element of the sequence of name elements.
getName(0) home home
getNameCount() 3 3 Returns the number of elements in the path.
subpath(0, 2) home/joe home\joe Returns the subsequence of the Path (not including a root element) as specified by the beginning and ending indexes.
getParent() /home/joe \home\joe Returns the path of the parent directory.
getRoot() / C:\ Returns the root of the path.

The previous example shows the output for an absolute path. In the following example, a relative path is specified:

// Solaris syntax
Path path = Paths.get("sally/bar");
// Microsoft Windows syntax
Path path = Paths.get("sally\\bar");

Here is the output for Windows and the Solaris OS:

Methode invoked Returns in the Solaris OS Returns in Microsoft Windows
toString() sally/bar sally\bar
getFileName() bar bar
getName(0) sally sally
getNameCount() 2 2
subpath(0, 1) sally sally
getParent() sally sally
getRoot() null null

Removing Redundancies From a Path

Many file systems use «.» notation to denote the current directory and «..» to denote the parent directory. You might have a situation where a Path contains redundant directory information. Perhaps a server is configured to save its log files in the /dir/logs/. directory, and you want to delete the trailing «/.» notation from the path.

The following examples both include redundancies:

/home/./joe/foo
/home/sally/../joe/foo

The normalize() method removes any redundant elements, which includes any «.» or «directory/..» occurrences. Both of the preceding examples normalize to /home/joe/foo.

It is important to note that normalize does not check at the file system when it cleans up a path. It is a purely syntactic operation. In the second example, if sally were a symbolic link, removing sally/.. might result in a Path that no longer locates the intended file.

To clean up a path while ensuring that the result locates the correct file, you can use the toRealPath() method. This method is described in the next section.

Converting a Path

You can use three methods to convert the Path. If you need to convert the path to a string that can be opened from a browser, you can use toUri(). For example:

Path p1 = Paths.get("/home/logfile");

System.out.format("%s%n", p1.toUri());

Running this code produces the following result:

file:///home/logfile

The toAbsolutePath() method converts a path to an absolute path. If the passed-in path is already absolute, it returns the same Path object. The toAbsolutePath() method can be very helpful when processing user-entered file names. For example:

public class FileTest {
    public static void main(String[] args) {

        if (args.length < 1) {
            System.out.println("usage: FileTest file");
            System.exit(-1);
        }

        // Converts the input string to a Path object.
        Path inputPath = Paths.get(args[0]);

        // Converts the input Path
        // to an absolute path.
        // Generally, this means prepending
        // the current working
        // directory.  If this example
        // were called like this:
        //     java FileTest foo
        // the getRoot and getParent methods
        // would return null
        // on the original "inputPath"
        // instance.  Invoking getRoot and
        // getParent on the "fullPath"
        // instance returns expected values.
        Path fullPath = inputPath.toAbsolutePath();
    }
}

The toAbsolutePath() method converts the user input and returns a Path that returns useful values when queried. The file does not need to exist for this method to work.

The toRealPath() method returns the real path of an existing file. This method performs several operations in one:

  • If true is passed to this method and the file system supports symbolic links, this method resolves any symbolic links in the path.
  • If the path is relative, it returns an absolute path.
  • If the path contains any redundant elements, it returns a path with those elements removed.

This method throws an exception if the file does not exist or cannot be accessed. You can catch the exception when you want to handle any of these cases. For example:

try {
    Path fp = path.toRealPath();
} catch (NoSuchFileException x) {
    System.err.format("%s: no such" + " file or directory%n", path);
    // Logic for case when file doesn't exist.
} catch (IOException x) {
    System.err.format("%s%n", x);
    // Logic for other sort of file error.
}

Joining Two Paths

You can combine paths by using the resolve() method. You pass in a partial path , which is a path that does not include a root element, and that partial path is appended to the original path.

For example, consider the following code snippet:

// Solaris
Path p1 = Paths.get("/home/joe/foo");

// Result is /home/joe/foo/bar
System.out.format("%s%n", p1.resolve("bar"));

or

// Microsoft Windows
Path p1 = Paths.get("C:\\home\\joe\\foo");

// Result is C:\home\joe\foo\bar
System.out.format("%s%n", p1.resolve("bar"));

Passing an absolute path to the resolve() method returns the passed-in path:

// Result is /home/joe
Paths.get("foo").resolve("/home/joe");

Creating a Path Between Two Paths

A common requirement when you are writing file I/O code is the capability to construct a path from one location in the file system to another location. You can meet this using the relativize() method. This method constructs a path originating from the original path and ending at the location specified by the passed-in path. The new path is relative to the original path.

For example, consider two relative paths defined as joe and sally:

Path p1 = Paths.get("joe");
Path p2 = Paths.get("sally");

In the absence of any other information, it is assumed that joe and sally are siblings, meaning nodes that reside at the same level in the tree structure. To navigate from joe to sally, you would expect to first navigate one level up to the parent node and then down to sally:

// Result is ../sally
Path p1_to_p2 = p1.relativize(p2);

// Result is ../joe
Path p2_to_p1 = p2.relativize(p1);

Consider a slightly more complicated example:

Path p1 = Paths.get("home");
Path p3 = Paths.get("home/sally/bar");

// Result is sally/bar
Path p1_to_p3 = p1.relativize(p3);

// Result is ../..
Path p3_to_p1 = p3.relativize(p1);

In this example, the two paths share the same node, home. To navigate from home to bar, you first navigate one level down to sally and then one more level down to bar. Navigating from bar to home requires moving up two levels.

A relative path cannot be constructed if only one of the paths includes a root element. If both paths include a root element, the capability to construct a relative path is system dependent.

The recursive Copy example uses the relativize() and resolve methods.

Comparing Two Paths

The Path interface supports equals(), enabling you to test two paths for equality. The startsWith() and endsWith() methods enable you to test whether a path begins or ends with a particular string. These methods are easy to use. For example:

Path path = ...;
Path otherPath = ...;
Path beginning = Paths.get("/home");
Path ending = Paths.get("foo");

if (path.equals(otherPath)) {
    // equality logic here
} else if (path.startsWith(beginning)) {
    // path begins with "/home"
} else if (path.endsWith(ending)) {
    // path ends with "foo"
}

The Path interface extends the Iterable interface. The iterator() method returns an object that enables you to iterate over the name elements in the path. The first element returned is that closest to the root in the directory tree. The following code snippet iterates over a path, printing each name element:

Path path = ...;
for (Path name: path) {
    System.out.println(name);
}

The Path interface also extends the Comparable interface. You can compare Path objects by using compareTo() which is useful for sorting.

You can also put Path objects into a Collection. See the Collections tutorial for more information about this powerful feature.

When you want to verify that two Path objects locate the same file, you can use the isSameFile() method from the Files class, as described in the section Checking Whether Two Paths Locate the Same File.

Можно прописать абсолютный путь к файлу, скажем вот так:

Image img = new ImageIcon("G:\\img.png").getImage();

Насколько я понимаю, так делать совсем плохо, ибо мы не знаем, куда пользователь сохранит нашу программу.

Можно прописать относительный путь к файлу, скажем вот так:

Image img = new ImageIcon("img.png").getImage();

Но тогда (если только я правильно понял из проделанных экспериментов) чтобы получить полный путь к файлу JVM делает «конкатенацию» текущей директории с прописанным относительным путём. Т.е. если я запускаю программу такой командой:

G:\program\bin>java -jar Program.jar

То JVM будет искать файл по такому расположению:

G:\program\bin\img.png

Насколько я понимаю, так делать совсем плохо, ибо мы не знаем, с какой директории будет запускать пользователь нашу программу.

Можно делать что-то вообще интересное и непростое, типа такого:

Image img = new ImageIcon( this.getClass().getResource("img.png") ).getImage();

Здесь поиск файла будет происходить из пакета, где находится класс this.getClass(). (т.е. та самая «конкатенация» происходит с путём к пакету класса)

Но ведь наверное плохо мешать файлы классов с файлами ресурсов?

Или даже так:

Image img = new ImageIcon( this.getClass().getResource("/img.png") ).getImage();

Здесь поиск файла происходит в директориях classpath. Но по идее, тогда может оказаться несколько подходящих файлов? И что же это будет?!

В общем вопросы:
Правильно ли то, что я написал?
Какие ещё способы существуют?
Когда какой способ использовать?
Какой способ наилучший (если он существует)?

Ответы

Аватар пользователя Иван Полежаев

Чтобы указать путь к файлу в Java, можно использовать класс java.io.File. Существует несколько способов задания пути:

Абсолютный путь:

File file = new File("/path/to/file.txt");
// Здесь /path/to/file.txt - абсолютный путь к файлу.

Относительный путь от текущего каталога:

File file = new File("file.txt");
// Здесь file.txt - файл, расположенный в текущем каталоге.

Относительный путь от корня проекта:

File file = new File("src/main/resources/file.txt");

Курсы по программированию на Хекслете

Backend-разработка

Разработка серверной части сайтов и веб-приложений

Обложка категории Backend-разработка

Frontend-разработка

Разработка внешнего интерфейса сайтов и веб-приложений и верстка

Обложка категории Frontend-разработка

Создание сайтов

Разработка сайтов и веб-приложений на JS, Python, Java, PHP и Ruby on Rails

Обложка категории Создание сайтов

Тестирование

Ручное тестирование и автоматизированное тестирование на JS, Python, Java и PHP

Обложка категории Тестирование

Аналитика данных

Сбор, анализ и интерпретация данных на Python

Обложка категории Аналитика данных

Интенсивные курсы

Интенсивное обучение для продолжающих

Обложка категории Интенсивные курсы

DevOps

Автоматизация настройки локального окружения и серверов, развертывания и деплоя

Обложка категории DevOps

Веб-разработка

Разработка, верстка и деплой сайтов и веб-приложений, трудоустройство для разработчиков

Обложка категории Веб-разработка

Математика для программистов

Обучение разделам математики, которые будут полезны при изучении программирования

Обложка категории Математика для программистов

JavaScript

Разработка сайтов и веб-приложений и автоматизированное тестирование на JS

Обложка категории JavaScript

Python

Веб-разработка, автоматическое тестирование и аналитика данных на Python

Обложка категории Python

Java

Веб-разработка и автоматическое тестирование на Java

Обложка категории Java

PHP

Веб-разработка и автоматическое тестирование на PHP

Обложка категории PHP

Ruby

Разработка сайтов и веб-приложений на Ruby on Rails

Обложка категории Ruby

Go

Курсы по веб-разработке на языке Go

Обложка категории Go

HTML

Современная верстка с помощью HTML и CSS

Обложка категории HTML

SQL

Проектирование базы данных, выполнение SQL-запросов и изучение реляционных СУБД

Обложка категории SQL

Git

Система управления версиями Git, регулярные выражения и основы командой строки

Обложка категории Git

Похожие вопросы

Класс Path

Интерфейс Path является частью обновления Java NIO 2, которое Java NIO получил в Java 6 и Java 7.

Экземпляр Path представляет путь в файловой системе.

Путь может указывать либо на файл, либо на каталог. Путь может быть абсолютным или относительным. Абсолютный путь содержит полный путь от корня файловой системы до файла или каталога, на который она указывает. Относительный путь содержит путь к файлу или каталогу относительно некоторого другого пути.

Не стоит путать путь файловой системы с переменной среды path в некоторых операционных системах. Интерфейс java.nio.file.Path не имеет ничего общего с переменной среды path.

Во многих отношениях интерфейс Path похож на класс java.io.File, но есть некоторые незначительные различия. Однако, во многих случаях вы можете заменить использование класса File на использование интерфейса Path.

Создание экземпляра Path

Чтобы использовать экземпляр Path, необходимо его создать. Мы создаем экземпляр Path, используя статический метод в классе Paths (java.nio.file.Paths) с именем Paths.get().

Вот пример использования данного метода:

import java.nio.file.Path;
import java.nio.file.Paths;

public class PathExample {
  public static void main(String[] args) {
    Path path = Paths.get("c:\\data\\fileName.txt");
  }
}

Обратите внимание на два оператора импорта в верхней части примера. Чтобы использовать интерфейс Path и класс Paths, мы должны сначала импортировать их.

Также уделим внимание вызову метода Paths.get("c:\\data\\fileName.txt"). Это вызов метода Paths.get(), который создает экземпляр Path. Другими словами, метод Paths.get() является фабричным методом для экземпляров Path.

Создание абсолютного пути

Создание абсолютного пути выполняется путем вызова фабричного метода Paths.get() с абсолютным адресом в качестве параметра. Вот пример создания экземпляра Path, представляющего абсолютный путь:

Path path = Paths.get ("c:\\data\\fileName.txt");

Абсолютный путь — c:\data\fileName.txt. Двойные символы «\» необходимы в строках Java, так как «\» является escape-символом, что означает, что следующий символ указывает, какой символ действительно должен находиться в этом месте в строке. Написав «\», вы указываете компилятору записать в строку один символ .

Вышеуказанный путь — это путь к файловой системе Windows. В системе Unix (Linux, MacOS, FreeBSD и т.д.) приведенный выше абсолютный путь может выглядеть следующим образом:

Path path = Paths.get ("/home/namesirname/fileName.txt");

Абсолютный путь теперь — /home/namesirname/fileName.txt.

Если бы мы использовали этот тип пути на компьютере с Windows (путь, начинающийся с «\»), путь будет интерпретирован относительно текущего диска. Например, путь /home/namesirname/fileName.txt может быть интерпретирован как находящийся на диске C. Тогда путь будет соответствовать этому полному пути: C:/home/namesirname/fileName.txt.

Создание относительного пути

Относительный путь — это путь, который указывает адрес от одного пути (базовый путь) до каталога или файла. Полный путь (абсолютный путь) относительного пути получается путем объединения базового пути с относительным путем.

Класс Path также можно использовать для работы с относительными путями. Мы создаем относительный путь, используя метод Paths.get(basePath, relativePath). Вот два примера относительного пути в Java:

Path projects = Paths.get("d:\\data", "projects");

Path file = Paths.get("d:\\data", "projects\\a-project\\fileName.txt");

В первом примере создается экземпляр Path, который указывает путь (каталог) d:\data\projects.

Во втором примере создается экземпляр Path, который указывает путь (файл) d:\data\projects\a-project\fileName.txt.

При работе с относительными путями в строке пути можно использовать два специальных кода. Эти коды:

  • .
  • ..

. Код означает «текущий каталог». Например, если вы создаете относительный путь:

Path currentDir = Paths.get(".");
System.out.println(currentDir.toAbsolutePath());

тогда абсолютный путь, которому соответствует экземпляр Path, будет каталогом, в котором выполняется приложение, выполняющее вышеуказанный код.

Если данный код используется в середине строки пути, это просто означает тот же каталог, на который указывал путь в этой точке. Вот пример Path, показывающий это:

Path currentDir = Paths.get("d:\\data\\projects\.\a-project");

Этот путь будет соответствовать пути: d:\data\projects\a-project.

Код .. означает «родительский каталог» или «подняться на один каталог вверх». Вот пример Path, иллюстрирующий это:

Path parentDir = Paths.get("..");

Экземпляр Path, созданный в этом примере, будет соответствовать родительскому каталогу каталога, из которого было запущено приложение, выполняющее этот код.

Если мы используем код .. в середине строки пути, это будет соответствовать изменению одного каталога в этой точке в строке пути. Например:

String path = "d:\\data\\projects\\a-project\\..\\another-project";
Path parentDir2 = Paths.get(path);

Экземпляр Path, созданный в этом примере, будет соответствовать этому абсолютному пути: d:\data\projects\another-project.

Код .. после каталога a-project меняет каталог проектов родительского каталога, а затем путь указывает вниз на каталог другого проекта.

Коды . и .. также работают в сочетании с двухстрочным методом Paths.get(). Вот два примера Paths.get(), показывающие простые примеры этого:

Path path1 = Paths.get("d:\\data\\projects", ".\\a-project");

Path path2 = Paths.get("d:\\data\\projects\\a-project", "..\\another-project");

  • Java приложение как служба windows
  • Java virtual machine launcher ошибка как исправить на windows 10 unable to access jarfile
  • Java приложение для windows что это
  • Java virtual machine launcher error unable to access jarfile c windows syswow64
  • Java не является приложением win32 windows xp