سؤال

ماهو الفرق بين PrintStream و PrintWriter؟ لديهم العديد من الأساليب المشتركة بسبب غالباً ما أقوم بخلط هاتين الفئتين. علاوة على ذلك ، أعتقد أنه يمكننا استخدامها لنفس الأشياء بالضبط. ولكن يجب أن يكون هناك اختلاف ، وإلا ، فقد كان هناك فئة واحدة فقط.

لقد بحثت في الأرشيف ، لكنني لم أجد هذا السؤال.

هل كانت مفيدة؟

المحلول

هذا قد يبدو فنيًا ، لكن PrintStream يطبع إلى OutputStream, ، و PrintWriter يطبع إلى Writer. حسنًا ، أشك في أنني سأحصل على أي نقاط لتوضيح ما هو واضح. ولكن هناك المزيد.

لذا ، ما هو الفرق بين OutputStream و Writer؟ كلاهما تيارات ، مع الاختلاف الأساسي هو أ OutputStream هو تيار من البايتات بينما أ Writer هو دفق من الشخصيات.

إذا كان OutputStream يتعامل مع البايتات ، ماذا عن PrintStream.print(String)؟ إنه يحول chars إلى Bytes باستخدام ترميز النظام الأساسي الافتراضي. يعد استخدام الترميز الافتراضي أمرًا سيئًا بشكل عام لأنه يمكن أن يؤدي إلى الأخطاء عند الانتقال من منصة إلى أخرى ، خاصةً إذا كنت تقوم بإنشاء الملف على منصة واحدة واستهلاكه على آخر.

مع Writer, ، عادةً ما تحدد الترميز للاستخدام ، وتجنب أي تبعيات منصة.

لماذا تهتم بوجود PrintStream في JDK ، نظرًا لأن القصد الأساسي هو كتابة الأحرف ، وليس البايتات؟ PrintStream يسبق JDK 1.1 عندما تم تقديم تدفقات شخصية القارئ/الكاتب. أتصور أن صن قد أهمل PrintStream إذا فقط لحقيقة أنها تستخدم على نطاق واسع. (بعد كل شيء ، لا تريد كل مكالمة System.out لتوليد تحذير من واجهة برمجة التطبيقات المنهكة! أيضا ، تغيير النوع من PrintStream ل PrintWriter على تدفقات الإخراج القياسية قد كسر التطبيقات الحالية.)

نصائح أخرى

مع ال PrintStream أنت عالق في الترميز الافتراضي للمنصة.

PrintStream stream = new PrintStream(output);

مع ال PrintWriter ومع ذلك يمكنك تمرير OutputStreamWriter مع تشفير محدد.

PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));

الميزة هي ، حسناً ، أنه يمكنك التحكم في الحرف الذي يشفر الأحرف يجب أن تكتب في أن ينتهي بهم المطاف في النهاية موخيبي.

نظرًا لأن JDK 1.4 من الممكن تحديد الحرف الترميز لـ PrintStream. وبالتالي ، فإن الاختلافات بين PrintStream و PrintWriter هي فقط حول سلوك التدفق التلقائي وأنه لا يمكن للطباعة أن يلف كاتبًا.

كتاب مثل PrintWriter مخصصين لإخراج النص ، والتدفقات مخصصة للإخراج الثنائي. الكتاب يتعاملون مع مجموعة الأحرف لك. لا تفعل التدفقات لأنه من المفترض أنك لا تريد هذا النوع من التحويل ، والذي سيوضح بياناتك الثنائية ، وستستخدم كاتبًا إذا فعلت ذلك.

يمكنك كتابة البايتات الخام إلى دفق وليس للكاتب. ال PrintWriter يسرد Javadoc الاختلافات الأخرى (الأهم من ذلك ، أن تكون قادرًا على تعيين ترميز على دفق حتى يتمكن من تفسير البايتات الأولية التي أقولها).

من عند جوهر جافا بقلم هورستمان

قد يتساءل قدامى المحاربين في Java ما حدث لفئة PrintStream وإلى System.out. في Java 1.0 ، قامت فئة PrintStream ببساطة بإيقاف جميع أحرف Unicode إلى أحرف ASCII عن طريق إسقاط البايت العلوي. (في ذلك الوقت ، كان يونيكود لا يزال ترميزًا 16 بت.) من الواضح أن هذا لم يكن نهجًا نظيفًا أو محمولًا ، وقد تم إصلاحه مع إدخال القراء والكتاب في Java 1.1. للتوافق مع الكود الحالي ، لا يزال System.in ، System.out ، و System.err تدفقات الإدخال/الإخراج ، وليس القراء والكتاب. ولكن الآن يقوم فئة PrintStream بتحويل أحرف Unicode داخليًا إلى المضيف الافتراضي الذي يشفر بنفس الطريقة التي يقوم بها PrintWriter. تتصرف كائنات type printstream تمامًا مثل كتاب الطباعة عند استخدام أساليب الطباعة والطباعة ، ولكن على عكس كتاب الطباعة ، فإنهم يسمحون لك بإخراج بايتات أولية مع أساليب الكتابة (int) والكتابة (البايت []).

PrintWriter هو تعزيز للطباعة.

أي printstream لغرض محدد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top