สำหรับแอปพลิเคชันใหม่ที่เขียนใน Java 7 มีเหตุผลใดที่จะใช้java.io.File
วัตถุอีกต่อไปหรือเราจะพิจารณาว่าเลิกใช้แล้วหรือไม่?
ฉันเชื่อว่าjava.nio.file.Path
ทุกสิ่งjava.io.File
สามารถทำได้และทำได้มากกว่านี้
สำหรับแอปพลิเคชันใหม่ที่เขียนใน Java 7 มีเหตุผลใดที่จะใช้java.io.File
วัตถุอีกต่อไปหรือเราจะพิจารณาว่าเลิกใช้แล้วหรือไม่?
ฉันเชื่อว่าjava.nio.file.Path
ทุกสิ่งjava.io.File
สามารถทำได้และทำได้มากกว่านี้
คำตอบ:
เรื่องสั้นสั้น:
java.io.File
ส่วนใหญ่จะไม่ถูกปฏิเสธ / ไม่ได้รับการสนับสนุน ที่กล่าวว่าjava.nio.file.Path
เป็นส่วนหนึ่งของjava.nio.file
lib ทันสมัยมากขึ้นและทำทุกอย่างได้java.io.File
แต่โดยทั่วไปในทางที่ดีขึ้นและมากขึ้น
Path
สำหรับโครงการใหม่ใช้
และถ้าคุณต้องการFile
วัตถุสำหรับมรดกเพียงแค่เรียกPath # toFile ()
การโอนย้ายจากไฟล์ไปยังพา ธ
บทความโดย Janice J. Heiss และ Sharon Zakhour พฤษภาคม 2009 หารือเกี่ยวกับระบบไฟล์ NIO.2 ใน JDK 7
File
แทนPath
?
Path
สามารถแก้ไขได้ง่ายขึ้นเพื่อ "เพิ่มลูก" ด้วยresolve(...)
หรือ "เลื่อนระดับหนึ่ง" ด้วยgetParent()
ฯลฯ โดยที่File
ไม่สามารถทำได้ เป็นหลักเมื่อคุณปรับเปลี่ยน Path เสร็จแล้วคุณจะแปลงมันบ่อยครั้งtoFile()
เพื่อให้สามารถส่งเป็นวิธีดั้งเดิมเช่นFileInputStream
Constructor ได้
เราจะพิจารณาว่าเลิกใช้แล้วได้หรือไม่
ไม่คุณไม่สามารถพิจารณาว่าจะเลิกใช้จนกว่าจะมีการทำเครื่องหมายในFile
Javadoc
java.io.File
ยังไม่ถูกลบออกหรือเลิกใช้แล้วและยังไม่มีอะไรใน Javadoc ที่จะแนะนำว่าสิ่งเหล่านี้จะเกิดขึ้นอย่างใดอย่างหนึ่ง
ตรวจสอบบทความนี้เกี่ยวกับข้อมูลเพิ่มเติม - http://www.oracle.com/technetwork/articles/javase/nio-139333.html
โดยพื้นฐานแล้วไฟล์แพทจะเป็นวิธีที่จะดำเนินการต่อจากนี้ไป แต่ในฐานะที่เป็นที่รู้กันดีว่าคน Java มักจะใช้งานร่วมกันได้ดังนั้นฉันคิดว่านั่นเป็นสาเหตุที่พวกเขาทิ้งมันไว้
@mmcrae
ฉันจะเสร็จสิ้นคำตอบที่ดีมากของ
มีเหตุผลใดที่จะใช้วัตถุ java.io.File อีกต่อไปหรือเราจะพิจารณาว่าเลิกใช้แล้วหรือไม่?
คลาส JDK เลิกใช้บ่อยมาก
คุณสามารถดูรายการเลิกใช้ JDK 8 APIทุกคลาสที่เลิกใช้ตั้งแต่ JDK แรก
มันมีเพียงส่วนน้อยของคลาสที่เอกสาร Oracle และชุมชน Java กีดกันที่จะใช้
java.util.Date
, java.util.Vector
, java.util.Hashtable
... ที่มีชั้นเรียนที่มีข้อบกพร่องอื่น ๆ จำนวนมากไม่ได้เลิก
แต่ทำไม
เพราะแนวความคิดบางอย่างของdeprecated
วิธีการยังคงมี แต่ไม่แนะนำให้ใช้เพราะมันจะถูกลบอย่างแน่นอน
โปรแกรมหลายพันโปรแกรมพึ่งพาคลาสที่ออกแบบมาไม่ดีเหล่านี้
สำหรับคลาสดังกล่าวผู้พัฒนา Java API จะไม่ให้สัญญาณดังกล่าว
คำตอบ@EJP
คือถูกต้องจริงๆ:
ไม่เว้นแต่และจนกว่าจะมีการทำเครื่องหมายใน Javadoc
ดังนั้นฉันคิดว่าคำถามของคุณจะมีเหตุผลมากกว่านี้:
"เมื่อเรามีทางเลือกเราควรใช้java.io.File
หรือjava.nio.file.Path
เพื่อการพัฒนาใหม่และถ้าคำตอบคือjava.nio.file.Path
คุณจะสามารถใช้ประโยชน์จากjava.io.File
โปรเจ็กต์รุ่นเก่าได้java.io.File
หรือไม่"
ฉันเชื่อว่า java.nio.file.Path สามารถทำทุกอย่างที่ java.io.File สามารถทำได้และอีกมากมาย
คุณมีคำตอบ
ออราเคิลบทสอนเกี่ยวกับมรดก IO ยืนยันความคิดของคุณ
ก่อนหน้าการเปิดตัว Java SE 7
java.io.File
คลาสเป็นกลไกที่ใช้สำหรับไฟล์ I / O แต่มีข้อเสียหลายประการวิธีการมากมายไม่ได้ส่งข้อยกเว้นเมื่อล้มเหลวดังนั้นจึงเป็นไปไม่ได้ที่จะได้รับข้อความแสดงข้อผิดพลาดที่เป็นประโยชน์ ตัวอย่างเช่นหากการลบไฟล์ล้มเหลวโปรแกรมจะได้รับ "การลบล้มเหลว" แต่ไม่ทราบว่าเป็นเพราะไฟล์ไม่มีอยู่หรือไม่ผู้ใช้ไม่มีสิทธิ์หรือมีปัญหาอื่น ๆ
วิธีการเปลี่ยนชื่อไม่ทำงานอย่างสม่ำเสมอในแพลตฟอร์มต่างๆ ไม่มีการสนับสนุนที่แท้จริงสำหรับลิงก์สัญลักษณ์
ต้องการการสนับสนุนเพิ่มเติมสำหรับข้อมูลเมตาเช่นสิทธิ์ของไฟล์เจ้าของไฟล์และคุณลักษณะความปลอดภัยอื่น ๆ
การเข้าถึงข้อมูลเมตาของไฟล์ไม่มีประสิทธิภาพ
วิธีการหลายไฟล์ไม่ได้ปรับขนาด การร้องขอรายชื่อไดเรกทอรีขนาดใหญ่บนเซิร์ฟเวอร์อาจทำให้แฮงค์ ไดเรกทอรีขนาดใหญ่อาจทำให้เกิดปัญหาทรัพยากรหน่วยความจำส่งผลให้การปฏิเสธบริการ
ไม่สามารถเขียนรหัสที่เชื่อถือได้ซึ่งสามารถเดินทรีไฟล์และตอบกลับอย่างเหมาะสมหากมีการเชื่อมโยงสัญลักษณ์แบบวงกลม
ด้วยข้อเสียมากมายjava.io.File
เราไม่จำเป็นต้องใช้ชั้นเรียนนี้เพื่อการพัฒนาใหม่ ๆ
และแม้กระทั่งสำหรับรหัสเดิมใช้ออราเคิลช่วยให้คำแนะนำในการใช้งานjava.io.File
Path
บางทีคุณอาจมีรหัสดั้งเดิมที่ใช้ java.io.File และต้องการใช้ประโยชน์จากฟังก์ชัน java.nio.file.Path ที่มีผลกระทบต่อโค้ดน้อยที่สุด
คลาส java.io.File จัดเตรียมเมธอด toPath ซึ่งแปลงอินสแตนซ์ File แบบเก่าเป็นอินสแตนซ์ java.nio.file.Path ดังต่อไปนี้:
Path input = file.toPath();
จากนั้นคุณสามารถใช้ประโยชน์จากชุดคุณลักษณะที่มีให้กับคลาส Path
ตัวอย่างเช่นสมมติว่าคุณมีรหัสที่ลบไฟล์:
file.delete();
คุณสามารถแก้ไขโค้ดนี้เพื่อใช้เมธอด Files.delete ดังต่อไปนี้:
Path fp = file.toPath();
Files.delete(fp);
ใช่ แต่ API ที่มีอยู่จำนวนมากรวมถึง API มาตรฐานของ Java7 ยังคงใช้งานได้กับFile
ประเภทเท่านั้น
Java.io.File ไม่ได้ถูกปฏิเสธ ใช่ java.nio.file.Path จะดีกว่า แต่ตราบใดที่ยังมีโปรแกรมและหนังสือตำราจำนวนมากที่ใช้ Java.io.File หากเพียงเพื่อเหตุผลดั้งเดิมเท่านั้นไม่ควรพิจารณาว่าเลิกใช้มันสำคัญเกินไป การทำเช่นนั้นเพียงแค่โยนประแจในงานเพื่อไม่ให้เกินกำไรทั้งหมด ตัวอย่างเช่นกรอบการทำงานของ Android ใช้ไฟล์สำหรับคุณสมบัติการจัดการไฟล์ขั้นพื้นฐานบางอย่างมีหลายสิ่งที่ต้องทำ
Path
ดีกว่าหรือไม่ เขาถามว่าFile
เลิกหรือไม่
สำหรับแอปพลิเคชันใหม่ที่เขียนใน Java 7 มีเหตุผลใดที่จะใช้ java.io.File object อีกต่อไปหรือเราจะพิจารณาว่าเลิกใช้แล้วหรือไม่?
นี่เป็นคำที่พูดว่า: "นโปเลียนควรบุกรัสเซียหรือถั่วงอกบรัสเซลส์เหล่านี้อร่อยจริงเหรอ"
ในส่วนที่สองของคำถามคุณสามารถพิจารณาได้อย่างแน่นอนว่าเลิกใช้แล้ว ตั้งแต่เดือนมกราคม 2018 จะไม่มีการคัดค้าน แต่ไม่มีอะไรจะหยุดคุณพิจารณาได้ ไม่ว่าจะจัดหาคุณประโยชน์ใด ๆ ในชีวิตนี้หรือต่อไปเป็นไปไม่ได้ที่จะพูด
File
ฉันควรใช่หรือไม่"
File
อยู่ มันจะไม่ตายในเร็ว ๆ นี้
it isn't deprecated. But there's nothing to stop you *considering* it so
ฮ่า ๆ.