זרם הוא זרימה מתמשכת של נתונים. ב-Java I/O זרמי משמשים לקריאה ממקורות קלט או כתיבה ליעדי פלט כגון קבצים. הם מספקים דרך לגשת לנתונים ברצף. חבילת java.io כוללת מחלקות לטיפול גם בזרמי בתים וגם בזרמי תווים וגם להמרה ביניהם.
- זרם קלט: קורא נתונים מהמקור.
- זרם פלט: כותב נתונים ליעד.
מתי להשתמש ב-Character Stream על Byte Stream:
ב-Java תווים מאוחסנים באמצעות מוסכמות Unicode. זרם תווים שימושי כאשר אנו רוצים לעבד קבצי טקסט. ניתן לעבד קבצי טקסט אלו תו אחר תו. גודל התווים הוא בדרך כלל 16 סיביות.
מתי להשתמש ב-Byte Stream על גבי Character Stream:
מכוון בייט קורא בייט אחר בייט. זרם בתים מתאים לעיבוד נתונים גולמיים כמו קבצים בינאריים.
נקודות מפתח בעת שימוש והתמודדות עם כל אחד מהזרמים לעיל:
- מחלקות זרם תווים מסתיימות בדרך כלל ב-Reader/Writer ואילו מחלקות זרם בתים מסתיימות ב-InputStream/OutputStream.
- הקודים לדוגמה במאמר זה משתמשים בזרמים לא מפוצלים שהם פחות יעילים. לביצועים טובים יותר, אנו בדרך כלל עוטפים אותם עם BufferedReader/BufferedWriter (זרמי תווים) או BufferedInputStream/BufferedOutputStream (זרמי בייטים).
- סגור תמיד זרמים לאחר השימוש כדי לפנות משאבים ולמנוע שגיאות.
- ייתכן שהקודים שלעיל לא יפעלו במהדרים מקוונים מכיוון שייתכן שלא קיימים קבצים.
זרם תווים
ב-Java תווים מאוחסנים באמצעות מוסכמות Unicode. זרם תווים מאפשר לנו באופן אוטומטי לקרוא/לכתוב נתונים תו אחר תו. לדוגמה FileReader ו- FileWriter הם זרמי תווים המשמשים לקריאה מהמקור ולכתיבה ליעד.
זרמי תוויםדוּגמָה
Javaimport java.io.*; public class GFG { public static void main(String[] args) throws IOException { // Initially assigning null as we have not read anything FileReader sourceStream = null; try { // Reading from file sourceStream = new FileReader('/Users/mayanksolanki/Desktop/demo.rtf'); // Reading sourcefile and writing content to target file character by character. int temp; // If there is content inside file than read while ((temp = sourceStream.read()) != -1) System.out.println((char)temp); System.out.print('Program successfully executed'); } finally { if (sourceStream != null) sourceStream.close(); } } }
תְפוּקָה:
כותב תוכן לקובץ היעד תו אחר תו
התוכנית בוצעה בהצלחה
Byte Stream
זרם בתים ב-Java הוא זרם המטפל בקלט ופלט של נתונים בינאריים גולמיים של 8 סיביות. הוא משמש בעיקר לקריאה וכתיבת נתונים שאינם טקסטים כגון תמונות אודיו וידיאו או כל קובץ בינארי. לְדוּגמָה FileInputStream משמש לקריאה מהמקור ו- FileOutputStream לכתיבה ליעד.
דוּגמָה:
Javaimport java.io.*; public class GFG { public static void main(String[] args) throws IOException { // Initially assigning null ot objects for reading and writing to file FileInputStream sourceStream = null; FileOutputStream targetStream = null; try { // Passing the files via local directory sourceStream = new FileInputStream('/Users/mayanksolanki/Desktop/demo.rtf'); targetStream = new FileOutputStream('/Users/mayanksolanki/Desktop/democopy.rtf'); // Reading source file and writing content to file byte by byte int temp; // If there is content inside file than read while ((temp = sourceStream.read()) != -1) targetStream.write((byte)temp); System.out.print('Program successfully executed'); } // finally block that executes for sure where we are closing file connections to avoid memory leakage finally { if (sourceStream != null) sourceStream.close(); if (targetStream != null) targetStream.close(); } } }
תְפוּקָה:
התוכנית בוצעה בהצלחה
הבדלים בזרם תווים לעומת זרם בתים
| אַספֶּקט | זרם תווים | Byte Stream |
|---|---|---|
| טיפל בסוג הנתונים | תווי Unicode 16 סיביות (טקסט) | נתונים גולמיים של 8 סיביות (בינאריים) |
| השיעורים מסתיימים ב | קורא / כותב | InputStream / OutputStream |
| מתאים ל | קבצי טקסט נתוני Unicode | תמונות אודיו וידאו קבצים בינאריים |
| הֲמָרָה | ממיר בתים לתווים באופן אוטומטי | שום המרה לא עובדת עם בייטים גולמיים |
| דוגמאות | FileReader FileWriter | FileInputStream FileOutputStream |
מאמר קשור
- Java IO - קלט/פלט ב-Java עם דוגמאות