InputStream to String בקוטלין

1. סקירה כללית

במדריך קצר זה, נגלה כיצד לקרוא InputStream לתוך חוּט.

Kotlin מספק דרך קלה לבצע את ההמרה. עם זאת, יש עדיין לקחת בחשבון כמה ניואנסים בעת עבודה עם משאבים. בנוסף, נסקור מקרים מיוחדים, כמו לקרוא עד דמות עצירה.

2. קורא שנאגר

InputStream הוא הפשטה סביב זרם בתים מסודר. מקור נתונים בסיסי יכול להיות קובץ, חיבור רשת או כל מקור אחר שפולט. בואו נשתמש בקובץ פשוט המכיל את הנתונים הבאים:

תכנות מחשבים יכול להיות טרחה זה כמו לנסות לקחת טירה מוגנת

הפיתרון הראשון שאנו עשויים לנסות הוא לקרוא את הקובץ באופן ידני שורה אחר שורה:

קורא val = BufferedReader (inputStream.reader ()) val content = StringBuilder () נסה {var line = reader.readLine () ואילו (line! = null) {content.append (line) line = reader.readLine ()}} סוף סוף {reader.close ()}

ראשית, השתמשנו ב- BufferedReader בכיתה לעטוף את InputStream ואז קרא עד שלא נותרו שורות בזרם. יתר על כן, הקפנו את הגיון הקריאה על ידי נסה סוף סוף הצהרה ל סוף סוף לסגור את הנחל. בסך הכל, יש הרבה קוד לדוד.

האם נוכל להפוך אותו לקומפקטי וקריא יותר?

בהחלט! בהתחלה נוכל לפשט את קטע הקוד באמצעות readText () פוּנקצִיָה. הוא קורא את זרם הקלט לחלוטין כ- חוּט. בהתאם לכך, אנו יכולים לשקף את קטע הקוד שלנו באופן הבא:

val reader = BufferedReader (inputStream.reader ()) var content: מחרוזת נסה {content = reader.readText ()} סוף סוף {reader.close ()}

עם זאת, עדיין יש לנו את זה נסה סוף סוף לַחסוֹם. למרבה המזל, קוטלין מאפשרת ניהול ניהול משאבים באופן פסאודו אוטומטי. בואו נסתכל על שורות הקוד הבאות:

val content = inputStream.bufferedReader (). השתמש (BufferedReader :: readText) assertEquals (fileFullContent, content) 

פתרון קו אחד זה נראה פשוט, עם זאת, הרבה קורה מתחת למכסה המנוע. נקודה חשובה אחת בקוד לעיל היא קריאת ה- להשתמש() פוּנקצִיָה. פונקציית הרחבה זו מבצעת חסימה על משאב המיישם את ה- ניתן לסגירה מִמְשָׁק. לבסוף, כאשר החסימה מבוצעת קוטלין סוגר עבורנו את המשאב.

3. עצור תו

יחד עם זאת, יכול להיות מקרה בו נצטרך לקרוא תוכן עד לדמות מסוימת. בואו נגדיר פונקציית הרחבה עבור ה- InputStream מעמד:

כיף InputStream.readUpToChar (stopChar: Char): מחרוזת {val stringBuilder = StringBuilder () var currentChar = this.read (). toChar () בעוד (currentChar! = stopChar) {stringBuilder.append (currentChar) currentChar = this.read ( ) .toChar () אם (this.available () <= 0) {stringBuilder.append (currentChar) break}} return stringBuilder.toString ()}

פונקציה זו קוראת בתים מזרם קלט עד להופעת תו עצירה. במקביל, לפי הסדר כדי למנוע את הלולאה האינסופית, אנו קוראים זמין() שיטה כדי לבדוק אם לזרם נותרו נתונים. לכן, אם אין תו עצור בזרם, אז נקרא זרם שלם.

מצד שני, לא כל מחלקות המשנה של InputStream בכיתה לספק יישום עבור זמין() שיטה. כתוצאה מכך, עלינו לוודא כי השיטה מיושמת כראוי לפני השימוש בפונקציית ההרחבה.

בוא נחזור לדוגמא שלנו ו קרא טקסט עד לתו הרווח הראשון (‘ ‘):

val content = inputStream.use {it.readUpToChar ('')} assertEquals ("מחשב", תוכן) 

כתוצאה מכך, נביא את הטקסט לתו העצירה. באותו אופן, אל תשכח לעשות זאת לעטוף את הבלוק עם להשתמש() פונקציה לסגירת הזרם באופן אוטומטי.

4. מסקנה

במאמר זה ראינו כיצד להמיר InputStream אל א חוּט בקוטלין. קוטלין מספק דרך תמציתית לעבוד עם זרמי נתונים, אך תמיד כדאי לדעת מה קורה באופן פנימי.

כרגיל, היישום של כל הדוגמאות הללו הסתיים ב- Github.