1.ما هو الإدخال والإخراج
تشير عمليات الإدخال/الإخراج في Java بشكل أساسي إلى استخدام Java لعمليات الإدخال والإخراج. تعتمد جميع آليات الإدخال/الإخراج في Java على تدفقات البيانات للإدخال والإخراج تمثل التسلسل المتدفق للأحرف أو بيانات البايت. توفر تدفقات الإدخال/الإخراج في Java طرقًا قياسية لقراءة البيانات وكتابتها. أي كائن في Java يمثل مصدر بيانات سيوفر طرقًا لقراءة وكتابة بياناته في دفق البيانات.
Java.io هي الحزمة الرئيسية لمعظم فئات الإدخال/الإخراج الموجهة نحو تدفق البيانات. بالإضافة إلى ذلك، توفر Java أيضًا دعمًا لنقل الكتلة، ويتم استخدام كتلة IO في المكتبة الأساسية java.nio.
تتمثل ميزة دفق الإدخال والإخراج في أنه بسيط وسهل الاستخدام، ولكن عيبه هو أنه أقل كفاءة. يعد Block IO فعالاً للغاية، لكن البرمجة أكثر تعقيدًا.
نموذج جافا IO:
يعد تصميم نموذج IO الخاص بـ Java ممتازًا للغاية، فهو يستخدم نمط الديكور لتقسيم التدفقات حسب الوظيفة. يمكنك تجميع هذه التدفقات ديناميكيًا للحصول على الوظائف التي تحتاجها. على سبيل المثال، إذا كنت بحاجة إلى دفق إدخال ملف مخزن مؤقتًا، فيجب عليك استخدام مزيج من FileInputStream وBufferedInputStream.
2. المفاهيم الأساسية لتدفق البيانات
تدفق البيانات عبارة عن مجموعة من البيانات المستمرة، تمامًا مثل تدفق الماء في أنبوب الماء، يتم توفير الماء شيئًا فشيئًا في أحد طرفي أنبوب الماء، وما يُرى في الطرف الآخر من أنبوب الماء هو تدفق مستمر. من الماء. يمكن لبرنامج كتابة البيانات كتابة البيانات في مقطع خط أنابيب تدفق البيانات حسب المقطع، وستشكل شرائح البيانات هذه دفق بيانات طويلًا بالتسلسل. بالنسبة لبرامج قراءة البيانات، لا يمكن رؤية تجزئة دفق البيانات أثناء الكتابة، ويمكن قراءة البيانات بأي طول في كل مرة، ولكن يمكن قراءة البيانات السابقة فقط، ثم يمكن قراءة البيانات اللاحقة. بغض النظر عما إذا كانت البيانات مكتوبة على دفعات متعددة أو مكتوبة ككل مرة واحدة، فإن التأثير عند القراءة هو نفسه تمامًا.
"الدفق هو مصدر أو وجهة البيانات المخزنة على القرص أو أي جهاز طرفي آخر."
هناك ثلاث طرق لتخزين البيانات على جهاز الكمبيوتر، إحداهما للتخزين الخارجي، والأخرى للذاكرة، والأخرى للتخزين المؤقت. على سبيل المثال، القرص الصلب، القرص المغناطيسي، محرك أقراص فلاش USB، وما إلى ذلك على الكمبيوتر كلها وحدات تخزين خارجية. توجد شريحة ذاكرة على الكمبيوتر، وذاكرة التخزين المؤقت موجودة في وحدة المعالجة المركزية. تتمتع وحدة التخزين الخارجية بأكبر سعة تخزين، تليها الذاكرة، وأخيرًا ذاكرة التخزين المؤقت، ومع ذلك، فإن قراءة البيانات من وحدة التخزين الخارجية هي الأبطأ، تليها الذاكرة، وذاكرة التخزين المؤقت هي الأسرع. فيما يلي ملخص لقراءة البيانات من الذاكرة الخارجية إلى الذاكرة وكتابة البيانات من الذاكرة إلى الذاكرة الخارجية. لفهم الذاكرة والتخزين الخارجي، يمكننا ببساطة فهمها كحاوية، أي أن وحدة التخزين الخارجية عبارة عن حاوية، والذاكرة عبارة عن حاوية أخرى. فكيف يمكن قراءة البيانات الموجودة في حاوية التخزين الخارجية في حاوية الذاكرة وكيفية حفظ البيانات الموجودة في حاوية الذاكرة إلى وحدة تخزين خارجية؟
في مكتبة فئة Java، يكون الجزء IO كبيرًا جدًا لأنه يغطي مجموعة واسعة من المجالات:
الإدخال والإخراج القياسي، وعمليات الملفات، وتدفقات البيانات على الشبكة، وتدفقات السلسلة، وتدفقات الكائنات، وتدفقات الملفات المضغوطة، وما إلى ذلك. في Java، يُطلق على تجريد الإدخال والإخراج اسم الدفق، وهو يشبه أنبوب الماء الذي يربط حاويتين. تسمى قراءة البيانات من الذاكرة الخارجية إلى الذاكرة دفق الإدخال، وتسمى كتابة البيانات من الذاكرة إلى الذاكرة الخارجية دفق الإخراج.
يعد الدفق مفهومًا حيويًا للغاية. عندما يحتاج البرنامج إلى قراءة البيانات، فإنه سيفتح دفقًا لمصدر البيانات هذا، ويمكن أن يكون ملفًا أو ذاكرة أو اتصالاً بالشبكة. وبالمثل، عندما يحتاج البرنامج إلى كتابة البيانات، فإنه سيفتح دفقًا إلى الوجهة.
المفاهيم الأساسية التي تم تلخيصها هي كما يلي:
تسلسل مرتب من البايتات بنقطة بداية ونقطة نهاية. بما في ذلك تيار الإدخال ودفق الإخراج.
2) تيار الإدخال:يقرأ البرنامج مصدر البيانات من دفق الإدخال. تشمل مصادر البيانات العالم الخارجي (لوحة المفاتيح، الملفات، الشبكة...) وهو قناة الاتصال التي تقرأ مصدر البيانات داخل البرنامج
الغرض من استخدام تدفقات البيانات هو جعل الإخراج والإدخال مستقلين عن الجهاز.
لا يهتم تدفق الإدخال بالجهاز الذي يأتي منه مصدر البيانات (لوحة المفاتيح، الملف، الشبكة)
لا يهتم تدفق الإخراج بالجهاز الذي سيتم توجيه البيانات إليه (لوحة المفاتيح، الملف، الشبكة)
3. الإدخال/الإخراج القياسي
يمكن لبرامج Java تبادل معلومات موجزة مع العالم الخارجي من خلال معلمات سطر الأوامر، وفي الوقت نفسه، تنص أيضًا على كيفية تبادل المعلومات مع أجهزة الإدخال والإخراج القياسية، مثل لوحات المفاتيح والشاشات. من خلال الملفات، يمكن تبادل المعلومات في أي نموذج بيانات مع العالم الخارجي.
1. معلمات سطر الأوامرنتائج التشغيل:
الحجج [0] هي <Java>
الحجج [1] هي <C>
الحجج [2] هي <VB>
دفق البيانات القياسي الذي يأتي مع نظام جافا: java.lang.System:
يلاحظ:
(1) لا يمكن لفئة النظام إنشاء كائنات ويمكنها فقط استخدام أعضائها الثلاثة الثابتين مباشرةً.
(2) عند تنفيذ الطريقة الرئيسية، يتم إنشاء الكائنات الثلاثة المذكورة أعلاه تلقائيًا.
1) تيار الإخراج القياسي System.out
يقوم System.out بإخراج البيانات إلى جهاز الإخراج القياسي ، ونوع بياناته هو PrintStream. طريقة:
2) دفق الإدخال القياسي System.in
يقرأ System.in بيانات جهاز الإدخال القياسي (يحصل على البيانات من الإدخال القياسي، عادةً لوحة المفاتيح)، ونوع البيانات الخاص به هو InputStream. طريقة:
3) تيار الخطأ القياسي
يُخرج System.err خطأً قياسيًا ، ونوع البيانات الخاص به هو PrintStream. يرجى الرجوع إلى واجهة برمجة التطبيقات للحصول على تعليمات مفصلة.
يستدعي الإخراج القياسي أسلوب println من خلال System.out لإخراج المعلمات ولف أسطر جديدة، بينما يقوم أسلوب الطباعة بإخراج المعلمات ولكنه لا يغلف أسطرًا جديدة. تنفذ طريقة println أو print طرقًا متعددة لإخراج أنواع البيانات الأساسية من خلال التحميل الزائد، بما في ذلك أنواع معلمات الإخراج مثل boolean وchar وint وlong وfloat وdouble. في الوقت نفسه، يتم أيضًا تحميل الأساليب التي تكون أنواع معلمات الإخراج الخاصة بها هي char[] وString وObject بشكل زائد. من بينها، ستستدعي طريقتا print(Object) وprintln(Object) طريقة toString لكائن المعلمة في وقت التشغيل.
الطبقة العامة ستانداردينبوتوتبوت {
public static void main(String args[]) {
سلسلة ق؛
// أنشئ قارئًا مؤقتًا لقراءة سطر البيانات سطرًا من لوحة المفاتيح
InputStreamReader ir = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(ir);
System.out.println("نظام يونكس: ctrl-d أو ctrl-c للخروج"
+ "/ نظام Windows: خروج ctrl-z");
يحاول {
// اقرأ سطرًا واحدًا من البيانات وأخرجه إلى الشاشة بشكل قياسي
s = in.readLine();
// إذا حدث خطأ في الإدخال/الإخراج أثناء تشغيل طريقة readLine()، فسيتم طرح IOException.
بينما (ق ! = فارغة) {
System.out.println("قراءة:" + s);
s = in.readLine();
}
// أغلق القارئ المخزن مؤقتًا
in. Close();
} Catch (IOException e) { // التقاط أي استثناءات للإدخال والإخراج.
printStackTrace();
}
}
}
4.java.IO البنية الهرمية
أهم الأشياء في حزمة Java.io بأكملها هي 5 فئات وواجهة. تشير الفئات الخمس إلى File وOutputStream وInputStream وWriter وReader؛ وتشير واجهة واحدة إلى Serializable. بمجرد إتقان عمليات الإدخال والإخراج الأساسية هذه، سيكون لديك فهم أولي لنظام الإدخال والإخراج في Java.
يتضمن Java I/O بشكل أساسي المستويات التالية، بما في ذلك ثلاثة أجزاء:
1. الجزء الرئيسي من الجزء المتدفق IO؛
2. يتضمن الجزء غير المتدفق بشكل أساسي بعض الفئات التي تساعد الجزء المتدفق، مثل: فئة الملف، وفئة RandomAccessFile، وفئة FileDescriptor؛
3. الفئات الأخرى - الفئات المتعلقة بالأمان في جزء قراءة الملف، مثل فئة SerializablePermission، وفئات نظام الملفات المرتبطة بنظام التشغيل المحلي، مثل فئة FileSystem، وفئة Win32FileSystem، وفئة WinNTFileSystem.
الفئات الرئيسية هي كما يلي:
1. الملف (خصائص الملف وإدارته): يستخدم لوصف معلومات الملفات أو الأدلة، مثل إنشاء أدلة جديدة، وتعديل أسماء الملفات، وحذف الملفات، وتحديد مسار الملف، وما إلى ذلك.
2. InputStream (عملية التنسيق الثنائي): فئة مجردة، عملية إدخال تعتمد على البايت، وهي الفئة الأصلية لجميع تدفقات الإدخال. يحدد الخصائص المشتركة التي تمتلكها جميع تدفقات الإدخال.
3. OutputStream (عملية التنسيق الثنائي): فئة مجردة. عمليات الإخراج المستندة إلى البايت. هي الفئة الأم لجميع تدفقات الإخراج. يحدد الخصائص المشتركة التي تمتلكها جميع تدفقات الإخراج.
تعتمد الأحرف في Java معيار Unicode. حرف واحد هو 16 بت، أي يتم تمثيل حرف واحد ببايتين. ولتحقيق هذه الغاية، تم تقديم تدفقات لمعالجة الأحرف في جافا.
4. القارئ (عملية تنسيق الملف): فئة مجردة، عملية إدخال تعتمد على الأحرف.
5. الكاتب (عملية تنسيق الملف): فئة مجردة، عملية إخراج تعتمد على الأحرف.
6. RandomAccessFile (تشغيل ملف عشوائي): يحتوي على وظائف غنية ويمكنه إجراء عمليات الوصول (الإدخال والإخراج) من أي مكان في الملف .
بنية دفق IO في Java هي كما يلي:
5. فئة الملفات غير المتدفقة--فئة الملف
}
الوصف: طرق فئة الملف:
(1) موجود () يختبر ما إذا كان الملف أو الدليل المحدد موجودًا على القرص
(2) يقوم mkdir() بإنشاء الدليل المحدد بواسطة كائن الملف (دليل الطبقة الواحدة)
(3) يقوم createNewFile() بإنشاء الملف المحدد بواسطة كائن الملف
(4) تقوم القائمة () بإرجاع جميع سلاسل أسماء الملفات الموجودة في الدليل
6. مكتبة فئة دفق Java.IO
تحتوي الحزمة java.io على كافة الفئات اللازمة لدفق الإدخال/الإخراج. هناك أربع فئات أساسية في حزمة java.io: فئات InputStream، وOutputStream، وReader، وWriter، والتي تتعامل مع تدفقات البايت وتدفقات الأحرف على التوالي:
دفق البيانات الأساسية الإدخال/الإخراج
الإدخال/الإخراج
دفق البايت
دفق الحرف
دفق الإدخال
دفق الإدخال
قارئ
تيار الإخراج
تيار الإخراج
الكاتب
يتم اشتقاق أشكال مختلفة أخرى من التدفقات في Java منها:
بدأ إصدار JDK1.4 في تقديم مكتبة فئة الإدخال/الإخراج الجديدة، الموجودة في حزمة java.nio. تستخدم مكتبة فئة الإدخال/الإخراج الجديدة القنوات والمخازن المؤقتة لتحسين كفاءة عمليات الإدخال/الإخراج.
في حزمة java.io، يمثل java.io.InputStream دفق إدخال البايت، ويمثل java.io.OutputStream دفق إخراج البايت، الموجود في المستوى الأعلى لحزمة java.io. كلا الفئتين عبارة عن فئتين مجردتين، مما يعني أنه لا يمكن إنشاء مثيل لهما ويجب تصنيفهما إلى فئات فرعية لتحقيق وظائف معينة.
1. تصنيف محدد لتدفقات IO1. التصنيف العام حسب نوع الإدخال/الإخراج:
1. الذاكرة 1) قراءة البيانات وكتابتها من/إلى مصفوفة الذاكرة: CharArrayReader، CharArrayWriter، ByteArrayInputStream، ByteArrayOutputStream
2) قراءة وكتابة البيانات من/إلى سلاسل الذاكرة StringReader، StringWriter، StringBufferInputStream
2. خط أنابيب الأنابيب ينفذ إدخال وإخراج خط الأنابيب (الاتصال بين العمليات): PipedReader، PipedWriter، PipedInputStream، PipedOutputStream
3. دفق الملف . قراءة وكتابة الملفات: FileReader، FileWriter، FileInputStream، FileOutputStream
4. إدخال وإخراج كائن ObjectSerialization : ObjectInputStream، ObjectOutputStream
5. يقرأ دفق بيانات DataConversion ويكتب وفقًا لأنواع البيانات الأساسية (البيانات التي تتم معالجتها هي أنواع Java الأساسية (مثل Boolean والبايتات والأعداد الصحيحة وأرقام الفاصلة العائمة)): DataInputStream وDataOutputStream
6. تتضمن الطباعة طرق طباعة ملائمة: PrintWriter وPrintStream
7. التخزين المؤقت للبيانات عند القراءة أو الكتابة لتقليل عدد الإدخال/الإخراج: BufferedReader، BufferedWriter، BufferedInputStream، BufferedOutputStream
8. تصفية تيار التصفية ، والتصفية عند قراءة البيانات أو كتابتها: FilterReader، FilterWriter، FilterInputStream، FilterOutputStream pass
9. يدمج التسلسل الإدخال ويربط تدفقات الإدخال المتعددة في دفق إدخال واحد: SequenceInputStream
10. يقوم العد بحساب الصفوف عند قراءة البيانات: LineNumberReader، LineNumberInputStream
11. يقوم Peeking Ahead بالقراءة المسبقة من خلال آلية التخزين المؤقت: PushbackReader وPushbackInputStream
12. يقوم التحويل بين البايتات والأحرف بتحويل دفق البايت إلى دفق أحرف وفقًا لمعايير تشفير/فك تشفير معينة، أو إجراء تحويل عكسي (الدفق إلى القارئ، فئة تحويل الكاتب): InputStreamReader، OutputStreamWriter
2. التصنيف حسب مصدر البيانات (الوجهة):
1. الملف: FileInputStream، FileOutputStream، FileReader، FileWriter
2. بايت []: ByteArrayInputStream، ByteArrayOutputStream
3.شار[]: CharArrayReader، CharArrayWriter
4. السلسلة: StringBufferInputStream، StringReader، StringWriter
5. تدفق بيانات الشبكة: InputStream، OutputStream، Reader، Writer
7. دفق البايت InputStream/OutputStream
InputStream هو دفق إدخال بايت وهو في حد ذاته فئة مجردة ويجب أن يعتمد على فئاته الفرعية لتنفيذ وظائف مختلفة. هذه الفئة المجردة هي الفئة الفائقة لجميع الفئات التي تمثل تدفقات إدخال البايت. التدفقات الموروثة من بيانات إدخال InputStream في البرنامج، ووحدة البيانات هي بايت (8 بت)؛
InputStream هي فئة تستخدم لإدخال بيانات البايت، لذلك توفر فئة InputStream ثلاث طرق قراءة مثقلة في فئة Inputstream:
(1) الملخص العام int read(): قراءة بايت من البيانات، والقيمة المرجعة هي قيمة من النوع int مع البتات العالية المملوءة بـ 0. إذا كانت القيمة المرجعة = -1، فهذا يعني أنه لم تتم قراءة أي بايت وانتهى عمل القراءة.
(2) قراءة int العامة (بايت b[ ]): قراءة بايتات b.length من البيانات ووضعها في المصفوفة b. القيمة المرجعة هي عدد البايتات المقروءة. يتم تنفيذ هذه الطريقة فعليًا عن طريق استدعاء الطريقة التالية (3) public int read(byte b[ ], int off, int len): قراءة ما يصل إلى len بايت من البيانات من دفق الإدخال وتخزينها بإزاحة off في ب مصفوفة.
(4) int public متاح (): يُرجع عدد البايتات التي يمكن قراءتها في دفق الإدخال. ملاحظة: إذا تم حظر الإدخال، فسيتم تعليق مؤشر الترابط الحالي إذا استدعى كائن InputStream هذه الطريقة، فسوف يُرجع 0 فقط. يجب استدعاء هذه الطريقة بواسطة كائن فئة فرعية يرث فئة InputStream لتكون مفيدة.
(5) تخطي طويل عام (طويل n): تجاهل n بايت في دفق الإدخال، وقيمة الإرجاع هي عدد البايتات التي تم تجاهلها بالفعل، وتخطي بعض البايتات للقراءة (6) إغلاق int العام (): نحن بعد الاستخدام، يجب إغلاق الدفق الذي فتحناه.
الفئات الفرعية الرئيسية:
1) يستخدم FileInputStream ملفًا باعتباره InputStream لتحقيق عملية قراءة الملف 2) ByteArrayInputStream: يستخدم مخزنًا مؤقتًا في الذاكرة باعتباره InputStream 3) StringBufferInputStream: يستخدم كائن سلسلة باعتباره InputStream
4) PipedInputStream: يطبق مفهوم الأنابيب، ويستخدم بشكل رئيسي في الخيوط 5) SequenceInputStream: يدمج InputStreams المتعددة في InputStream واحد
الفئات الفرعية الرئيسية:
1) ByteArrayOutputStream: تخزين المعلومات في مخزن مؤقت في الذاكرة
2) FileOutputStream: تخزين المعلومات في ملف
3) PipedOutputStream: يطبق مفهوم الأنابيب، ويستخدم بشكل رئيسي في الخيوط
4) SequenceOutputStream: دمج OutStreams متعددة في OutStream واحد
تحديد نهاية الدفق: عندما تكون القيمة المرجعة للطريقة read () هي -1؛ عندما تكون القيمة المرجعة لـ readLine () فارغة.
3. دفق إدخال الملف: فئة FileInputStreamيمكن لـ FileInputStream استخدام طريقة القراءة () لقراءة بايت واحد في كل مرة وإعادته كنوع int، أو استخدام طريقة القراءة () للقراءة في صفيف البايتات وفقًا لعدد العناصر الموجودة في صفيف البايت مصفوفة البايت. في عملية قراءة أو كتابة الملف بأكمله، عادةً ما يتم استخدام مصفوفة البايت هذه كمخزن مؤقت، لأن مصفوفة البايت هذه عادةً ما تلعب دورًا وسيطًا في تلقي البيانات.
كيفية الاستخدام(2)
FileInputStream in=newFileInputStream("d: /abc.txt");
مثال البرنامج:
عرض محتويات برنامج InputFromFile.java على الشاشة
ملف اختبار الطبقة العامة {
public static void main(String args[]) يلقي IOException {
يحاول{
FileInputStream rf=new FileInputStream("InputFromFile.java");
int n=512; بايت المخزن المؤقت[]=بايت جديد[n];
بينما((rf.read(buffer,0,n)!=-1)&&(n>0)){
System.out.println(new String(buffer) );
}
System.out.println();
rf. Close();
} التقاط (IOException IOE) {
System.out.println(IOe.toString());
}
}
}
يتم استخدام فئة FileOutputStream لمعالجة تدفقات البيانات التي تستخدم الملفات كوجهات إخراج البيانات؛ وهي سلسلة تمثل اسم الملف، والتي يمكن أن تكون أيضًا كائن File أو FileDescriptor.
هناك طريقتان لإنشاء كائن دفق الملف:
الطريقة 1:
الملف f=ملف جديد ("d:/myjava/write.txt")؛
FileOutputStream out= new FileOutputStream(f);
الطريقة 2:
FileOutputStream out=new FileOutputStream("d:/myjava/write.txt ");
الطريقة الثالثة: يأخذ المُنشئ كائن FileDescriptor() كمعلمة له.
FileDescriptor() fd=new FileDescriptor();
FileOutputStream f2=new FileOutputStream(fd);
الطريقة الرابعة: يأخذ المنشئ اسم الملف كمعلمة أولى وقيمة منطقية كمعلمة ثانية.
FileOutputStream f=new FileOutputStream("d:/abc.txt",true);
ملاحظة: (1) عند كتابة البيانات إلى ملف، إذا كان الملف موجودًا بالفعل، فسيتم الكتابة فوق الملف الموجود (2) عند انتهاء عملية القراءة/الكتابة، يجب استدعاء طريقة الإغلاق لإغلاق الدفق.
}
ملف اختبار الطبقة العامة {
public static void main(String args[]) يلقي IOException {
يحاول {
File inFile = new File("copy.java");
File outFile = new File("copy2.java");
FileInputStream finS = new FileInputStream(inFile);
FileOutputStream foutS = new FileOutputStream(outFile);
كثافة العمليات ج؛
بينما ((c = finS.read()) != -1) {
foutS.write(c);
}
finS. Close();
foutS. Close();
} قبض (IOException ه) {
System.err.println("FileStreamsTest:" + e);
}
}
}
يستغرق وصول الكمبيوتر إلى الأجهزة الخارجية وقتًا طويلاً. كلما زاد تكرار الوصول إلى الذاكرة الخارجية، زاد احتمال أن تكون وحدة المعالجة المركزية في وضع الخمول. من أجل تقليل عدد مرات الوصول إلى الذاكرة الخارجية، يجب قراءة المزيد من البيانات وكتابتها في عملية وصول واحدة إلى الجهاز الطرفي. ولتحقيق هذه الغاية، بالإضافة إلى آليات القراءة والكتابة اللازمة لتبادل البيانات بين البرامج وعقد التدفق، ينبغي أيضًا إضافة آلية التخزين المؤقت. يعني الدفق المخزن مؤقتًا أنه تم تخصيص مخزن مؤقت لكل دفق بيانات، والمخزن المؤقت عبارة عن ذاكرة تقوم بتخزين البيانات مؤقتًا. يمكن أن يؤدي ذلك إلى تقليل عدد مرات الوصول إلى القرص الصلب وتحسين كفاءة النقل.
BufferedInputStream: عند كتابة البيانات إلى الدفق المخزن مؤقتًا، تتم كتابة البيانات أولاً إلى المخزن المؤقت بعد امتلاء المخزن المؤقت، يرسل النظام البيانات إلى جهاز الإخراج مرة واحدة.
BufferedOutputStream: عند قراءة البيانات من الدفق المخزن مؤقتًا، يقرأ النظام أولاً البيانات من المخزن المؤقت عندما يكون المخزن المؤقت فارغًا، ثم يقرأ النظام البيانات من جهاز الإدخال إلى المخزن المؤقت.
قم بتوصيل BufferedInputStream إلى FileInputStream
FileInputStreamin=newFileInputStream( "file1.txt " );
BufferedInputStreambin=newBufferedInputStream(in);
2) كتابة الذاكرة إلى الملف:
قم بتوصيل BufferedOutputStream إلى FileOutputStream
FileOutputStreamout=newFileOutputStream("file1.txt");
BufferedOutputStreambin=newBufferedInputStream(out);
الطبقة العامة ReadWriteToFile {
public static void main(String args[]) يلقي IOException {
InputStreamReader sin = new InputStreamReader(System.in);
BufferedReader bin = new BufferedReader(sin);
FileWriter out = new FileWriter("myfile.txt");
BufferedWriter bout = new BufferedWriter(out);
سلسلة ق؛
بينما ((s = bin.readLine()).length() > 0) {
bout.write(s, 0, s. length());
}
}
}
8. الكاتب/القارئ تيار الشخصية
تعتمد الأحرف في Java معيار Unicode. حرف واحد هو 16 بت، أي يتم تمثيل حرف واحد ببايتين. ولتحقيق هذه الغاية، تم تقديم تدفقات لمعالجة الأحرف في جافا.
فئة مجردة لقراءة تدفقات الأحرف. الطرق الوحيدة التي يجب أن تنفذها الفئات الفرعية هي read(char[], int, int) و Close(). ومع ذلك، ستتجاوز معظم الفئات الفرعية بعض الطرق المحددة هنا لتوفير كفاءة أكبر و/أو وظائف إضافية.
1) FileReader: يتوافق مع FileInputStream، ويستخدم بشكل أساسي لقراءة ملفات الأحرف باستخدام ترميز الأحرف الافتراضي، ويحتوي على ثلاثة مُنشئات:
(1) استخدم اسم الملف كسلسلة: FileReader f=new FileReader(“c:/temp.txt”);
(2) يأخذ المنشئ كائن الملف كمعلمة له.
الملف f=ملف جديد("c:/temp.txt");
FileReader f1=new FileReader(f);
(3) يأخذ المُنشئ كائن FileDescriptor كمعلمة
FileDescriptor() fd=جديد FileDescriptor()
FileReader f2=new FileReader(fd);
(1) استخدم مصفوفة الأحرف المحددة كمعلمة: CharArrayReader(char[])
(2) استخدم مصفوفة الأحرف كتدفق إدخال: CharArrayReader(char[], int, int)
لقراءة سلسلة، يكون المُنشئ كما يلي: public StringReader(String s);
2) CharArrayReader: يتوافق مع ByteArrayInputStream
3) StringReader: يتوافق مع StringBufferInputStream
4) قارئ الإدخال
قراءة البايتات من دفق الإدخال وتحويلها إلى أحرف: public inputstreamReader(inputstream is);
5) FilterReader: يسمح بتصفية تدفقات الأحرف
محمي filterReader(Reader r);
6) BufferReader: يقبل كائن Reader كمعلمة ويضيف مخزنًا مؤقتًا للأحرف إليه، استخدم طريقة readline() لقراءة سطر.
BufferReader العام (القارئ ص)؛
الطرق الرئيسية:
(1) publicintread() throwsIOException;// اقرأ حرفًا، قيمة الإرجاع هي حرف القراءة
(2) publicintread(charcbuf[])throwsIOException;/*اقرأ سلسلة من الأحرف في المصفوفة cbuf[]، والقيمة المرجعة هي عدد الأحرف التي تمت قراءتها بالفعل*/
(3) publicabstractintread(charcbuf[],intoff,intlen)throwsIOException;
/*قراءة أحرف len وتخزينها بدءًا من الحرف المنخفض الموجود في المصفوفة cbuf[].قيمة الإرجاع هي العدد الفعلي للأحرف المقروءة*/
فئة مجردة للكتابة إلى تيارات الشخصية. الطرق الوحيدة التي يجب أن تنفذها الفئات الفرعية هي write(char[], int, int), Flush() و Close(). ومع ذلك، ستتجاوز معظم الفئات الفرعية بعض الطرق المحددة هنا لتوفير كفاءة أكبر و/أو وظائف إضافية. فئاتها الفرعية هي كما يلي:
1) FileWrite: يتوافق مع FileOutputStream ويكتب بيانات نوع الحرف إلى ملف، باستخدام ترميز الأحرف الافتراضي وحجم المخزن المؤقت.
FileWrite العام (ملف f)؛
2) chararrayWrite: يتوافق مع ByteArrayOutputStream، باستخدام المخزن المؤقت للأحرف كإخراج.
public CharArrayWrite();
3) PrintWrite: إنشاء مخرجات منسقة عامة PrintWriter(outputstream os);
4) filterWriter: يستخدم لكتابة دفق أحرف المرشح المحمي FilterWriter(Writer w);
5) PipedWriter: يتوافق مع PipedOutputStream
6) StringWriter: لا يوجد دفق مطابق موجه للبايت
الطرق الرئيسية:
(1) publicvoidwrite(intc)throwsIOException; // اكتب الـ 16 بت السفلية من القيمة الصحيحة c في دفق الإخراج (2) publicvoidwrite(charcbuf[])throwsIOException; // اكتب مصفوفة الأحرف cbuf[] في دفق الإخراج ( 3) publicabstractvoidwrite(charcbuf[],intoff,intlen) throwsIOException; // اكتب أحرف len بدءًا من الفهرس الموجود في مصفوفة الأحرف cbuf[] إلى دفق الإخراج (4) publicvoidwrite(Stringstr)throwsIOException; تتم كتابة str إلى دفق الإخراج (5) publicvoidwrite(Stringstr,intoff,intlen)throwsIOException; // اكتب أحرف len بدءًا من الفهرس في سلسلة str إلى دفق الإخراج (6) Flush() // امسح دفق الإخراج وأخرج جميع الكلمات المخزنة مؤقتًا Festival.
(7) Close () يغلق الدفق publicabstractvoidClose () throwsIOException
3. الفرق بين InputStream و Reader، الفرق بين OutputStream و Writer
public static void main(String args[]) يلقي IOException {
System.out.println("يتم استخدام ترميز أحرف Unicode في الذاكرة:");
شار ج='جيد';
int lowBit=c&0xFF; int HighBit=(c&0xFF00)>>8;
System.out.println(""+lowBit+" "+highBit);
سلسلة ق = "موافق"؛
System.out.println("ترميز الأحرف الافتراضي لنظام التشغيل المحلي:");
readBuff(s.getBytes());
System.out.println("استخدام ترميز أحرف GBK:");
readBuff(s.getBytes("GBK"));
System.out.println("ترميز الأحرف UTF-8:");
readBuff(s.getBytes("UTF-8"));
}
9. الفئات الفرعية لفئة الاستثناء IOException
1.الطبقة العامة EOFException:
يتم طرح هذا النوع من الاستثناءات عند الوصول إلى نهاية الملف أو نهاية دفق الإدخال بشكل غير طبيعي.
2.فئة FileNotFoundException العامة:
تم طرح الاستثناء عندما لا يمكن العثور على الملف.
3. Public Class InterruptedioException:
يتم إلقاء هذا النوع من الاستثناء عند مقاطعة عملية الإدخال/الإخراج.