1. Pathклас

Ако искате да напишете програма, която прави нещо с файлове на диска, това е доста лесно. Java има много класове, които ви помагат да работите Howто със самите файлове, така и с тяхното съдържание.

Ранните версии на Java използваха класове като Fileи FileInputStreamза работа с файлове. Класът обаче Fileвече е остарял и не се препоръчва за използване. Разбира се, все още може да го срещнете в code, параметри на метод or конструктори на класове.

Още от самото начало ще започнем да се учим How да работим с файлове с помощта на Pathкласа. Pathе класът, който замени File. Той е по-безопасен и по-ефикасен.

Pathклас

Технически, Pathне е клас - това е интерфейс. Това се прави, за да се позволи записването на наследник на Pathкласа за всяка операционна система (и файлова система).

Windows има един стандарт за писане на пътеки към файлове, а Linux има друг. Разбира се, в света има много други операционни системи и всяка има свой собствен стандарт.

Ето защо Pathинтерфейсът се използва навсякъде в методите, които работят с файлове, въпреки че в действителност работата се случва чрез неговите наследствени класове: WindowsPath, UnixPath, ...

Създаване на Pathобект

За да създадете Pathобект (който всъщност ще бъде обект на WindowsPathкласа наследник), трябва да използвате израз като този:

Path name = Path.of(path);

Къде nameе името на Pathпроменлива и pathе пътят до file (or директорията), включително името на file (or директорията). И ofе статичен метод на Pathкласа.

Методът of()се използва за създаване на WindowsPathобекти, ако програмата работи под Windows. Ако програмата работи на Linux, тогава UnixPathсе създават обекти. Не можете да създадете Pathобект с помощта на code като .new Path()

Примери:

Код Забележка
Path file = Path.of("c:\\projects\\note.txt");
Път до file
Path directory = Path.of("c:\\projects\\");
Път до директорията

Не е необходимо файлът (or директорията) да съществува, за Pathда съществува валиден обект. Може би просто искате да създадете файл... PathОбектът е като разширен String: той не е свързан с конкретен файл на диска — той просто съхранява определен път на диска. Това е.


2. Методи от Pathвида

Интерфейсът Pathима доста интересни методи. Най-интересните са представени в tableта по-долу.

Метод Описание
Path getParent()
Връща родителската директория
Path getFileName()
Връща името на file без директорията
Path getRoot()
Връща основната директория от път
boolean isAbsolute()
Проверява дали текущият път е абсолютен
Path toAbsolutePath()
Преобразува пътя в абсолютен
Path normalize()
Премахва заместващи знаци в име на директория.
Path resolve(Path other)
Конструира нов абсолютен път от абсолютни и относителни пътища.
Path relativize(Path other)
Получава относителен път от два абсолютни пътя.
boolean startsWith(Path other)
Проверява дали текущият път започва с даден път
boolean endsWith(Path other)
Проверява дали текущият път завършва с даден път
int getNameCount()
Разделя пътя на части, използвайки /като разделител.
Връща броя на частите.
Path getName(int index)
Разделя пътя на части, използвайки /като разделител.
Връща част по нейния индекс.
Path subpath(int beginIndex, int endIndex)
Разделя пътя на части, използвайки /като разделител.
Връща подпътеката, която съответства на дадения интервал.
File toFile()
Преобразува Pathобект в отхвърлен Fileобект
URI toUri()
Преобразува Pathобект в URIобект

По-долу е дадено кратко описание на съществуващите методи.


3. Разделяне на път на части

Методът getParent()връща пътя, който сочи към родителската директория за текущия път. Независимо дали този път е директория or файл:

Код Стойност
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).getParent();
"c:\\windows\\projects\\"
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getParent();
"c:\\windows\\"
String str = "c:\\";
Path path = Path.of(str).getParent();
null

Методът getFileName()връща едно име на файл (or директория) - Howвото и да идва след последния разделител:

Код Стойност
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).getFileName();
"note.txt"
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getFileName();
"projects"
String str = "c:\\";
Path path = Path.of(str).getFileName();
null

Методът getRoot()връща пътя до основната директория:

Код Стойност
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getRoot();
"c:\\"


4. Абсолютни и относителни пътища

Има два вида пътища: абсолютни и относителни. Абсолютният път започва от основната директория. За Windows това може да е c:\папката; за Linux — /директорията

Относителният път е значим спрямо няHowва директория. Тоест, това е като края на пътя, но без начало. Можете да превърнете относителен път в абсолютен и обратно

boolean isAbsolute()метод

Методът проверява дали текущият път е абсолютен

Код Стойност
String str = "c:\\windows\\projects\\note.txt";
boolean abs = Path.of(str).isAbsolute();
true
String str = "src\\com\\codegym\\Main.java";
boolean abs = Path.of(str).isAbsolute();
false

Path toAbsolutePath()метод

Преобразува пътя в абсолютен. Ако е необходимо, добавя текущата работна директория към нея:

Код Стойност
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).toAbsolutePath();
"c:\\windows\\projects\\note.txt"
String str = "src\\com\\codegym\\Main.java";
Path path = Path.of(str).toAbsolutePath();
"d:\\work\\src\\com\\codegym\\Main.java"

Path normalize()метод

В пътя, instead of име на директория, можете да напишете "..", което означава връщане една директория назад . Нормализирането премахва тези неща. Примери:

Код Стойност
String str = "c:\\windows\\..\\projects\\note.txt";
Path path = Path.of(str).normalize();
"c:\\projects\\note.txt"
String str = "src\\com\\codegym\\..\\Main.java";
Path path = Path.of(str).normalize();
"src\\com\\Main.java"

Path relativize(Path other)метод

Методът relativize()ви позволява да конструирате "разликите между пътищата": един път спрямо друг

Код Стойност
Path path1 = Path.of("c:\\windows\\projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path2.relativize(path1);
"projects\\note.txt"
Path path1 = Path.of("c:\\windows\\projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path1.relativize(path2);
"..\\.."
Path path1 = Path.of("c:\\aaa\\bbb\\1.txt");
Path path2 = Path.of("d:\\zzz\\y.jpg");
Path result = path1.relativize(path2);
IllegalArgumentException:
двата пътя имат различен "корен" (различни дискове)

Path resolve(Path other)метод

Методът resolve()прави обратното на relativize(): той изгражда нов абсолютен път от абсолютен и относителен път.

Код Стойност
Path path1 = Path.of("projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path1.resolve(path2);
"c:\\windows"
Path path1 = Path.of("projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path2.resolve(path1);
"c:\\windows\\projects\\note.txt"

toFile()метод

Методът връща остарял Fileобект, който съхранява същия файлов път като Pathобекта.

toURI()метод

Методът преобразува пътя в standardн URI и връща обект, който съдържа пътя към file:

Път до file URI към file
c:\windows\projects\note.txt
file:///c:/windows/projects/note.txt