واجهة المسار
1. يمثل المسار سلسلة من أسماء الدليل ، يليه اسم ملف. عندما يكون المكون الأول في المسار هو مكون الجذر ، فهو المسار المطلق ، مثل / أو c: / ، ويعتمد مكون الجذر المسموح به على نظام الملفات ؛
2. المسار الذي يبدأ بمكون الجذر هو مسار مطلق ، وإلا فهو مسار نسبي ؛
3. تقبل طريقة المسارات الثابتة واحدة أو أكثر من السلاسل ، ويتم توصيل السلاسل تلقائيًا عن طريق فاصل المسار لنظام الملفات الافتراضي (UNIX IS /، Windows IS /) ، والذي يحل مشكلة المنصات المتقاطعة. ثم تحليل النتائج المتصلة. إذا لم يكن مسارًا قانونيًا ، فسيتم إلقاء استثناء غير صالح ، وإلا سيتم إرجاع كائن المسار ؛
] // مسار المسار المطلق نسبيًا = pahts.get ("ixenos" ، "config" ، "user.properties") ؛ // المسار النسبي4. احصل على كائن المسار من مسار السلسلة
يمكن الحصول على مسار كامل أيضًا (أي سلسلة واحدة تتكون من مكونات متعددة) ، على سبيل المثال ، اقرأ المسار من ملف التكوين:
String riledir = properties.getProperty ("base.dir") ؛ // قد يتم الحصول عليها/opt/ixenos أو c:/program files/ixenos path basepath = paths.get (riptireir) ؛5. الجمع بين مسارات أو تحليلها
1) الاتصال P.Resolve (Q) سيعود مسارًا وفقًا للقواعد التالية: إذا كان Q مسارًا مطلقًا ، فالتراجع Q ، وإلا فإن المسار الملحق سيعود p/q أو p/q
path workrationalative = paths.get ("work") ؛ path workpath = basepath.Resolve (واقعية) ؛ // يمكن حلها أيضًا قبول معلمات السلسلة pathpath = basepath.resolve ("work") ؛2) استدعاء p.resolvesibling ("Q") سيحل المسار الأصل O للمسار المحدد p وإنشاء مسار الأخوة O/Q
path temppath = workPath.Resolvesibling ("temp") ؛ / * إذا كان WorkPath هو/opt/ixenos/work ، فسيتم إنشاء/opt/ixenos/temp */3) استدعاء P.Relativize (R) سوف يولد مسار زائد Q. سوف يتم تحليل Q مسار نسبي ص. في النهاية ، لا يحتوي R على مسار التقاطع مع p.
/* patha IS/Home/Misty Pathb IS/Home/Ixenos/config الآن patha لديه مسار نسبي ، والذي سيولد مسار زائدة عن الحاجة*/path attc = patha.relativize (pathb) ؛ // في هذا الوقت ، athc هو ../ixenos/config/m طريقة تطبيعها ستزيل الجزء الزائد*/pathd = pathc.normalial () ؛ // pathd هو/ixenos/config
4) سوف ينتج Tobsolutepath المسار المطلق للمسار المعطى ، بدءًا من مكون الجذر
5) تحتوي فئة المسار أيضًا على بعض الطرق المفيدة لفصل المسارات ودمجها ، مثل GetParent و GetFilename و GetRoot // Get the Root Directory
6) يحتوي المسار على طريقة tofile للتعامل مع فئات الملفات القديمة ، كما أن فئة الملفات لها طريقة Topath
أدوات الملفات
1. اقرأ وكتابة الملفات
توقيع الطريقة:
مسار ثابت الكتابة (مسار المسار ، البايت [] بايت ، OpenOption ... خيارات)
كتابة المسار الثابت (مسار المسار ، iberable <؟ يمتد خطوط charsequence> ، OpenOption ... خيارات)
هنا فقط الطرق المستخدمة أدناه. لمزيد من الطرق ، يرجى الاطلاع على وثائق API ...
من بينها ، OpenOption هو واجهة NIO ، HandterOpenOption هي فئة تنفيذ التعداد. يرجى التحقق من وثائق API لكل وظيفة مثيل التعداد.
/* الطريقة البسيطة التي توفرها الملفات مناسبة لمعالجة الملفات النصية متوسطة الطول. إذا كان الملف المراد معالجته كبيرًا أو ثنائيًا ، فلا يزال يتعين عليك استخدام دفق IO الكلاسيكي*/// اقرأ جميع محتويات الملف في بايت صفيف البايت [] بايت = files.readallbytes (المسار) ؛ // تمرير إلى كائن المسار // بعد ذلك ، يمكنك إنشاء السلسلة وفقًا لمحتوى سلسلة الأحرف = سلسلة جديدة (بايت ، charset) ؛ // يمكنك أيضًا قراءتها مباشرةً كسلسلة سطر في قائمة <string> خطوط = files.readalllines (path ، charset) ؛ على العكس من ذلك ، يمكنك أيضًا كتابة سلسلة في الملف ، وهي ملفات. // Pause Byte [] // Aspend Content ، حدد وظائف الإلحاق مثل الإضافة استنادًا إلى Files.write (path ، content.getBytes (charset) ، standardopenoption.append) ؛ // إيقاف كائن التعداد وقم بتشغيل مفتاح إلحاق // اكتب قائمة مجموعة من سلسلة الخط في ملفات الملفات. write (المسار ، الأسطر) ؛
2. نسخة ، قطع ، حذف
توقيع الطريقة:
نسخة مسار ثابت (مصدر المسار ، هدف المسار ، خيارات copyoption ...
تحرك المسار الثابت (مصدر المسار ، هدف المسار ، خيارات CopyOption)
حذف الفراغ الثابت (مسار المسار) // إذا لم يكن المسار موجودًا ، فسيتم طرح استثناء. من الأفضل الاتصال بما يلي في هذا الوقت
redeletexists المنطقية الثابتة (مسار المسار)
هنا فقط الطرق المستخدمة أدناه. لمزيد من الطرق ، يرجى الاطلاع على وثائق API ...
من بينها ، CopyOption هي واجهة NIO ، HandterCopyOption هي فئة تنفيذ التعداد. يرجى التحقق من وثائق API لكل وظيفة مثيل التعداد.
يوجد atomic_move يمكن ملؤه لضمان العمليات الذرية ، إما أن يتم الانتهاء من الحركة بنجاح ، أو يتم الاحتفاظ بالملف المصدر في موضعه الأصلي.
// copy files.copy (frompath ، topath) ؛ // cut files.move (frompath ، topath) ؛/* إذا كان Topath موجودًا بالفعل ، تفشل العملية. إذا كنت ترغب في الكتابة فوقها ، فأنت بحاجة إلى تمرير المعلمة REPLIST_EXISTING. قم أيضًا بنسخ سمات الملف ، وتمرير في copy_attributes*/files.copy (من Path ، topath ، standardcopyoption.replace_existing ، standardcopyoption.copy_attributes) ؛
3. قم بإنشاء الملفات والأدلة
// إنشاء دليل جديد ، باستثناء المكون الأخير ، يجب أن يكون الآخرون هو الملفات الموجودة. createdirectory (path) ؛ // قم بإنشاء الدليل الوسيط في المسار ، والذي يمكنه إنشاء ملفات المكونات الوسيطة غير الموجودة. إذا كان موجودًا بالفعل ، فسيتم طرح استثناء للتحقق من وجود الملف. لذلك ، لا يمكن تنفيذ عملية إنشاء الملفات في العملية*/files.createfile (path) ؛ // إضافة ما قبل/لاحقة لإنشاء ملف مؤقت أو مسار دليل مؤقت NewPath = files.createTempFile (dir ، profix ، fudix) ؛ path newPath = files.createTempDirectory (dir ، prefix) ؛
4. الحصول على معلومات الملف
تم حذفه ، انظر إلى وثائق API للحصول على التفاصيل ، أو Corejava Page51
5. التكرار عبر الملفات في الدليل
تحتوي فئة الملفات القديمة على طريقتان للحصول على صفيف سلسلة مؤلف من جميع الملفات في الدليل ، وسلسلة [] قائمة () وقائمة السلسلة [] (مرشح FileFilter) ، ولكن عندما يحتوي الدليل على عدد كبير من الملفات ، سيكون أداء هاتين الطريقتين منخفضًا للغاية.
تحليل السبب:
1. // فئة الملفات قائمة جميع الملفات public string [] list () {SecurityManager Security = system.getSecurityManager () ؛ // أذونات نظام الملفات الحصول على إذا (الأمان! = null) {security.checkread (path) ؛ } if (isInvalId ()) {return null ؛ } return fs.list (this) ؛ . } if (isInvalId ()) {return null ؛ } return fs.list (this) ؛ // الدعوة الأساسية إلى قائمة نظام الملفات} // قائمة الفئة التجريدية لنظام الملفات. * إرجاع كائن نظام الملفات لنظام التشغيل Windows. */ نظام الملفات الثابتة العامة getFileSystem () {return new winnntfileSystem () ؛ }} // ترث فئة WinntFilesystem من فئة ملخص نظام الملفات. هنا نلاحظ أساسًا قائمة قائمة (ملف) Overridepublic Native String [] (ملف F) ؛/*يمكننا أن نرى أن هذه طريقة أصلية ، والتي توضح أن تشغيل القائمة يتم التحكم فيه بواسطة نظام ملفات نظام التشغيل. عندما يحتوي الدليل على عدد كبير من الملفات ، سيكون أداء هذه الطريقة منخفضًا للغاية. لذلك ، من أجل استبدالها ، صمم فئة ملفات NIO NewDirectoryStream (مسار DIR) وطريقة محملة زائدة ، والتي ستولد كائنًا غير قابل للتطبيق (يمكن تكراره foreach) */// ~ 2. // استدعاء قائمة كل if ((names == null) || (filter == null)) {return names ؛ } list <string> v = new ArrayList <> () ؛ لـ (int i = 0 ؛ i <names.length ؛ i ++) {if (filter.accept (هذا ، الأسماء [i])) {// callback طريقة قبول الكائن filenameFileter v.add (names [i]) ؛ }} return v.toarray (سلسلة جديدة [v.size ()]) ؛ }في هذا الوقت ، تأتي التكنولوجيا العالية - تحصل الملفات على تدفقات الدليل المزعجة ،
تمرير في مسار الدليل ، اجتياز دليل أحفاد وإرجاع دفق مسار الدليل. لاحظ أن جميع المسارات المعنية هنا هي أدلة بدلاً من الملفات!
لذلك ، تقوم فئة الملفات بتصميم NewDirectoryStream (Path Dir) وطريقتها الزائدة ، والتي ستقوم بإنشاء كائن لا يطاق (يمكن استخدامه foreach)
تكرار من خلال الدليل للحصول على مجموعة غير قابلة للاشمئذاف من ملفات أحفاد
staticDirectoryStream<Path> | يفتح newDirectoryStream(Path dir) دليلًا ، ويعيد DirectoryStream للتكرار على جميع الإدخالات في الدليل. |
staticDirectoryStream<Path> | newDirectoryStream(Path dir, DirectoryStream.Filter<? super Path> filter) يفتح دليلًا ، ويعيد DirectoryStream إلى التكرار على الإدخالات في الدليل. |
staticDirectoryStream<Path> | newDirectoryStream(Path dir, String glob) |
يمكن اعتبار إرجاع دفق الدليل عبارة عن مجموعة تخزن جميع المسارات التي تنفذها.
لذلك ، يتكرر التكرار أو Foreach ، ولكن عند استخدام التكرار ، احرص على عدم استدعاء مؤلف آخر:
على الرغم من أن DirectoryStream يمتد غير قابلة للإعجاب ، إلا أنه ليس غرضًا عامًا لأنه يدعم فقط تكرارًا واحدًا ؛ إن استدعاء طريقة التكرار للحصول على إلقاء مؤلف ثانٍ أو لاحق يرمي غير قانوني.
مثال:
TREE (DIRECTORYSTREAM <TATH> إدخالات = ملفات
يمكنك تمرير معلمات GLOB ، أي استخدام وضع GLOB لتصفية الملفات (بدلاً من القائمة (FileFilter Filter)):
لاحظ NewDirectoryStream (مسار DIR ، String Glob) أنه نوع السلسلة
جرب (DirectoryStream <Path> إدخالات = files.newdirectorystream (dir ، "*.java")) // {...}وضع العالم
يشير ما يسمى نمط الكرة الأرضية إلى التعبير المنتظم المبسط المستخدمة من قبل الصدفة.
1. النجمة* تطابق 0 أو أكثر في مكون المسار ؛ على سبيل المثال *.java يطابق جميع ملفات Java في الدليل الحالي
2. اثنين من النجمة ** تطابق 0 أو أكثر عبر حدود الدليل ؛ على سبيل المثال ، **. يطابق Java ملفات Java في جميع الدلالات الفرعية
3. علامة الاستفهام (؟) فقط تطابق شخصية واحدة ؛ على سبيل المثال ، ؟؟؟؟ يستخدم ؟ لأن * شخصية البرية ولا تحدد الرقم
4. [...] لمطابقة مجموعة الأحرف ، يمكنك استخدام الاتصال [0-9] والشخصية العكسية [! 0-9] ؛ على سبيل المثال ، الاختبار [0-9a-f] .java لمطابقة testx.java ، على افتراض أن x هو رقم سداسي عشري ، [0-9a-f] هو مطابقة شخصية واحدة كرقم سداسي عشوائي ، مثل B (السداسي السداسي غير حساس للحالة)
إذا كنت تستخدم Dash في أقواس مربعة لفصل حرفين ، فهذا يعني أنه يمكن مطابقة كل تلك الموجودة في نطاق هاتين الحرفين (على سبيل المثال ، [0-9] تعني مطابقة جميع أرقام 0 إلى 9).
5. {...} تطابق أحد الخيارات الاختيارية المتعددة مفصولة بفواصل ؛ على سبيل المثال *. {java ، class} تطابق جميع ملفات Java وملفات الفصل
6./ الهروب من الأحرف في أي من الأنماط المذكورة أعلاه ؛ على سبيل المثال */** يطابق الملفات مع أسماء الملفات في جميع الدلالات الفرعية مع *، هنا ** Escape ، مسبقًا بمطابقة 0 أو أكثر
ما يلي هو نموذج العالم الذي يلخصه مستخدمو الإنترنت:
| وضع العالم | يصف |
|---|---|
| *.رسالة قصيرة | تطابق جميع الملفات مع الامتداد .txt |
| *. {html ، htm} | تطابق جميع الملفات مع امتدادات .html أو .htm. {} يستخدم لوضع المجموعة ، الذي يتم فصله بواسطة الفواصل |
| ؟.رسالة قصيرة | تطابق أي حرف واحد كاسم ملف وتمديد .txt |
| . | تطابق جميع الملفات مع الامتدادات |
| ج:/مستخدمون/* | تطابق جميع الملفات في دليل المستخدمين من محرك C. يتم استخدام backslash "/" للهروب مباشرة من الشخصيات التالية |
| /بيت/** | تطابق جميع الدلائل والملفات المنزلية تحت الدلائل الفرعية على منصة UNIX. ** تستخدم لمطابقة الدليل الحالي وجميع الدليل الفرعي له |
| [xyz] .txt | تطابق جميع الأحرف المفردة كأسماء الملفات ، ويحتوي حرف واحد على واحدة فقط من "X" أو "Y" أو "z" ، ولديها امتداد .TXT. يتم استخدام الأقواس المربعة [] لتحديد مجموعة |
| [AC] .txt | تطابق جميع الأحرف المفردة كأسماء الملفات ، ويحتوي حرف واحد على واحد فقط من الأنواع الثلاثة من "A" أو "B" أو "C" ، ولديها امتداد .TXT. يتم استخدام علامة ناقص "-" لتحديد نطاق ولا يمكن استخدامه إلا بين قوسين مربعة [] |
| [! أ] .txt | تطابق جميع الأحرف المفردة كأسماء الملفات ، ولا يمكن أن تحتوي حرف واحد على الحرف "A" والتمديد هو .txt. علامة تعجب "!" يستخدم لإنكار |
أليس من الجيد التكرار من خلال جميع مجموعات ملفات المنحدرين في دليل معين؟ هيا ، دعونا نعبر مباشرة جميع أحفاد (بما في ذلك الدلائل والملفات) من الدليل.
يمكننا استدعاء طريقة WalkFileTree لفئة الملفات ونمر في كائن من نوع واجهة FileVisitor (هناك المزيد من الطرق في انتظارك لاكتشافها في واجهة برمجة التطبيقات ...)
/. الكود ، لا علاقة له بغرض walkfiletree (اجتياز جميع أعضاء المنحدرين).
دعونا نلخصها ،
Files.NewDirectoryStream (Path Dir) تُرجع مجموعة مبهجة من ملفات Descendants بعد اجتياز ؛
files.walkfiletree (Path Dir ، FileVisitor FV) هي عملية لاجتياز الدلائل وملفات أحفاد ؛
نظام الملفات zip
كما نعلم أعلاه ، سوف تبحث فئة المسارات عن مسارات في نظام الملفات الافتراضي ، أي ملفات على القرص المحلي للمستخدم.
في الواقع ، يمكن أن يكون لدينا أيضًا أنظمة ملفات أخرى ، مثل أنظمة الملفات ZIP.
/*افترض أن ZipName هو اسم ملف zip*/fileystem fs = fileystems.newFilesystem (paths.get (zipname) ، null) ؛
سيقوم الرمز أعلاه بإنشاء نظام ملفات قائم على ZipName يحتوي على جميع الملفات في مستند ZIP.
1) إذا كنت تعرف اسم الملف (نوع السلسلة) ، فمن السهل نسخ الملف من مستند zip هذا:
files.copy (fs.getPath (filename) ، targetpath) ؛
س: يستخدم FS.GetPath نظام ملفات zip للحصول على GetPath ، فهل يمكن استدعاء نظام الملفات الافتراضي؟
ج: نعم. هناك طريقة getDefault () ثابتة في فئة نظام الملفات ، والتي تقوم بإرجاع كائن نظام الملف الافتراضي ، والذي يمكن الحصول عليه أيضًا بواسطة اسم الملف getPath.
لأغراض محددة ، سواء تم اجتياز GetPath (اسم السلسلة) أو الوصول العشوائي ، انتقل لرؤية تطبيق التعليمات البرمجية المصدر عندما يكون لديك وقت.
2) لإدراج جميع الملفات في مستند ZIP ، يمكنك أيضًا استخدام WalkFileTree لاجتياز شجرة الملفات
FileSystem fs = fileystems.newFileSystem (paths.get (اسم الملف) ، لا ، استثناء {system.out.println (ملف) ؛المثال أعلاه لواجهة Java Nio Path و Files Class معًا هو كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.