مقدمة
بدءًا من هذه المقالة ، سنبدأ في تعلم نظام Java IO ، والذي يقرأ الملفات والكتابة بشكل أساسي. يبدو الأمر بسيطًا ، لكنه ليس سهلاً. يعمل نظام IO الخاص بـ Java على تحسين وتحسين ، وقد صمم عددًا كبيرًا من الفصول الدراسية. فقط من خلال فهم معنى هذه الأنواع التي يتم تصميمها وسيناريوهات التطبيق الخاصة بها ، يمكننا تحسين فهم ملف IO.
لذلك ، فإن الخطوة الأولى هي حل مشكلة كيفية تمثيل ملف. في عالم Java ، "كل شيء هو كائن" ، وكيفية التوافق مع ملف أو دليل قرص فعلي إلى كائن Java هي مشكلتنا الأساسية.
يتم استخدام الملف في Java لتجريد ملف ، سواء كان ملفًا عاديًا أو دليلًا ، يمكن أن يتوافق مع كائن ملف. أعتقد أن كل شخص يجب أن يكون دقيقًا في وضع نوع الملف: إنه ببساطة يمثل ملفًا أو دليلًا على القرص ، ويعتمد فعليًا على فئة نظام الملفات المحلية المستقلة عن النظام الأساسي ، ولا يمكن للملف إجراء أي عمليات قراءة وكتابة على محتوى الملف الذي يمثله (هذا ما يفعله الدفق).
إنشاء مثيل ملف
قبل تقديم طريقة منشئ مثيل الملف فعليًا ، نحتاج إلى إلقاء نظرة على العديد من أعضاء السمات المهمة.
نظام الملفات النهائي الثابت الخاص fs = defaultFileSystem.getFileSystem () ؛
هذا هو العضو الأساسي في فئة الملفات ، والتي يتم تمثيلها كأبي نظام ملفات الملفات للنظام الحالي. تستند جميع العمليات الصادرة إلى القرص إلى هذه الخاصية.
مسار السلسلة النهائي الخاص ؛
يمثل المسار اسم المسار الكامل للمثال الحالي. إذا كان مثيل الملف الحالي يمثل دليلًا ، فإن قيمة المسار هي اسم الدليل الكامل. إذا كان يمثل ملفًا نقيًا ، فإن قيمة هذا المسار تساوي المسار الكامل للملف + اسم الملف.
فاصل char النهائي الثابت العام = fs.getSeparator () ؛ public static final char pathseparatarchar = fs.getPathseParator () ؛
يمثل فاصل الفاصل بين الدلائل ، ويمثل PathseParatorChar الفاصل تحت مسارات مختلفة. تختلف هاتان القيمتان تحت منصات النظام المختلفة. على سبيل المثال ، قيم هذين تحت النوافذ هي: "" و "؛" ، حيث يتم استخدام الحظر لفصل مسارات مختلفة متعددة.
يوفر فئة الملف أربعة مُنشئين مختلفين لتشكيل كائن ملف ، ولكن ثلاثة فقط يتم استخدامها بشكل أكثر شيوعًا. نركز أيضًا على تعلم المُنشئين الثلاثة الأوائل.
ملف عام (اسم مسار السلسلة)
هذه هي الطريقة الأكثر شيوعًا لتشكيل كائن ملف. يمكن أن تكون قيمة اسم المسار دليلًا أو اسم ملف عادي. على سبيل المثال:
ملف الملف = ملف جديد ("C: // user // yanga // desktop") ؛ file file1 = file new file ("c: //users//yanga//desktop//a.txt") ؛ file2 = new file ("A.TXT") ؛بالطبع ، يمكنك أيضًا تحديد مسار الوالد بشكل صريح:
ملف عام (سلسلة الوالدين ، سلسلة الأطفال)
داخل المُنشئ ، سيقوم البرنامج بصق مسار ملف كامل بالنسبة لنا ، على سبيل المثال:
ملف الملف = ملف جديد ("C: // user // yanga // desktop" ، "a.txt") ؛ file file1 = new file ("c: // users // yanga // desktop" ، "java") ؛المُنشئ الثالث هو نفسه في الأساس مثل المُنشئ الثاني ، إلا أنه يضيف عملية تغليف لمثيل الملف الأصل:
ملف عام (ملف الوالد ، سلسلة الأطفال)
لن يتم شرح مواقف مماثلة. لم نتحرر في التنفيذ الداخلي المحدد لهذه المنشئات هنا. ليس الأمر بسيطًا. بدلاً من ذلك ، يعتمد الملف كثيرًا على نظام الملفات المحلي ولا يمكن رؤية تنفيذ العديد من الطرق مباشرة. لذلك ، بالنسبة لتعلم الملف ، يكفي أن تكون كفاءة في إتقانه ، ولا يمكن تعلم التنفيذ المحدد بعمق في الوقت الحالي.
الحصول على المعلومات المتعلقة باسم الملف أو المسار
يمكن استخدام طريقة getName للحصول على اسم الملف:
السلسلة العامة getName () {int index = path.lastIndexof (separatorchar) ؛ إذا (الفهرس <precixLength) return path.substring (precixLength) ؛ إرجاع path.substring (فهرس + 1) ؛}تذكر ما يمثله فاصلنا الفاصل؟
يتم تمثيله على أنه فاصل مسار ، يتم تخزين الرمز "" في Windows في سمة المسار ، واسم المسار الكامل لمثيل الملف الحالي ، لذلك يجب أن يكون جميع الأحرف بعد الحدوث الأخير هو اسم ملفنا.
بالطبع يجب أن تكون قد اكتشفت أنه بالنسبة للملفات الخالصة ، يمكن لهذه الطريقة إرجاع الاسم البسيط للملف ، بينما بالنسبة للدليل ، ستكون قيمة الإرجاع هي اسم الدليل الأحدث. على سبيل المثال:
ملف الملف = ملف جديد ("c: //users//yanga//desktop//a.txt") ؛ system.out.println (file.getName ()) ؛ file1 = ملف جديد ("c: // user // yanga // desktop") ؛ system.out.println (file1.getname () ؛لن يفاجئك الإخراج:
A.TxtDesktop
يتم استخدام طريقة getParent لإرجاع الدليل الأصل للملف الحالي. سواء كنت ملفًا عاديًا أو دليلًا ، سيكون لديك في النهاية دليل الوالدين (بالطبع ، الملفات المؤقتة التي تم إنشاؤها بواسطة الجهاز الظاهري ليست بالطبع).
السلسلة العامة getParent () {int index = path.lastindexof (separatorchar) ؛ if (index <precixLength) {if ((prefixLength> 0) && (path.length ()> prefixlength)) return path.substring (0 ، prefixLength) ؛ العودة لاغية. } return path.substring (0 ، index) ؛}تطبيق الطريقة بسيط للغاية ، لذلك لن أخوض في التفاصيل.
يمكن أن تقوم طريقة getPath بإرجاع اسم الملف الكامل لمثيل الملف الحالي:
السلسلة العامة getPath () {return path ؛}فيما يلي بعض العمليات ذات الصلة المتعلقة بالأدلة ، والتي هي بسيطة نسبيا للتنفيذ. هذه قائمة موجزة:
هنا نحتاج إلى شرح بعض شرح GetCanonicalPath ، ما هو المسار القياسي ، وهل هناك أي فرق بين المسار المطلق؟
بشكل عام ، "../" يعني الدليل السابق للدليل حيث يوجد الملف المصدر ، "../../" يعني الدليل السابق للدليل حيث يوجد الملف المصدر ، وهكذا. لا تقوم طريقة getabsolutepath بعمليات التحويل هذه ، في حين أن طريقة getCanonicalPath تتعرف على هذه الأحرف الخاصة وتأخذ الدلالات المناسبة.
على سبيل المثال:
ملف الملف = ملف جديد ("..// A.TXT") ؛ System.out.println (file.getabsolutepath ()) ؛ system.out.println (file.getCanonicalPath ()) ؛نتيجة الإخراج:
C:/المستخدمين/Yanga/Desktop/Java/Workspace2017/TestFile /../ A.TXT
C: /users/yanga/desktop/java/workspace2017/a.txt
السابق سيستخدم "../A.TXT" كجزء من اسم مسار الملف ، بينما يمكن أن يتعرف الأخير على أن "../A.TXT" تعني أن "A.TXT" يقع في الدليل العلوي للدليل الحالي. هذا هو الفرق الأكبر بين الاثنين ، مناسب للحالات المختلفة.
الحصول على معلومات السمة من الملف
إن تشغيل هذا الجزء من الملف بسيط للغاية في الواقع ، إنه ليس أكثر من بعض الأسئلة حول أذونات الملفات ، سواء كان قابلاً للقراءة ، سواء كان قابلاً للكتابة ، سواء كان ملفًا مخفيًا ، وما إلى ذلك. دعنا نلقي نظرة على هذه الطرق بالتفصيل:
تجدر الإشارة إلى أن طريقة الطول يمكن أن تُرجع بشكل صحيح العدد الإجمالي للبايت للملف لملف نقي ، ولكن بالنسبة للدليل ، ستكون قيمة الإرجاع قيمة "غير محددة" ، وهي ليست إجمالي عدد بايت جميع الملفات في الدليل ولا صفر ، ولكنها مجرد قيمة غير محددة ، والتي ليس لها معنى.
تشغيل الملف
إن تشغيل الملفات ليس أكثر من "الإضافة والحذف والتعديل والبحث". دعونا نلقي نظرة معا.
بالطبع ، عند التعامل مع عمليات إنشاء وحذف جديدة بسيطة أعلاه ، توفر فئة الملف أيضًا عمليات "الاستعلام" المزعومة ، والتي نحتاج إلى تعلمها بعناية. على سبيل المثال:
السلسلة العامة [] list () {SecurityManager Security = system.getSecurityManager () ؛ if (security! = null) {security.CheckRead (path) ؛ } if (isInvalId ()) {return null ؛ } return fs.list (هذا) ؛}ستقوم هذه الطريقة باسترداد جميع الأسماء البسيطة لـ "الملفات النقية" و "الدليل" في الدليل الذي يمثله المثيل الحالي. على سبيل المثال:
ملف الملف = ملف جديد ("c: // user // yanga // desktop") ؛ string [] list = file.list () ؛ لـ (String Str: List) {system.out.println (str) ؛}ستقوم نتيجة إخراج البرنامج بطباعة الأسماء البسيطة لجميع الملفات الموجودة في دليل سطح مكتب الكمبيوتر الخاص بي ، لذلك لن أعرضها لك.
شيء واحد يجب ملاحظته هو أنه إذا كان مثيل الملف الخاص بنا لا يتوافق مع دليل ولكن ملف عادي ، فسيتم إرجاع القائمة NULL.
بعد ذلك ، دعونا نلقي نظرة على طريقة لاسترداد ملفات الدليل:
قائمة السلسلة العامة [] (FilenameFilter Filter) {String Names [] = list () ؛ if ((names == null) || (filter == null)) {return names ؛ } list <string> v = new ArrayList <> () ؛ لـ (int i = 0 ؛ i <names.length ؛ i ++) {if (filter.accept (هذا ، الأسماء [i])) {v.add (names [i]) ؛ }} return v.toarray (سلسلة جديدة [v.size ()]) ؛}هذه الطريقة هي في الواقع نسخة محمولة من القائمة ، والتي تتيح لك المرور في مرشح لتصفية الملفات والأدلة التي نحتاجها فقط عند البحث عن الدلائل.
لكن تعريف واجهة FilenameFilter بسيط للغاية:
الواجهة العامة FilenameFilter {boolean قبول (ملف ، اسم السلسلة) ؛}تحتاج فقط إلى تجاوز طريقة قبول هذه. في كل مرة تحصل فيها قائمة Loop على ملف أو دليل ، ستحاول استدعاء طريقة التصفية هذه أولاً. إذا قمت بتمرير التصفية ، فسيتم إضافة الاسم البسيط للملف الحالي إلى مجموعة الإرجاع.
لذلك ، تحدد إعادة كتابة طريقة قبول هذه الملفات التي يمكن أن تمرر التصفية وأيها لا يمكن. دعونا نلقي نظرة على مثال:
الملفات الموجودة في مجلد الاختبار على سطح المكتب هي كما يلي:
ملف الملف = ملف جديد ("C: // user // yanga // desktop // test") ؛ string [] list = file.list (new FilenameFilter () {Override Public Boolean Accept (file dir ، اسم السلسلة) {// كائن الملف الحالي الممثل بواسطة dir // الاسم هو الاسم البسيط لعنصر الملف الذي تم عبوره حاليًا if (! لـ (string str: list) {system.out.println (str) ؛ }هنا ، نستخدم فئة داخلية مجهولة لإنشاء مثيل فئة فرعية لـ FilenameFilter ، ثم تنفيذ طريقة قبولها. التنفيذ المحدد بسيط للغاية ، حيث يقوم بتصفية جميع الدلائل وإخراج الأسماء البسيطة لجميع الملفات العادية.
نتيجة الإخراج النهائي هي على النحو التالي:
3.TXT
4.txt
بالطبع ، هناك أيضًا طريقتان "متحورتان" في فئة الملفات ، مثل:
لم يعودوا يعيدون الأسماء البسيطة لـ "الملفات النقية" و "الدلائل" في الدليل الهدف ، لكنهم إرجاع كائن الملف المقابل. في الواقع ، لا شيء. يمكن للدليل المستهدف + اسم بسيط إنشاء مثيلات الملف هذه.
لذلك ، في الأساس ، لن تعبر طريقة القائمة جميع الملفات في الدليل المستهدف ، أي أن الملفات الموجودة في الدليل الفرعي للدليل المستهدف لن يتم الوصول إليها وتجاوزها.
لذلك يجب أن تفكر في كيفية اجتياز جميع الملفات في الدليل المستهدف ، بما في ذلك الملفات العميقة في الدلائل الفرعية من المستوى الأول. سيتم إعطاء الإجابة في نهاية المقالة.
ترتبط الطريقتان التاليتان بإنشاء المجلدات:
يعتمد كلاهما على مثيل الملف الحالي لإنشاء مجلدات. فيما يتعلق باختلافاتهم ، دعونا نلقي نظرة أولاً على قطعة من الكود:
ملف الملف = ملف جديد ("C: // user // yanga // desktop // test2") ؛ system.out.println (file.mkdir ()) ؛ file file2 = new file ("c: // users // yanga // desktop // test3 // hello")من بينها ، لا يوجد Test2 و Test3 حتى يتم تنفيذ البرنامج.
نتيجة الإخراج على النحو التالي:
حقيقي
خطأ شنيع
لماذا فشل الأخير في الإنشاء؟
ويرجع ذلك إلى حقيقة أن طريقة MKDIR يمكن أن تنشئ مجلد واحد فقط في وقت واحد ، مما سيؤدي إلى فشل الخلق إذا كان الوالد أو الدليل الأعلى للدليل المحدد موجودًا دليلًا غير مخلوق.
يتم استخدام طريقة MKDIRS لحل هذا الموقف. سيقوم بإنشاء جميع الدلائل غير المنشأة على المسار المستهدف ، راجع الكود:
file file3 = ملف جديد ("c: // users // yanga // desktop // test3 // hello // 231") ؛ system.out.println (file3.mkdirs ()) ؛حتى إذا لم يكن مجلد Test3 الخاص بنا غير موجود ، بعد تشغيل البرنامج ، سيتم إنشاء مجلدات Three Test3 و Hello و 231.
بالإضافة إلى ذلك ، يحتوي الملف أيضًا على طريقة لإنشاء ملفات مؤقتة. ما يسمى الملفات المؤقتة هي: أنها موجودة أثناء وقت التشغيل ويتم تدميرها عند إغلاق الجهاز الظاهري. يمكنك دراستها بنفسك. إنه بسيط نسبيًا للاستخدام ، لذلك لن أخوض في التفاصيل هنا.
في هذه المرحلة ، تعلمنا تقريبًا عن ملف نوع الملف. أعتقد أن الجميع سيشعرون بأن تصميم تمثيل الملفات والأدلة الخالصة باستخدام نفس النوع يبدو مربكًا بعض الشيء وغير معقول. أعلم أن JDK1.7 Sun أطلقت ملفات ومسار لفصل الملفات والأدلة ، وسنتعلم المزيد عنها في المقالات المستقبلية.
يتم تخزين جميع الرموز والصور والملفات في المقالة في السحابة على جيثب:
(https://github.com/singleyam/overview_java)
يمكنك أيضًا اختيار التنزيل محليًا.
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.