File
. Onuň işi barada şu ýerden okap bilersiňiz . Emma Java 7-de dili döredijiler faýllar we kataloglar bilen işleýşini üýtgetmek kararyna geldiler. Munuň sebäbi synpyň File
birnäçe kemçilikleri bardy. copy()
Mysal üçin, bir faýly bir ýerden başga ýere göçürmäge mümkinçilik berýän usuly ýokdy (düşnükli ýaly görünýän aýratynlyk). Mundan başga-da, synpda bahalary File
yzyna gaýtarýan köp usul bardy boolean
. Erroralňyşlyk ýüze çyksa, beýle usul kadadan çykma däl-de, ýalňyş gaýtarýar , bu ýalňyşlary anyklamagy we sebäplerini kesgitlemegi kynlaşdyrýar. Bir synpyň ýerine File
3 synp peýda boldy Paths
: Path
we Files
. Dogrusyny aýtsam, Path
bu synp däl-de, interfeýs. Olaryň biri-birinden nähili tapawutlanýandyklaryny we olaryň hersiniň näme üçin zerurdygyny kesgitläliň. Iň aňsat zat bilen başlalyň - Paths
.
.Ollar
Paths
ýeke statiki usuly bolan gaty ýönekeý synpdyr get()
. Diňe geçen setirden ýa-da URI-den görnüş görnüşini almak üçin döredildi Path
. Başga funksiýasy ýok. Ine, onuň işine mysal:
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) {
Path testFilePath = Paths.get("C:\\Users\\Username\\Desktop\\testFile.txt");
}
}
Iň kyn synp däl, şeýlemi? :) Bolýar, bir görnüşli obýekt alanymyzdan soň , onuň nämedigini we näme üçin zerurdygyny Path
anyklalyň :)Path
.Ol
Path
, umuman aýdylanda, täzeden işlenip düzülen analog File
. Bilen işlemek has aňsat File
. Ilki bilen köp peýdaly (statiki) usullar ondan aýryldy we synpa geçirildi Files
. Ikinjiden , Path
usullaryň yzyna gaýtaryş bahalary sargyt edildi. Synpda File
usullar muny yzyna gaýtardy , String
düşünmek aňsat däldi. Mysal üçin, häzirki faýl üçin esasy ýoly setir hökmünde yzyna gaýtarýan usul bardy . Theöne şol bir wagtyň özünde şol bir zady yzyna gaýtaryp berýän, ýöne obýekt görnüşinde bir usul bardy ! Bu gaty zerur. Şonuň üçin interfeýsde faýllar bilen işlemegiň usuly we beýleki usullary diňe bir obýekti yzyna gaýtaryp berýär . Köp sanly wariant ýok - hemme zat aňsat we ýönekeý. Onuň haýsy peýdaly usullary bar ? Ine, olaryň käbiri we işleriniň mysallary: boolean
File
getParent()
getParentFile()
File
Path
getParent()
Path
Path
-
getFileName()
- faýlyň adyny ýoldan gaýtaryp berýär; -
getParent()
- häzirki ýol bilen baglanyşykly “ene-atanyň” katalogyny yzyna gaýtaryp berýär (ýagny katalog agajynda has ýokary bolan katalog); -
getRoot()
- “kök” katalogyny yzyna berýär; ýagny katalog agajynyň ýokarsyndaky; -
startsWith()
,endsWith()
- ýoluň geçen ýol bilen başlaýandygyny / gutarýandygyny barlaň:import java.nio.file.Path; import java.nio.file.Paths; public class Main { public static void main(String[] args) { Path testFilePath = Paths.get("C:\\Users\\Username\\Desktop\\testFile.txt"); Path fileName = testFilePath.getFileName(); System.out.println(fileName); Path parent = testFilePath.getParent(); System.out.println(parent); Path root = testFilePath.getRoot(); System.out.println(root); boolean endWithTxt = testFilePath.endsWith("Desktop\\testFile.txt"); System.out.println(endWithTxt); boolean startsWithLalala = testFilePath.startsWith("lalalala"); System.out.println(startsWithLalala); } }
Konsol çykyşy:
testFile.txt
C: \ Ulanyjylar \ Ulanyjy ady \ Iş stoly
C: \
hakyky
ýalanUsulyň işleýşine üns beriň
endsWith()
. Häzirki ýoluň geçen ýol bilen gutarýandygyny ýa-da ýokdugyny barlaýar . Nyşanlar toplumynda däl - de , ýolda .Bu iki jaňyň netijelerini deňeşdiriň:
import java.nio.file.Path; import java.nio.file.Paths; public class Main { public static void main(String[] args) { Path testFilePath = Paths.get("C:\\Users\\Username\\Desktop\\testFile.txt"); System.out.println(testFilePath.endsWith("estFile.txt")); System.out.println(testFilePath.endsWith("Desktop\\testFile.txt")); } }
Konsol çykyşy:
false
trueDiňe bir simwol toplumy däl-de, usuly doly ýoly geçmeli: ýogsam häzirki ýol hakykatdanam simwollaryň yzygiderliligi bilen gutarsa-da netije hemişe ýalan
endsWith()
bolar (“estFile.txt” ýaly) "Aboveokardaky mysalda).Mundan başga-da, mutlak (doly) we degişlilikde ýollar bilen işlemegi ýönekeýleşdirýän usullar topary bar
Path
.
-
boolean isAbsolute()
- häzirki ýol mutlak bolsa hakykata gaýdyp geler:import java.nio.file.Path; import java.nio.file.Paths; public class Main { public static void main(String[] args) { Path testFilePath = Paths.get("C:\\Users\\Username\\Desktop\\testFile.txt"); System.out.println(testFilePath.isAbsolute()); } }
Konsol çykyşy:
dogry
-
Path normalize()
- Gereksiz elementleri aýyryp, häzirki ýoly "kadalaşdyrýar". Meşhur operasiýa ulgamlarynyň ýollary aňladanda köplenç “.” Nyşanlaryny ulanýandygyny bilip bilersiňiz. (“Häzirki katalog”) we “..” (esasy katalog). Mysal üçin: “ ./Pictures/dog.jpg ” häzirki katalogymyzda Suratlar bukjasynyň we içinde “dog.jpg” faýlynyň bardygyny aňladýar.Ine, şu ýerde. Programmaňyzda “ulanýan” ýol bar bolsa. ýa-da “..”, usul
normalize()
olary aýyrar we öz içine almaýan ýol alar:import java.nio.file.Path; import java.nio.file.Paths; public class Main { public static void main(String[] args) { Path path5 = Paths.get("C:\\Users\\Java\\.\\examples"); System.out.println(path5.normalize()); Path path6 = Paths.get("C:\\Users\\Java\\..\\examples"); System.out.println(path6.normalize()); } }
Konsol çykyşy:
C: \ Ulanyjylar \ Java \ mysallar
C: \ Ulanyjylar \ mysallar -
Path relativize()
- häzirki we geçen ýoluň arasyndaky deňeşdirilen ýoly hasaplaýar.Mysal üçin:
import java.nio.file.Path; import java.nio.file.Paths; public class Main { public static void main(String[] args) { Path testFilePath1 = Paths.get("C:\\Users\\Users\\Users\\Users"); Path testFilePath2 = Paths.get("C:\\Users\\Users\\Users\\Users\\Username\\Desktop\\testFile.txt"); System.out.println(testFilePath1.relativize(testFilePath2)); } }
Konsol çykyşy:
Ulanyjy ady \ Iş stoly \ testFile.txt
Path
gaty uly. Olaryň hemmesini Oracle resminamalarynda tapyp bilersiňiz . Gözden geçirmäge dowam ederis Files
.
Faýllar
Files
- bu synpdan statiki usullaryň göçürilen peýdaly synpy File
. Files
- bu takmynan birmeňzeş Arrays
ýa-da Collections
diňe faýllar bilen işleýär, massiwler we kolleksiýalar bilen däl :) Faýllary we kataloglary dolandyrmaga gönükdirilendir. Statiki usullary ulanyp Files
, faýllary we kataloglary döredip, pozup we göçürip bileris. Bu amallar üçin usullar ulanylýar createFile()
(kataloglar üçin - createDirectory()
) move()
we delete()
. Olary nähili ulanmaly:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
public class Main {
public static void main(String[] args) throws IOException {
//file creation
Path testFile1 = Files.createFile(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt"));
System.out.println("Was the file created successfully?");
System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt")));
// create directory
Path testDirectory = Files.createDirectory(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory"));
System.out.println("Was the directory successfully created?");
System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory")));
//move file from desktop to testDirectory. You need to move with the name of the file in the folder!
testFile1 = Files.move(testFile1, Paths.get("C:\\Users\\Username\\Desktop\\testDirectory\\testFile111.txt"), REPLACE_EXISTING);
System.out.println("Is our file left on the desktop?");
System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt")));
System.out.println("Has our file been moved to testDirectory?");
System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory\\testFile111.txt")));
//remove file
Files.delete(testFile1);
System.out.println("Does the file still exist?");
System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory\\testFile111.txt")));
}
}
Files.createFile()
Bu ýerde ilki bilen iş stolunda bir faýl (usul) döredýäris , soňra ol ýerde bukja (usul Files.createDirectory()
) döredýäris. Ondan soň faýly (usuly Files.move()
) iş stolundan bu täze bukja geçirýäris we ahyrynda faýly (usuly Files.delete()
) pozýarys. Konsol çykyşy: Faýl üstünlikli döredildimi? dogry Katalog üstünlikli döredildimi? dogry Faýlymyz henizem iş stolunda barmy? false Faýlymyz testDirectory-a geçirildi? dogry Faýl barmy? ýalan Üns beriň:Interfeýs usullary ýaly Path
, köp usullar Files
bir obýekti gaýtaryp berýärPath
. Synp usullarynyň köpüsi Files
hem kabul edýär Path
. Bu ýerde bir usul wepaly kömekçiňize öwrüler Paths.get()
- ony işjeň ulanyň. Başga näme gyzykly Files
? Köne synpyň hakykatdanam ýetmezçiligi ! File
Usulydy. copy()
Leksiýanyň başynda ol hakda gürleşdik, indi onuň bilen duşuşmagyň wagty geldi!
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
public class Main {
public static void main(String[] args) throws IOException {
//file creation
Path testFile1 = Files.createFile(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt"));
System.out.println("Was the file created successfully?");
System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt")));
// create directory
Path testDirectory2 = Files.createDirectory(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2"));
System.out.println("Was the directory successfully created?");
System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2")));
//copy the file from the desktop to the directory testDirectory2.
testFile1 = Files.copy(testFile1, Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2\\testFile111.txt"), REPLACE_EXISTING);
System.out.println("Is our file left on the desktop?");
System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt")));
System.out.println("Has our file been copied to testDirectory?");
System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2\\testFile111.txt")));
}
}
Konsol çykyşy: Faýl üstünlikli döredildimi? dogry Katalog üstünlikli döredildimi? dogry Faýlymyz henizem iş stolunda barmy? true Faýlymyz testDirectory-a göçürildimi? true Indi faýllary programma taýdan göçürip bilersiňiz! :) Emma synp size Files
diňe faýllary dolandyrmaga däl, eýsem mazmuny bilen işlemäge hem mümkinçilik berýär. Maglumatlary bir faýla ýazmak üçin onuň bir usuly bar write()
we okamak üçin - 3: çenli, read()
we ikinjisine jikme-jik durup geçeris readAllBytes()
. readAllLines()
Näme üçin? Sebäbi gaty gyzykly gaýdyp geliş görnüşi bar - List<String>
! .Agny, faýldaky setirleriň sanawyny bize gaýtaryp berýär. Elbetde, bu mazmun bilen işlemegi gaty amatly edýär, sebäbi tutuş faýl, setir boýunça, meselem, konsola yzygiderli aýlawda çykyp biler for
:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import static java.nio.charset.StandardCharsets.UTF_8;
public class Main {
public static void main(String[] args) throws IOException {
List<String> lines = Files.readAllLines(Paths.get("C:\\Users\\Username\\Desktop\\pushkin.txt"), UTF_8);
for (String s: lines) {
System.out.println(s);
}
}
}
Konsol çykyşy: Ajaýyp pursady ýadymda: Sen meniň öňümde peýda bolduň, gysga wagtlyk görüş ýaly, Arassa gözelligiň zehini ýaly. Örän rahat! :) Bu aýratynlyk Java 7-de peýda boldy. Java 8-de Java-a funksional programmirlemegiň käbir elementlerini goşýan Stream API peýda boldy. Faýllar bilen işlemek üçin has baý mümkinçilikleri goşmak bilen. Biziň öňümizde bir wezipe bardygyny göz öňüne getiriň: “Nädip” sözünden başlanýan faýlda ähli setirleri tapyň, olary UPPER CASE öwüriň we konsola çykaryň. Files
Java 7-de synp ulanyp, çözgüt nähili bolardy ? Şuňa meňzeş bir zat:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import static java.nio.charset.StandardCharsets.UTF_8;
public class Main {
public static void main(String[] args) throws IOException {
List<String> lines = Files.readAllLines(Paths.get("C:\\Users\\Username\\Desktop\\pushkin.txt"), UTF_8);
List<String> result = new ArrayList<>();
for (String s: lines) {
if (s.startsWith("How")) {
String upper = s.toUpperCase();
result.add(upper);
}
}
for (String s: result) {
System.out.println(s);
}
}
}
Konsol çykyşy: ÇYKYJY GÖRNÜŞ, LEAŞA BEYŞ GÖRNÜŞI. Muny eden ýaly bolarys, ýöne beýle ýönekeý iş üçin kodumyz birneme ... sözli bolup çykdy öýdemok? Java 8 Stream API ulanyp, çözgüt has owadan görünýär:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) throws IOException {
Stream<String> stream = Files.lines(Paths.get("C:\\Users\\Username\\Desktop\\pushkin.txt"));
List<String> result = stream
.filter(line -> line.startsWith("How"))
.map(String::toUpperCase)
.collect(Collectors.toList());
result.forEach(System.out::println);
}
}
Şol bir netijä geldik, ýöne has az kod bilen! Mundan başga-da, “okalýanlygy” ýitirdik diýip bolmaz. Akym API bilen tanyş bolmasaňyzam, bu koduň edýän zatlaryna aňsatlyk bilen teswir berip bilersiňiz diýip pikir edýärin. Shortöne gysgaça aýdanyňda, akym dürli funksiýalary ýerine ýetirip boljak elementleriň yzygiderliligidir. Akym obýektini usuldan alýarys Files.lines()
we oňa 3 funksiýa ulanýarys:
-
Usuly ulanyp,
filter()
“Nädip” bilen başlaýan faýldan diňe şol setirleri saýlaýarys. -
Usuly ulanyp, saýlanan hatarlaryň hemmesinden geçýäris
map()
we olaryň hersini UPPER CASE çenli azaldýarys. -
Netijeli setirleriň hemmesini birleşdirýäris
List
.collect()
Files.walkFileTree()
. Ine, etmeli zatlarymyz. Ilki bilen bize zerur FileVisitor
. FileVisitor
faýl agajyndan geçmegiň ähli usullaryny beýan edýän ýörite interfeýsdir. Hususan-da, faýlyň mazmunyny okamak we zerur tekstiň bardygyny ýa-da ýokdugyny barlamak üçin logika goýarys. Bu biziňki bolar FileVisitor
:
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.List;
public class MyFileVisitor extends SimpleFileVisitor<Path> {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
List<String> lines = Files.readAllLines(file);
for (String s: lines) {
if (s.contains("This is the file we need")) {
System.out.println("Required file found!");
System.out.println(file.toAbsolutePath());
break;
}
}
return FileVisitResult.CONTINUE;
}
}
Bu ýagdaýda synpymyz miras alýar SimpleFileVisitor
. Bu, ýerine ýetirýän synp FileVisitor
, onda diňe bir usuly ýok etmeli : visitFile()
. Bu ýerde her katalogdaky her faýl bilen näme edilmelidigini düşündirýäris. Has çylşyrymly gezelenç logikasy gerek bolsa, öz durmuşa geçirişiňizi ýazmaly FileVisitor
. Şol ýerde ýene 3 usuly durmuşa geçirmeli bolarsyňyz:
-
preVisitDirectory()
- bukja girmezden ozal ýerine ýetirilmeli logika; -
visitFileFailed()
- faýla girmek mümkin däl bolsa näme etmeli (giriş ýa-da başga sebäpler ýok); -
postVisitDirectory()
- bukja girenden soň ýerine ýetirilmeli logika.
SimpleFileVisitor
. Usulyň içindäki logika visitFile()
gaty ýönekeý: faýldan ähli setirleri okaň, zerur mazmunyň bardygyny ýa-da ýokdugyny barlaň, eger şeýle bolsa, konsola barýan ýoly çap ediň. Size kynçylyk döredip biljek ýeke-täk setir şu:
return FileVisitResult.CONTINUE;
Aslynda hemme zat ýönekeý. Bu ýerde, faýl girizilenden we ähli zerur amallar gutarandan soň programmanyň näme etmelidigini düşündirýäris. Biziň ýagdaýymyzda, agajyň üstünden geçmegi dowam etdirmeli, şonuň üçin bu ýoly saýlaýarys CONTINUE
. Weöne, mysal üçin, başga bir wezipämiz bolup biler: "Bu bize gerek faýl" -y öz içine alýan faýllaryň hemmesini däl-de, diňe bir faýly tapmak . Ondan soň programma ýatyrylmaly. Bu ýagdaýda kodumyz edil birmeňzeş görüner, ýöne arakesmäniň ýerine; eder:
return FileVisitResult.TERMINATE;
Bolýar, kodumyzy işledeliň we işleýändigini göreliň.
import java.io.IOException;
import java.nio.file.*;
public class Main {
public static void main(String[] args) throws IOException {
Files.walkFileTree(Paths.get("C:\\Users\\Username\\Desktop\\testFolder"), new MyFileVisitor());
}
}
Konsol çykyşy: Gerekli faýl tapyldy! C: \ Ulanyjylar \ Ulanyjy ady \ Iş stoly \ testFolder \ FileWeNeed1.txt Gerekli faýl tapyldy! C: \ Ulanyjylar \ Ulanyjy ady \ Iş stoly \ testFolder \ level1-a \ level2-aa \ FileWeNeed2.txt Gerekli faýl tapyldy! C: \ Ulanyjylar \ Ulanyjy ady \ Iş stoly \ testFolder \ level1-b \ level2-bb \ FileWeNeed3.txt Ajaýyp, muny etdik! :) Bu barada has giňişleýin bilmek isleseňiz , bu makalanywalkFileTree()
size maslahat berýärin . Şeýle hem kiçi bir işi ýerine ýetirip bilersiňiz - ony adaty ýerine çalşyp bilersiňiz , ähli 4 usuly durmuşa geçiriň we bu maksatnama üçin bir maksat edinip bilersiňiz. Mysal üçin, ähli hereketleriňizi hasaba aljak bir programma ýazyp bilersiňiz: faýlyň ýa-da bukjanyň adyny girmezden ozal / soň konsolda görkeziň. Bularyň hemmesi - soňrak görüşeris! :) SimpleFileVisitor
FileVisitor
GO TO FULL VERSION