במחלקת קבצים של ג'אווה נוסף בג'אווה 1.7 והיא חלק מחבילת java.nio.file
.
- מחלקת קבצים של ג'אווה מכילה שיטות סטטיות הפועלות על קבצים ותיקיות.
- מחלקה זו משמשת לפעולות בסיסיות על קבצים כמו יצירה, קריאה, כתיבה, העתקה ומחיקה של קבצים או תיקיות במערכת הקבצים.
לפני שנמשיך, בואו נביט ראשונה במונחים הבאים:
Path
: זוהי הממשק שמחליף את מחלקתjava.io.File
כייצוג של קובץ או תיקייה כאשר אנו עובדים ב-Java NIO.- Paths: מחלקה זו מכילה שיטה סטטית ליצירת מופע של
Path
.
java.nio.file.Path
ממשק הוא דומה למחלקת ה־java.io.File
הישנה. Path
מייצגת את מיקום הקובץ, וכאשר אנו יוצרים נתיב לקובץ חדש, הוא לא נוצר בפועל עד שניצור אותו באמצעות Files.createFile(Path filePath)
. כפי שניתן לראות בתרשים לעיל, נעשה שימוש במחלקת Paths כדי ליצור אינסטנס של Path, ומחלקת Files משתמשת באינסטנס של Path כדי לפעול על קובץ. קובץ ו־
Path
מכירים כיצד להמיר אחד לשני, זו הדרך שבה אנו יכולים להשתמש בקוד ישן כדי להתקשר עם יישום Files.
Java IO vs NIO
איך ליצור נתיב
ניתן ליצור אובייקט של Path
על ידי קריאה לשיטת Paths.get(String first, String... more)
של מחלקת Paths
.
Path path1 = Paths.get("/tmp/file.txt"); // For UNIX
Path path2 = Paths.get("D:/data/file.txt"); // For Windows
ניתן גם ליצור אובייקט של Path
על ידי הפרדת חלקי הנתיב בשיטה Paths.get()
.
Path path1 = Paths.get("/tmp", "file.txt");
Path path2 = Paths.get("D:", "data", "file.txt");
Path path3 = Paths.get("D:/data", "file.txt") ;
כפי שניתן לראות, ניתן להעביר שם תיקייה ושם קובץ בנפרד בשיטה Paths.get()
.
שיטות קבצי Java
המחלקה Java NIO Files מכילה שיטות סטטיות המשמשות לעיבוד קבצים וספריות, ורובן עובדות על אובייקט מסוג Path
. בואו נסתכל על השיטות הבאות של מחלקת Files:
- copy(InputStream in, Path target, CopyOption… options): שיטה זו מעתיקה את כל הבתים מקלט הקלט הצוין לקובץ היעד הצוי, והיא מחזירה את מספר הבתים שנקראו או נכתבו כערך long.
- copy(Path source, OutputStream out): שיטה זו מעתיקה את כל הבתים מהקובץ מקור הצוי לקלט הצוי והיא מחזירה את מספר הבתים שנקראו או נכתבו כערך long.
- copy(Path source, Path target, CopyOption… options): שיטה זו מעתיקה את הקובץ מקור הצוי לקובץ היעד הצוי והיא מחזירה את נתיב הקובץ היעד.
- createDirectories(Path dir, FileAttribute<?>… attrs): שיטה זו יוצרת ספריות באמצעות הנתיב שניתן, וכוללת יצירת כל הספריות האב שאינן קיימות כבר. שיטה זו אינה זורקת חריגה אם הספרייה אינה יכולה להיות נוצרת מכיוון שהיא כבר קיימת. FileAttribute הוא פרמטר אופציונלי הנקבע באופן אוטומטי במהלך יצירת הספריות האינן קיימות, והשיטה מחזירה את נתיב הספרייה שנוצרה.
- createDirectory(Path dir, FileAttribute<?>… attrs): שיטה זו יוצרת ספרייה באמצעות הנתיב שסופק, אם היא יוצרת את הספרייה בהצלחה, היא תחזיר את הנתיב של הספרייה שנוצרה. אם הספרייה כבר קיימת, היא תזרוק nio.file.FileAlreadyExistsException.
- createFile(Path path, FileAttribute<?>… attrs): שיטה זו יוצרת קובץ ריק חדש באמצעות הנתיב שסופק ומחזירה את הנתיב של הקובץ החדש שנוצר אם היא יוצרת אותו בהצלחה. אם הקובץ כבר קיים, היא תזרוק nio.file.FileAlreadyExistsException.
- createTempDirectory(Path dir, String prefix, FileAttribute<?>… attrs): שיטה זו יוצרת ספרייה זמנית באמצעות הנתיב שסופק ותיצור את שם הספרייה באמצעות הקידומת שסופקה. היא תחזיר את הנתיב של הספרייה הזמנית שנוצרה.
- createTempDirectory(String prefix, FileAttribute<?>… attrs): שיטה זו יוצרת ספרייה זמנית בספריית הקבצים הזמנית המוגדרת כברירת מחדל ויוצרת את שם הספרייה באמצעות הקידומת שסופקה. היא תחזיר את הנתיב של הספרייה הזמנית שנוצרה הקשורה למערכת הקבצים המוגדרת כברירת מחדל.
- createTempFile(Path dir, String prefix, String suffix, FileAttribute<?>… attrs): שיטה זו יוצרת קובץ זמני בספרייה מסוימת ויוצרת את שם הקובץ באמצעות הקידומת והסיומת שסופקו ומחזירה את הנתיב של הקובץ החדש שנוצר.
- createTempFile(String prefix, String suffix, FileAttribute<?>… attrs): השיטה יוצרת קובץ זמני בספריית הקבצים הזמנית התקנית ויוצרת את שם הקובץ באמצעות הקידומת והסיומת שסופקו, ומחזירה את נתיב הקובץ שנוצר חדש.
- delete(Path path): זו שיטה שאינה מחזירה ערך ופשוט מוחקת את הקובץ מהנתיב המסוים. שיטה זו זורקת NoSuchFileException אם הקובץ לא קיים בנתיב הספציפי ואם הקובץ הוא ספרייה שאינה ריקה ואינה יכולה להימחק, במקרה זה היא זורקת
- deleteIfExists(Path path): שיטה זו בודקת האם הקובץ קיים לפני שהיא מוחקת אותו ומחזירה ערך בוליאני true אם הקובץ בנתיב הנתון נמחק בהצלחה ומחזירה ערך false אם הקובץ לא קיים בנתיב הנתון. אם הקובץ הוא ספרייה שאינה ריקה ואינה יכולה להימחק, במקרה זה היא זורקת
- exists(Path path): שיטה זו בודקת האם הקובץ קיים בנתיב המסוים ואם הקובץ קיים היא תחזיר ערך true, אחרת היא תחזיר ערך false.
- getLastModifiedTime(Path path, Linkoption… options): שיטה זו מחזירה את הזמן האחרון שבו שונה הקובץ מהנתיב שסופק כ
- getOwner(Path path, Linkoption… options): שיטה זו מחזירה UserPrincipal המייצג את בעל הקובץ בנתיב שסופק.
- isDirectory(Path path, Linkoption… options): השיטה הזו בודקת האם הקובץ הוא ספרייה מהנתיב הנתון. היא מחזירה ערך true אם הקובץ הוא ספרייה ו false אם הקובץ לא קיים או שהוא אינו ספרייה או שלא ניתן לקבוע האם הקובץ הוא ספרייה או לא.
- isExecutable(Path path): השיטה הזו בודקת האם הקובץ בנתיב הנתון ניתן לביצוע או לא והיא גם בודקת אם הקובץ קיים ואם ל-JVM יש הרשאות מתאימות לביצוע הקובץ. היא מחזירה ערך true אם הקובץ קיים בנתיב הנתון וניתן לביצוע ו false אם הקובץ לא קיים או של-JVM אין מספיק הרשאות לביצוע הקובץ או שלא ניתן לקבוע האם הקובץ ניתן לביצוע או לא.
- isHidden(Path path): השיטה הזו מציינת האם הקובץ בנתיב הנתון נחשב כמוסתר או לא. הגדרת המוסתר נכונה לפי הפלטפורמה או הספק. במערכת UNIX, קובץ נחשב מוסתר אם שם הקובץ מתחיל בתו נקודה ('.'). ובמערכת WINDOWS, קובץ נחשב מוסתר אם הוא אינו ספרייה והתכונה הנסתרת של DOS מוגדרת. היא מחזירה ערך true אם הקובץ בנתיב הנתון נחשב מוסתר או false אחרת.
- isReadable(Path path): השיטה הזו בודקת האם הקובץ בנתיב הנתון ניתן לקריאה או לא. היא מחזירה ערך true אם הקובץ בנתיב הנתון קיים וניתן לקריאה ו false אם הקובץ לא קיים או שגישת קריאה נדחתה מאחר של-JVM אין מספיק הרשאות או שלא ניתן לקבוע האם הקובץ ניתן לקריאה או לא.
- isWritable(Path path): שיטה זו בודקת האם הקובץ בנתיב הנתון ניתן לכתיבה או לא. היא מחזירה `true` אם הקובץ בנתיב המסוים קיים וניתן לכתיבה, ו`false` אם הקובץ לא קיים או שהגישה לכתיבה נדחתה מאחר וJVM לא מספקת הרשאות מספיקות או שאין אפשרות לקבוע האם ניתן לכתיבה.
- move(Path source, Path target, CopyOption… options): שיטה זו מעבירה או משנה את שם הקובץ ממקור ליעד ומחזירה את נתיב הקובץ היעד. הפרמטר האפשרי עשוי לכלול: REPLACE_EXISTING: זה אומר שאם הקובץ היעד קיים אז יש להחליף אותו אם הוא לא ספריית ריקה. ATOMIC_MOVE: זה אומר שההעברה מבוצעת כפעולת מערכת קובץ אטומית וכל האפשרויות האחרות מתעלמות. השיטה זו זורקת FileAleadyExistsException אם הקובץ היעד קיים אך אי אפשר להחליף אותו מאחר ואפשרות ה־REPLACE_EXISTING לא צוינה. השיטה זו זורקת DirectoryNotEmptyException אם האפשרות REPlACE_EXISTING צוינה אך הקובץ לא יכול להיחלף מאחר והוא ספריית ריקה.
- newBufferedReader(Path path, Charset cs): שיטה זו פותחת קובץ באמצעות הנתיב הנתון לקריאה על ידי החזרת BufferedReader שמשמש לקריאת טקסט מהקובץ. הבתים מהקובץ מופעלים לתווים באמצעות הקידוד הספציפי שצוין.
- newBufferedWriter(Path path, Charset cs, Openoption… options):שיטה זו פותחת או יוצרת קובץ באמצעות הנתיב הנתון לכתיבה על ידי החזרת BufferedWriter שמשמש לכתיבת טקסט לקובץ. הפרמטר options מציין איך הקובץ נוצר או נפתח. אם לא צוין אף אפשרות, אז מתקבלים באופן ברירת המחדל CREATE, TRUNCATE_EXISTING ו־ WRITE, כלומר היא פותחת את הקובץ לכתיבה ויוצרת אותו אם הוא אינו קיים, או מקטין את גודלו ל־0 אם הוא קיים. שיטה זו מזריקה UnsupportedOperationException אם צו לא נתמך מצויין.
- newByteChannel(Path path, OpenOption… options): שיטה זו יוצרת או פותחת את הקובץ באמצעות הנתיב המצויין על ידי החזרת ערוץ בתים ניתן לחיפוש כדי לגשת לקובץ. שיטה זו מזריקה UnsupportedOperationException אם צו לא נתמך מצויין.
- newDirectoryStream(Path path): שיטה זו פותחת ספרייה על ידי החזרת DirectoryStream לעבור על כל הערכים בספרייה מהנתיב המצויין. האיברים שמחזיר האיטרטור של DirectoryStream הם מסוג Path וכל אחד מייצג רשומה בספרייה. שיטה זו מזריקה NotDirectoryException אם לא ניתן היה לפתוח את הקובץ בנתיב שניתן משום שהוא אינו ספרייה.
- newDirectoryStream(Path path, Filter<? super Path > filter): שיטה זו פותחת ספרייה ומחזירה את ה־DirectoryStream לסיבוב על כל הרשומות בספרייה מהנתיב המסוים. האיברים שמוחזרים על ידי איטרטור ה־DirectoryStream הם מסוג Path וכל אחד מייצג רשומה בספרייה. רשומות אלו מסוננות על ידי המסנן המוגדר. השיטה זו זורקת NotDirectoryException אם לא ניתן לפתוח את הקובץ בנתיב הנתון מכיוון שהוא לא ספרייה.
- newDirectoryStream(Path path, String glob): שיטה זו פותחת ספרייה ומחזירה את ה־DirectoryStream לסיבוב על כל הרשומות בספרייה מהנתיב המסוים. האיברים שמוחזרים על ידי איטרטור ה־DirectoryStream הם מסוג Path וכל אחד מייצג רשומה בספרייה. רשומות אלו מסוננות על ידי התאמה לתבנית המסדרת (globbing) של שמות הקבצים שלהן. השיטה זו זורקת NotDirectoryException אם לא ניתן לפתוח את הקובץ בנתיב הנתון מכיוון שהוא לא ספרייה, ו־PatternSyntaxException אם התבנית אינה תקינה.
- newInputStream(Path path, Openoption… options): שיטה זו פותחת קובץ ומחזירה קלט מזרם לקריאת הקובץ מהנתיב המסוים. הפרמטר options קובע כיצד יש לפתוח את הקובץ, ואם לא צוינו אפשרויות, היא פותחת את הקובץ עם READ. השיטה זו זורקת IllegalArgumentException אם יש קובינציה לא חוקית של אפשרויות ו־UnsupportedOperationException אם אופציה לא נתמכת נבחרה.
- newOutputStream(Path path, Openoption… options): שיטה זו פותחת קובץ על ידי החזרת נתב הפלט לכתיבת בתיים לקובץ בנתיב המצויין. הפרמטר options מקבע איך הקובץ ייפתח ואם לא צוין אף אופציה, אזי השיטה מתייחסת לאופציות CREATE, TRUNCATE_EXISTING ו־WRITE כברירת מחדל, כלומר היא פותחת את הקובץ לכתיבה ויוצרת אותו אם הוא לא קיים, או מקטינה את גודלו ל־0 אם הוא קיים. שיטה זו זורקת IllegalArgumentException אם צווי קובינציה לא חוקית של אופציות, ו־UnsupportedOperationException אם נציין אפשרות לא נתמכת.
- notExists(Path path, LinkOption options): שיטה זו בודקת האם הקובץ בנתיב המצויין אינו קיים. הפרמטר options משמש לציון איך קישורי סמליים יתקבלו אם הקובץ הוא קישור סמלי. כברירת מחדל, קישורי סמליים מתווספים. אם האופציה NOFOLLOW_LINK קיימת, אזי קישורי סמליים אינם מתווספים. שיטה זו מחזירה אמת אם הקובץ לא קיים בנתיב המצויין ושקר אם הקובץ קיים או אם אין אפשרות לקבוע את קיומו.
- readAllBytes(Path path): שיטה זו קוראת את כל הבתים מהקובץ בנתיב הנתון ומחזירה את מערך הבתים המכיל את הבתים שנקראו מהקובץ.
- readAllLines(Path path, Charset cs): שיטה זו קוראת את כל השורות מהקובץ בנתיב הנתון ומחזירה את ה־List שמכיל את השורות מהקובץ.
- גודל(Path path): שיטה זו מחזירה את גודל הקובץ בנתיב המסוים בבתים.
- walkFileTree(Path start, FileVisitor<? Super Path> visitor): שיטה זו משמשת לעבור על ספריית הקבצים. היא עוברת על ספריית הקבצים בנתיב מסוים באופן רקורסיבי ומחזירה את הקובץ התחילי.
- write(Path path, byte[] bytes, OpenOption… options): שיטה זו כותבת בתים לקובץ בנתיב מסוים. הפרמטר options מציין כיצד הקובץ ייווצר או ייפתח. אם לא צוין אף אפשרות, אז היא מתייחסת לאפשרויות CREATE, TRUNCATE_EXISTING ו- WRITE כברירת מחדל, כלומר היא פותחת את הקובץ לכתיבה ויוצרת אותו אם הקובץ אינו קיים או מקצצת את הקובץ הקיים לגודל של 0 אם הוא קיים. כל הבתים במערך הבתים נכתבים לקובץ. שיטה זו מבטיחה סגירת הקובץ כאשר כל הבתים כתבו ומחזירה את נתיב הקובץ שנכתב.
יצירת קובץ באמצעות מחלקת Files
המחלקה Files מספקת את השיטה createFile(Path filePath, FileAttribute<?>… attrs)
כדי ליצור קובץ באמצעות נתיב Path
מסוים. בואו נסתכל על דוגמת התוכנית הבאה.
package com.journaldev.examples;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
/**
* Java Create file using Files class
*
* @author pankaj
*
*/
public class FilesCreateFileExample {
public static void main(String[] args) {
//אתחול אובייקט Path
Path path = Paths.get("D:/data/file.txt");
//יצירת קובץ
try {
Path createdFilePath = Files.createFile(path);
System.out.println("File Created at Path : "+createdFilePath);
} catch (IOException e) {
e.printStackTrace();
}
}
}
פלט התוכנית למעלה הוא:
File Created at Path : D:\data\file.txt
יצירת תיקיות באמצעות מחלקת קבצים
מחלקת קבצים מספקת את השיטות createDirectory(Path dir, FileAttribute<?>… attrs)
ו־createDirectories(Path dir, FileAttribute<?>… attrs)
ליצירת תיקיות בודדות ורמות מרובות באמצעות נתיב Path
מסוים. בואו נצפה בדוגמה בתוכנית הבאה.
package com.journaldev.examples;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
/**
* Java Create directories using Files class
*
* @author pankaj
*
*/
public class FilesCreateDirectoriesExample {
public static void main(String[] args) {
// אתחול אובייקטים של Path
Path path1 = Paths.get("D:/pankaj");
Path path2 = Paths.get("D:/pankaj/java7");
Path path3 = Paths.get("D:/pankaj/java7/Files");
try {
Path createdDir1 = Files.createDirectory(path1);//first level directory
Path createdDir2 = Files.createDirectory(path2);//second level directory
Path createdDir3 = Files.createDirectory(path3);//all level directories
System.out.println("First Level Directory Created at Path : "+createdDir1);
System.out.println("Second Level Directory Created at Path : "+createdDir2);
System.out.println("All Level Directories Created at Path : "+createdDir3);
} catch (Exception e) {
e.printStackTrace();
}
}
}
הפלט של התוכנית לעיל הוא:
First Level Directory Created at Path : D:\pankaj
Second Level Directory Created at Path : D:\pankaj\java7
All Level Directories Created at Path : D:\pankaj\java7\Files
המרת קובץ לנתיב וההיפך
אובייקטים של קובץ ונתיב יכולים להימר לזה אחר על ידי שימוש בשיטות הבאות:
File file = new File(“D:/data/file.txt”);
Path path = file.toPath();
File file1 = path.toFile();
קריאת נתוני קובץ באמצעות מחלקת קבצים
מחלקת קבצים מספקת את השיטות הבאות לקריאת קובץ.
readAllBytes(Path path)
: שיטה זו קוראת את כל הבתים מהקובץ בנתיב הנתון ומחזירה מערך הבתים המכיל את הבתים שנקראו מהקובץ.readAllLines(Path path,Charsetcs)
: פעולה זו קוראת את כל השורות מהקובץ בנתיב שצוין ומחזירה את ה-List המכיל את השורות מהקובץ.
בואו נסתכל על דוגמת התוכנית למטה.
package com.journaldev.examples;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
/**
* Java Files read file example
*
* @author pankaj
*
*/
public class FilesReadFileExample {
public static void main(String[] args) {
Path path = Paths.get("D:/data/file.txt");
try {
byte[] bs = Files.readAllBytes(path);
List<String> strings = Files.readAllLines(path);
System.out.println("Read bytes: \n"+new String(bs));
System.out.println("Read lines: \n"+strings);
} catch (Exception e) {
e.printStackTrace();
}
}
}
הפלט של התוכנית לעיל הוא:
Read bytes:
Hello world
This is Read file example
Thank you
Read lines:
[Hello world, This is Read file example, Thank you]
העתקת קובץ באמצעות מחלקת Files
מחלקת Files מספקת את השיטה copy(Path source, Path target, CopyOption… options)
שמעתיקה את הקובץ המקורי שניתן לפי קובץ היעד שצוין ומחזירה את נתיב קובץ היעד. בואו נסתכל על דוגמת התוכנית למטה:
package com.journaldev.examples;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
/**
* Java Files copy file example
*
* @author pankaj
*
*/
public class FilesCopyFileExample {
public static void main(String[] args) {
Path sourcePath = Paths.get("D:/data/sourceFile.txt");
Path targetPath = Paths.get("D:/data/targetFile.txt");
try {
Path path = Files.copy(sourcePath, targetPath,StandardCopyOption.REPLACE_EXISTING);//copy with REPLACE_EXISTING option
System.out.println("Target file Path : "+path);
System.out.println("Copied Content : \n"+new String(Files.readAllBytes(path)));
} catch (Exception e) {
e.printStackTrace();
}
}
}
הפלט של התוכנית לעיל הוא:
Target file Path : D:\data\targetFile.txt
Copied Content :
Hello world
This is Copy file example
Thank you
העברת קובץ באמצעות מחלקת Files
שפת Java מספקת לנו את מחלקת Files שמציעה את השיטה move(Path source, Path target, CopyOption... options)
. השיטה זו מזיזה או משנה שם של קובץ מקור לקובץ יעד ומחזירה את נתיב הקובץ היעד. הפרמטר options יכול לכלול את האפשרויות הבאות: REPLACE_EXISTING: זה אומר שאם קובץ היעד כבר קיים, הוא יוחלף, אם הוא אינו ספרייה לא ריקה. ATOMIC_MOVE: זה אומר שההעברה בוצעת כפעולת מערכת קבצים אטומית וכל האפשרויות האחרות מתעלמות. השיטה זו זורקת חריגת FileAleadyExistsException
אם קובץ היעד כבר קיים אך לא ניתן להחליף אותו משום שאפשרות REPLACE_EXISTING אינה מופיעה. השיטה זו זורקת חריגת DirectoryNotEmptyException
אם האפשרות REPlACE_EXISTING מופיעה אך הקובץ אינו ניתן להחלפה משום שהוא ספרייה לא ריקה. בואו נציץ על דוגמא בתוכנית שלמטה:
package com.journaldev.examples;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
/**
* Java Files move file example
*
* @author pankaj
*
*/
public class FilesMoveFileExample {
public static void main(String[] args) {
Path sourcePath = Paths.get("D:/data/sourceFile.txt");
Path targetPath = Paths.get("D:/data/targetFile.txt");
try {
Path path = Files.move(sourcePath, targetPath,StandardCopyOption.REPLACE_EXISTING);//move with REPLACE_EXISTING option
System.out.println("Target file Path : "+path);
System.out.println("Moved Content : \n"+new String(Files.readAllBytes(path)));
} catch (Exception e) {
e.printStackTrace();
}
}
}
כתיבת קובץ באמצעות מחלקת Files
מחלקת קבצים של Java NIO מספקת את השיטה write(Path path, byte[] bytes, OpenOption… options)
המכתיבה מספר בתים לקובץ בנתיב מסוים. הפרמטר options מציין איך הקובץ נוצר או נפתח. אם לא צוין אף אפשרות, אז השיטה משתמשת כברירת מחדל ב־CREATE, TRUNCATE_EXISTING ו־WRITE. זה אומר שהיא פותחת את הקובץ לכתיבה ויוצרת אותו אם הוא לא קיים, או מקטין את הקובץ הקיים לגודל 0 אם הוא קיים. כל הבתים במערך ה־byte מתווספים לקובץ. השיטה מבטיחה שהקובץ נסגר כאשר כל הבתים כתובים ומחזירה את נתיב הקובץ שנכתב.
package com.journaldev.examples;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
/**
* Java Files write file example
*
* @author pankaj
*
*/
public class FilesWriteFileExample {
public static void main(String[] args) {
Path path = Paths.get("D:/data/test.txt");
try {
String str = "This is write file Example";
byte[] bs = str.getBytes();
Path writtenFilePath = Files.write(path, bs);
System.out.println("Written content in file:\n"+ new String(Files.readAllBytes(writtenFilePath)));
} catch (Exception e) {
e.printStackTrace();
}
}
}
Walk File Tree
מחלקת קבצים מספקת את השיטה walkFileTree(Path start, FileVisitor<? Super Path> visitor) המשמשת לעבור על עץ הקבצים. היא מעבור באופן רקורסיבי על הספרייה בנתיב מסוים ומחזירה את הקובץ ההתחלתי.
package com.journaldev.examples;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
/**
* Java Files walk file tree example
*
* @author pankaj
*
*/
public class FilesWalkFileTreeExample {
public static void main(String[] args) {
Path path = Paths.get("D:/pankaj");
try {
Files.walkFileTree(path, new FileVisitor<Path>() {
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
System.out.println("Post Visit Directory: "+dir);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
System.out.println("Pre Visit Directory: "+dir);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("Visit File: "+file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
System.out.println("Visit Failed File: "+file);
return FileVisitResult.CONTINUE;
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
הפלט של התוכנית לעיל הוא:
Pre Visit Directory: D:\pankaj
Pre Visit Directory: D:\pankaj\java6
Pre Visit Directory: D:\pankaj\java6\Files
Visit File: D:\pankaj\java6\Files\file.txt.txt
Post Visit Directory: D:\pankaj\java6\Files
Post Visit Directory: D:\pankaj\java6
Pre Visit Directory: D:\pankaj\java7
Pre Visit Directory: D:\pankaj\java7\Files
Visit File: D:\pankaj\java7\Files\file.txt.txt
Post Visit Directory: D:\pankaj\java7\Files
Post Visit Directory: D:\pankaj\java7
Pre Visit Directory: D:\pankaj\java8
Pre Visit Directory: D:\pankaj\java8\Files
Visit File: D:\pankaj\java8\Files\file.txt.txt
Post Visit Directory: D:\pankaj\java8\Files
Post Visit Directory: D:\pankaj\java8
Post Visit Directory: D:\pankaj
שימו לב שכל הקבצים והתיקיות מעובדים באופן רקורסיבי. זה מאוד שימושי כאשר ברצונך לבצע עיבוד משותף על כל הקבצים, כמו לשנות את שמות כל הקבצים בתיקייה באופן רקורסיבי. זהו הכל לגבי מחלקת קבצים של Java. הפניה: API Doc
Source:
https://www.digitalocean.com/community/tutorials/java-files-nio-files-class