1. ترميز الوثيقة
package com.study.io ؛/*** اختبار ملف ترميز*/فئة عامة encodedemo {/*** param args*athrows استثناء*/public static void main (string [] args) recors stispion {string s = "study abc well" ؛ byte [] bytes1 = s.getbytes ( المشروع (هنا هو UTF-8) لـ (byte b: bytes1) {// تحويل البايتات (إلى int) لعرض system.out.print (integer.toHexString (b & 0xff)+" باللغة الإنجليزية */byte [] bytes2 = s.getBytes ("utf-8") ؛ // سيكون هناك استثناء معروض هنا ، لذلك نرمي هذا الاستثناء (byte b: bytes2) {system.out.print (integer.tohexstring (b & 0xff)+") */byte [] bytes3 = s.getBytes ("gbk") ؛ // سيكون هناك استثناء معروض هنا ، لذلك سنقوم بإلقاء هذا الاستثناء (byte b: bytes3) {system.out.print (integer.toHexString (b & 0xff)+") Bytes*/byte [] bytes4 = S.GetBytes ("UTF-16BE") ؛ // سيكون هناك استثناء معروض هنا ، لذلك سنرمي هذا الاستثناء (BYTE B: BYTES4) {system.out.print (integer.toexstring (b & 0xff)+") ؛ لتحويل تسلسل البايت إلى سلسلة ، تحتاج أيضًا إلى استخدام طريقة الترميز هذه ، وإلا سيظهر الرمز المشوهة*/string str1 = new string (bytes4) ؛ // في هذا الوقت ، سيتم استخدام الترميز الافتراضي للمشروع لتحويلها ، وقد يظهر رمز مشوهة system.out.println (str1) ؛ سلسلة (bytes4 ، "utf-16be") ؛ system.out.println (str2) ؛}} تحليل:
* 1. شرح "& 0xff":
* 0xff يمثل سداسي عشري (عشري هو 255) ، ويتم التعبير عنه على أنه ثنائي ، وهو "111111111".
* ثم تمثل الحرف عدد البتات (إرجاع 1 عندما يكون الشيء نفسه 1 ، وإلا إرجاع 0)
* 2. بايت بايت وتحويل نوع int:
* integer.tohexstring (b & 0xff) هنا ، يتم تنفيذ B و 0xff من نوع البايت لأول مرة ، ثم Integer.ToHexString يحصل على السلسلة السداسية
* يمكن أن نرى أن نتيجة B & 0xFF لا تزال INT ، فلماذا تحتاج إلى إجراء عملية مع 0xFF؟ INTEGER.TOHEXSTRING (B) ؛ ، لا يمكن إجبار البايت على تحويلها؟ الجواب غير ممكن.
* السبب هو: 1. حجم البتات 8 بت وحجم int هو 32 بت ؛ 2. جافا نموذجين مكملين
* معلمة integer.ToHexString هي int. إذا لم يتم تنفيذ & 0xFF ، فحينئذٍ يتم تحويل البايت إلى int ، نظرًا لأن INT هو 32 بت والبايت فقط 8 بتات ، سيتم ملؤها في هذا الوقت. . . . . .
* لذلك ، عندما يشارك بايت و 0xFF ، سيتم تحويل البايت إلى عملية جراحية تجميلية أولاً ، بحيث يتم دائمًا مسح النتيجة المرتفعة في النتيجة 0 ، وبالتالي فإن النتيجة هي دائمًا ما نريد.
* 3. UTF-8 الترميز: الصينيين يحتلون 3 بايت واللغة الإنجليزية يحتل 1 بايت
* GBK تشفير: الصينية تشغل 2 بايت والإنجليزية تشغل 1 بايت
* يستخدم Java تشفير بايت مزدوج (أي حرف واحد في Java يمثل بايتتين) وهو ترميز UTF-16BE. الصينية تشغل 2 بايت ، والإنجليزية تشغل 2 بايت
*
* 4. عندما يكون تسلسل البايت الخاص بك هو ترميز معين ، إذا كنت تريد تحويل تسلسل البايت إلى سلسلة ، فأنت بحاجة أيضًا إلى استخدام طريقة الترميز هذه ، وإلا ستحدث الرمز المشوهة.
* 5. الملفات النصية هي تسلسل بايت. يمكن أن يكون أي تسلسل مشفر للبايت.
* إذا قمت بإنشاء ملف نصي مباشرة على جهاز صيني ، فإن الملف يتعرف فقط على ترميز ANSI (على سبيل المثال ، قم بإنشاء ملف نصي مباشرة على الكمبيوتر)
2. استخدام فئة الملفات
package com.study يتم استخدام فئة الملفات فقط لتمثيل معلومات ملف أو دليل (الاسم ، الحجم ، إلخ) ولا يمكن استخدامه للوصول إلى محتوى الملف. *//public static void main (string [] args) {file file = ملف جديد ("d: // 111") ؛ // عند إنشاء كائن ملف ، تحتاج إلى استخدام مائل مزدوج لتحديد الدليل ، لأن "/" هو حرف الهروب/*filedator في منتصف المدعى. ملف ("d:"+file.separator) ؛ // system.out.println (file.exists ()) ؛ // موجود () يحدد ما إذا كان هناك ملف أو مجلد موجود إذا (! file.exist الدليل} آخر {file.delete () ؛ // حذف ملف أو مجلد} // اكتشف ما إذا كان دليلًا iSdirectory ، وإرجاع صحيح إذا كان دليلًا ، فالرويل falsystem.out.println (file.isdirectory ()) ؛ file file2 = ملف جديد ("d: // 222" ، "123.txt") ؛ // common API: System.out.println (file) ؛ // اطبع محتوى file.toString () system.out.println (file.getabsolutepath ()) ؛ // الحصول على system.ut.println (file.get.get ()) ؛ System.out.println (file2.getName ()) ؛ system.out.println (file.getParent ()) ؛ // الحصول على الأصل المطلق المسار system.out.println (file2.getParentFile (). getabsolutepath ()) ؛}} نتائج التشغيل:
يوضح:
تمثل فئة Java.io.io.file ملفًا أو دليلًا
يتم استخدام فئة الملفات فقط لتمثيل المعلومات (الاسم ، الحجم ، إلخ) لملف أو دليل ولا يمكن استخدامها للوصول إلى محتوى الملف.
واجهات برمجة التطبيقات الشائعة الاستخدام:
1. إنشاء كائن ملف: ملف ملف = ملف جديد (مسار السلسلة) ؛ ملاحظة: file.seperater () ؛ احصل على محدد النظام ، مثل: "/".
2. ما إذا كانت ملفات boolean.exists () ؛ موجود.
3.file.mkdir () ؛ أو file.mkdirs () ؛ إنشاء دليل أو دليل متعدد المستويات.
4.file.isdirectory () يحدد ما إذا كان دليلًا
File.isfile () يحدد ما إذا كان ملفًا.
5.file.delete () ؛ حذف الملف أو الدليل.
6.file.createNewFile () ؛ إنشاء ملف جديد.
7.file.getName () يحصل على اسم الملف أو الدليل المطلق.
8.file.getabsolutepath () يحصل على المسار المطلق.
9.file.getParent () ؛ احصل على الوالد المطلق.
1. اجتياز الدليل
package com.study.io ؛ استيراد java.io.file ؛ استيراد java.io.ioException ؛/*** فئة أداة الملف*يسرد العمليات المشتركة لفئة الملفات ، مثل: التصفية ، اجتياز ، إلخ. ListDirectory (ملف dir) يلقي ioException {if (! dir.exists ()) {// موجودة () يتم استخدام طريقة لتحديد ما إذا كان ملف أو دليلًا قد رمي غير alustalalargumentexception ("dir:"+dir+"غير موجود") ؛ alfortleargumentException (dir+"ليس دليلًا") ؛}/*string [] أسماء الملفات = dir.list () ؛ // list () يتم استخدام طريقة لإدراج الدليل الفرعي والملفات في الدليل الحالي (هو مباشرة اسم المخرج الفرعي) ولا يحتوي {system.out.println (string) ؛}*/// إذا كنت ترغب في اجتياز المحتويات في الدليل الفرعي ، فأنت بحاجة إلى إنشاء كائن الملف للعمليات العودية. يوفر الملف apifile الذي يقوم مباشرة بإرجاع كائن الملف. listfiles = dir.listfiles () ؛ // إرجاع تجريد من الدليل الفرعي المباشر (ملف) if (listfiles! = null && listfiles.length> 0) {for (file file: listfiles) {/*sestem.out.println(file) ؛*/if(file.isdirectory penredery)) enderenured ender listDirectory (ملف) ؛} آخر {system.out.println (file) ؛}}}}}} فئة الاختبار:
الفئة العامة fileUtilstest {public static void main (string [] args) يلقي ioException {fileUtils.ListDirectory (ملف جديد ("d: // iostudy")) ؛}} نتائج التشغيل:
3. استخدام فئة عشوائية
RandomAccessFile: توفر Java الوصول إلى محتويات الملفات ، والتي يمكن استخدامها لقراءة الملفات أو كتابة الملفات.
يدعم RandomAccessFile الوصول العشوائي إلى الملفات ويمكنه الوصول إلى أي مكان للملف.
لاحظ نموذج ملف Java:
نتائج التشغيل:
1
12
[65 ، 66 ، 127 ، -1 ، -1 ، -1 ، 127 ، -1 ، -1 ، -1 ، -42 ، -48]
7F
وما يليها
وما يليها
وما يليها
7F
وما يليها
وما يليها
وما يليها
D6
D0
4. دفق البايت (FileInputStream ، FileOutputStream)
يمكن تقسيم تدفقات IO إلى تدفقات الإدخال وتدفقات الإخراج.
هنا يمكن تقسيمها إلى تيار البايت ودفق الأحرف.
مثال رمز:
package com.study من قراءة البيانات على الملفات* fileOutputStream-> تنفيذ طريقة كتابة بيانات البايت إلى ملفات* ❤data الإدخال والإخراج دفق:* dataOtutputStream/datainputStream: تمديد وظيفة "دفق" ، يمكنك قراءة int ، والحروف الطويلة ، والأنواع الأخرى من البيانات أكثر ، والأنواع الأخرى ، والأنواع الأخرى* trhetream trupe ()) BufferEdInputStream & BufferedOutputStream* توفر هذه البتات من فئة الدفق IO العمليات مع المخازن المؤقتة. بشكل عام ، عند فتح ملف للكتابة أو القراءة ، سيتم إضافة التخزين المؤقت. يعمل وضع الدفق هذا على تحسين أداء IO* على سبيل المثال: إن وضع الإدخال في ملف من أحد التطبيقات يعادل سكب أسطوانة من الماء في أسطوانة أخرى: fileOtputTream ---> الكتابة () طريقة مكافئة "نقل" "نقل" المياه فوق ". قم بالتجول في الدلو أولاً (على سبيل المثال ، منطقة المخزن المؤقت) ، ثم سكبها في أسطوانة أخرى من الدلو. تم تحسين الأداء*/الفئة العامة IOUTIL {/*** اقرأ محتوى الملف المحدد وإخراجه إلى وحدة التحكم في السداسي عشر* وكل 10 BYTE LINE CLOSS* PARAM FILENAM في = جديد fileInputStream (اسم الملف) ؛ int b ؛ int i = 1 ؛ بينما ((b = in.read ())! =-1) {/* 0xff يتم استبداله بنظام من رقمين ، مما يعني 8 1s. وبهذه الطريقة ، يتم أخذ 8 بتات من الشخصية المنخفضة بالفعل. * OXF هو 15. سيتم تحويل الأرقام التي تقل عن 15 إلى رقم سداسي عشري. * يأمل الكود الخاص بك أن يكون رقمين سداسي عشري ثابت ، لذلك عند إنشاء واحد فقط ، تحتاج إلى إضافة 0*/إذا (b <= 0xf) {// integer.toHexString (b) قبل أن يتم استكمال رقم الوحدة باستخدام 0system.out.print ("0") ؛ system.out.print (integer.toHexString (b)+"") ؛ إذا (i ++ ٪ 10 == 0) {system.out.println () ؛}} in.close () ؛ ioException {fileInputStream in = new FileInputStream (اسم الملف) ؛ بايت [] buf = new byte [8* 1024] ؛/* batch bytes القراءة من in ووضعها في صفيف بايت من buf ،* ابدأ من الوضع 0 ، ووضعها على الأكثر. in.Read (buf ، 0 ، buf.length) ؛ // اقرأ في وقت واحد ، مما يشير إلى أن صفيف البايت كبير بما يكفي in j = 1 ؛ لـ (int i = 0 ؛ i <bytes ؛ i ++) {system.out.print (integer.toHexString (buf [i] & 0xff)+") ؛ if (j ++ ٪ 10 == 0) {system.out.println () ؛}}*/int bytes = 0 ؛ int j = 1 ؛ in.Read (buf ، 0 ، buf.length))! =-1) {for (int i = 0 ؛ i <bytes ؛ i ++) {system.out.print (integer.toHexString (buf [i] & 0xff)+") & 0xff*/if (j ++ ٪ 10 == 0) {system.out.println () ؛}}} in.close () (! srcfile.exists ()) {رمي جديد alfortalargumentException ("الملف:" + srcfile + "غير موجود") ؛} if (! FileOutputStream (DestFile) ؛ // عندما لا يكون الملف موجودًا ، سيتم إنشاءه مباشرة ؛ إذا كان موجودًا ، فقم بحذفه وقم بإنشاء byte [] buf = new byte [8 * 1024] ؛ // batch read and write int b ؛ بينما ((b = in.read (buf ، 0 ، buf.length))! = -1) {//read(buf،0،buf.length) القراءة مع المعلمات إرجاع الطول الإجمالي للبايت ؛ عندما يتم قراءة الجميع -1 ؛ out.write (buf ، 0 ، b) ؛ out.flush () ؛ // من الأفضل إضافة} in.close () ؛ out.close () ioException {if (! srcfile.exists ()) {رمي new alficalArgumentException ("ملف:"+srcfile+"غير موجود") ؛} if (! srcfile.isfile ()) FileInputStream (srcfile)) بايت ، دون التخزين المؤقت لنسخ الملف* param srcfile* param destfile* throws ioexception*/public static void copyfilebybyte (file srcfile ، file destfile) يلقي ioException {if (! srcfile.exists () موجود ") ؛} if (! srcfile.isfile ()) {رمي new alficalArgumentException (srcfile+" ليس ملفًا ") ؛} fileInputStream في = new FileInputStream (srcfile) ؛ fileOutputStream out = new fileOutStream (destfile) ؛ المعلمات إرجاع محتوى القراءة بايت ؛ عندما يتم إرجاع جميع القراءات كلها -1 ؛ out.write (c) ؛ out.flush () ؛} in.close () ؛ out.close () ؛ out.close () ؛}} فئة الاختبار:
package com.study {E.PrintStackTrace () ؛}}@testpublic void testprinthexbybytearray () {try {long start = system.currenttimeMillis () ؛ // الفارق الزمني بين الوقت الحالي والوسط في 1 يناير 1970 (تم قياسه بالميليسيكوند) //ioutil.printhexbybytearray("e://javaio//fileutils.java") ؛//ioutil.printhex("e://javaio//1.mp3")؛ioutil.printhbyteartearray e end://javaio/1.mp3") = System.CurrentTimEmillis () ؛ system.out.println (end - start) ؛} catch (ioException e) {E.PrintStackTrace () ؛ ملف ("d: //javaio//1copy.txt")) ؛} catch (ioException e) {E.PrintStackTrace () ؛ ملف ("e: //javaio//1.mp3") ، ملف جديد ("e: //javaio//2.mp3") ؛*///أكثر من 20،000 مللي ثانية/*ioutil.copyfilebuffer (ملف جديد ("e: //javaio/1.mp3") ملف ("e: //javaio//3.mp3")) ؛ // أكثر من 10000 مللي ثانية*/ioutil.copyfile (ملف جديد ("e: //javaio//1.mp3") ، ملف جديد ("e: //javaio//4p3") ؛ START) ؛} catch (ioException e) {E.PrintStackTrace () ؛}}} 5. دفق الشخصية
package com.study FileInputStream ("e: //javaio//utf8.txt") ؛ inputStreamReader isr = new inputStreamReader (in ، "utf-8") ؛ // ترميز المشروع الافتراضي. عند التشغيل ، تحتاج إلى كتابة تنسيق الترميز للملف نفسه. fileOutputStream Out = جديد fileOutputStream ("e: //javaio//Utf81.txt") ؛ outputStreamWriter osw = new OutputStreamWriter (Out ، "utf-8") ؛/*int c ؛ char [8*1024] ؛ int c ؛/*read batch ، ضع صفيف الأحرف العازلة ، ابدأ من الموضع 0 ، ووضع المخزن المؤقت على الأكثر. عدد الأحرف التي تم إرجاعها هو عدد أحرف القراءة*/بينما ((c = isr.read (buffer ، 0 ، buffer.length))! =-1) {string s = new String (Buffer ، 0 ، c) ؛ system.out.print (s) ؛ osw.write (buffer ، 0 ، c) ؛ osw.flush () ؛} isr.close () ؛ osw.close () ؛ osw.close () ؛}}قراءة الملف ودفق دفق الأحرف (fileReader/filewriter)
تصفية تدفقات الأحرف
6. التسلسل وفرس الأشياء
مثال:
يلاحظ: