1. Filesชั้นเรียน

คลาสไฟล์

ในการทำงานกับไฟล์ มีคลาสยูทิลิตี้ที่ลื่นjava.nio.file.Files— มีวิธีการสำหรับทุกโอกาส วิธีการทั้งหมดของคลาสนี้เป็นแบบคงที่และทำงานบนวัตถุเส้นทาง มีหลายวิธี ดังนั้นเราจะพิจารณาเฉพาะวิธีที่สำคัญที่สุด:

วิธี คำอธิบาย
Path createFile(Path path)
สร้างไฟล์ใหม่ที่มีเส้นทางpath
Path createDirectory(Path path)
สร้างไดเร็กทอรีใหม่
Path createDirectories(Path path)
สร้างหลายไดเร็กทอรี
Path createTempFile(prefix, suffix)
สร้างไฟล์ชั่วคราว
Path createTempDirectory(prefix)
สร้างไดเร็กทอรีชั่วคราว
void delete(Path path)
ลบไฟล์หรือไดเร็กทอรีหากว่างเปล่า
Path copy(Path src, Path dest)
คัดลอกไฟล์
Path move(Path src, Path dest)
ย้ายไฟล์
boolean isDirectory(Path path)
ตรวจสอบว่าเส้นทางเป็นไดเร็กทอรีไม่ใช่ไฟล์หรือไม่
boolean isRegularFile(Path path)
ตรวจสอบว่าเส้นทางเป็นไฟล์ไม่ใช่ไดเร็กทอรีหรือไม่
boolean exists(Path path)
ตรวจสอบว่ามีวัตถุอยู่ที่เส้นทางที่กำหนดหรือไม่
long size(Path path)
ส่งกลับขนาดไฟล์
byte[] readAllBytes(Path path)
ส่งกลับเนื้อหาทั้งหมดของไฟล์เป็นอาร์เรย์ของไบต์
String readString(Path path)
ส่งกลับเนื้อหาทั้งหมดของไฟล์เป็นสตริง
List<String> readAllLines(Path path)
ส่งกลับเนื้อหาทั้งหมดของไฟล์เป็นรายการสตริง
Path write(Path path, byte[])
เขียนอาร์เรย์ของไบต์ลงในไฟล์
Path writeString(Path path, String str)
เขียนสตริงลงในไฟล์
DirectoryStream<Path> newDirectoryStream(Path dir)
ส่งคืนชุดของไฟล์ (และไดเร็กทอรีย่อย) จากไดเร็กทอรีที่กำหนด

2. การสร้างไฟล์และไดเรกทอรี

ไฟล์และไดเร็กทอรีนั้นสร้างได้ง่ายมาก ลองโน้มน้าวใจตัวเองด้วยตัวอย่าง:

รหัส บันทึก
Files.createFile(Path.of("c:\\readme.txt"));
สร้างไฟล์
Files.createDirectory(Path.of("c:\\test"));
สร้างไดเร็กทอรี
Files.createDirectories(Path.of("c:\\test\\1\\2\\3"));
สร้างไดเร็กทอรีและไดเร็กทอรีย่อยที่จำเป็นทั้งหมดหากไม่มีอยู่

3. การคัดลอก ย้าย และลบ

การคัดลอก ย้าย และลบไฟล์นั้นง่ายพอๆ กัน สิ่งนี้ใช้กับไดเร็กทอรีด้วย แต่ต้องว่างเปล่า

รหัส บันทึก
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("c:\\readme-copy.txt");
Files.copy(path1, path2);
คัดลอกไฟล์
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("d:\\readme-new.txt");
Files.move(path1, path2);
ย้ายและเปลี่ยนชื่อไฟล์
Path path = Path.of("d:\\readme-new.txt");
Files.delete(path);
ลบไฟล์

4. การตรวจสอบประเภทและการมีอยู่ของไฟล์

เมื่อคุณมีเส้นทางที่คนอื่นให้มา คุณต้องการทราบว่าเป็นไฟล์หรือไดเร็กทอรี และโดยทั่วไปแล้ว ไฟล์/ไดเร็กทอรีดังกล่าวมีอยู่หรือไม่?

มีวิธีพิเศษสำหรับสิ่งนี้เช่นกัน คุณยังสามารถค้นหาความยาวของไฟล์ได้อย่างง่ายดาย:

รหัส บันทึก
Files.isRegularFile(Path.of("c:\\readme.txt"));
true
Files.isDirectory(Path.of("c:\\test"));
true
Files.exists(Path.of("c:\\test\\1\\2\\3"));
false
Files.size(Path.of("c:\\readme.txt"));
10112

5. การทำงานกับเนื้อหาไฟล์

สุดท้าย มีวิธีการทั้งหมดที่ช่วยให้อ่านหรือเขียนเนื้อหาของไฟล์ได้ง่าย ตัวอย่าง:

รหัส คำอธิบาย
Path path = Path.of("c:\\readme.txt");
List<String> list = Files.readAllLines(path);

for (String str : list)
   System.out.println(str);

อ่านเนื้อหาของไฟล์เป็นรายการสตริง

แสดงสตริง


6. รับเนื้อหาของไดเร็กทอรี

วิธีการที่น่าสนใจที่สุดยังคงอยู่ ใช้เพื่อรับไฟล์และไดเร็กทอรีย่อยในไดเร็กทอรีที่กำหนด

เรากำลังพูดถึงnewDirectoryStream()เมธอดซึ่งส่งคืนDirectoryStream<Path>วัตถุ พิเศษ มีตัววนซ้ำ (!) ที่คุณสามารถใช้เพื่อรับไฟล์และไดเร็กทอรีย่อยทั้งหมดของไดเร็กทอรีที่กำหนด

มันง่ายกว่าที่คิด

รหัส คำอธิบาย
Path path = Path.of("c:\\windows");

try (DirectoryStream<Path> files = Files.newDirectoryStream(path)) {
   for (Path path : files)
      System.out.println(path);
}


รับวัตถุที่มีรายการไฟล์
วนซ้ำรายการไฟล์

วัตถุDirectoryStream<Path>มีสองคุณสมบัติ อย่างแรก มันมีตัววนซ้ำที่ส่งคืนเส้นทางของไฟล์ และเราสามารถใช้วัตถุนี้ภายในลูfor-eachปได้

และประการที่สอง ออบเจ็กต์นี้เป็นสตรีมข้อมูล ดังนั้นจะต้องปิดอย่างชัดเจนโดยใช้เมธอดclose()หรือประกาศใช้ภายในtry-with-resourcesบล็อก



7. Files.newInputStreamวิธีการ

เริ่มต้นด้วย Java 5 คลาส FileInputStreamand FileOutputStreamเลิกใช้แล้ว ข้อเสียประการหนึ่งคือเมื่อมีการสร้างวัตถุของคลาสเหล่านี้ ไฟล์จะถูกสร้างขึ้นบนดิสก์ทันที และข้อยกเว้นทั้งหมดที่เกี่ยวข้องกับการสร้างไฟล์อาจถูกโยนทิ้งไป

ภายหลังได้รับการยอมรับว่าไม่ใช่การตัดสินใจที่ดีที่สุด ดังนั้น ขอแนะนำให้ใช้เมธอดของjava.nio.Filesคลาสยูทิลิตี้เพื่อสร้างวัตถุไฟล์

ต่อไปนี้คือการเปรียบเทียบระหว่างแนวทางเดิมกับแนวทางใหม่ในการสร้างไฟล์:

ก่อน
String src = "c:\\projects\\log.txt";
InputStream input = new FileInputStream(src);
หลังจาก
String src = "c:\\projects\\log.txt";
InputStream input = Files.newInputStream( Path.of(src) );

และมีสิ่งทดแทนที่คล้ายกันสำหรับFileOutputStream:

ก่อน
String src = "c:\\projects\\log.txt";
OutputStream  output = new FileOutputStream( src );
หลังจาก
String src = "c:\\projects\\log.txt";
OutputStream  output = Files.newOutputStream( Path.of( src ) );