דרכים קלות לכתוב Java InputStream ל- OutputStream

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

במדריך המהיר הזה, נלמד כיצד לכתוב ג'אווה InputStream לג'אווה OutputStream. נשתמש תחילה בפונקציונליות הליבה של Java 8 ו- Java 9. לאחר מכן, נבחן כמה ספריות חיצוניות - גויאבה וספריית IO של Apache Commons.

שיטות השירות המסופקות על ידי Java 9, Guava ו- Apache Commons IO אינן שוטפות או סוגרות את הזרמים. אז נצטרך לנהל את המשאבים האלה באמצעות נסה עם משאבים או א סוף כל סוף לַחסוֹם.

2. שימוש ב- Java 8

ראשית, נתחיל ביצירת שיטה פשוטה באמצעות Java וניל להעתקת התוכן מה- InputStream אל ה OutputStream:

העתק בטל (מקור InputStream, יעד OutputStream) זורק IOException {בתים [] buf = בתים חדשים [8192]; אורך int; בעוד ((length = source.read (buf))> 0) {target.write (buf, 0, length); }}

קוד זה די פשוט - אנחנו פשוט קוראים כמה בתים ואז כותבים אותם.

3. שימוש ב- Java 9

Java 9 מספק שיטת שירות, InputStream.transferTo (), למשימה זו.

בואו נסתכל כיצד נשתמש ב- העבר ל() שיטה:

@Test הציבור בטל שניתןUsingJavaNine_whenCopyingInputStreamToOutputStream_thenCorrect () זורק IOException {String initialString = "שלום עולם!"; נסה (InputStream inputStream = ByteArray חדשInputStream (initialString.getBytes ()); ByteArrayOutputStream targetStream = ByteArrayOutputStream חדש ()) {inputStream.transferTo (targetStream); assertEquals (initialString, מחרוזת חדשה (targetStream.toByteArray ())); }}

שים לב שבעת העבודה עם זרמי קבצים, זה יעיל יותר לשימוש Files.copy () מאשר ה העבר ל() שיטה.

4. שימוש בגויאבה

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

נצטרך לכלול את תלות הגויאבה בתוכנו pom.xml:

 com.google.guava גויאבה 29.0-jre 

בואו ליצור מקרה מבחן פשוט כדי להראות כיצד נוכל להשתמש ByteStreams להעתקת נתונים:

@Test הציבור בטל givenUsingGuava_whenCopyingInputStreamToOutputStream_thenCorrect () זורק IOException {String initialString = "שלום עולם!"; נסה (InputStream inputStream = ByteArray חדשInputStream (initialString.getBytes ()); ByteArrayOutputStream targetStream = ByteArrayOutputStream חדש ()) {ByteStreams.copy (inputStream, targetStream); assertEquals (initialString, מחרוזת חדשה (targetStream.toByteArray ())); }}

5. שימוש ב- Commons IO

לבסוף, בואו נסתכל איך היינו עושים זאת השתמש ב- IO של Commons IOUtils.copy () שיטה למשימה זו.

כמובן שנצטרך להוסיף את התלות commons-io ל- pom.xml:

 commons-io commons-io 2.7 

בואו ליצור מקרה מבחן פשוט באמצעות IOUtils להעתקת נתונים מזרם הקלט לזרם הפלט:

@Test הציבור בטל givenUsingCommonsIO_whenCopyingInputStreamToOutputStream_thenCorrect () זורק IOException {String initialString = "שלום עולם!"; נסה (InputStream inputStream = חדש ByteArrayInputStream (initialString.getBytes ()); ByteArrayOutputStream targetStream = ByteArrayOutputStream חדש ()) {IOUtils.copy (inputStream, targetStream); assertEquals (initialString, מחרוזת חדשה (targetStream.toByteArray ())); }}

הערה: Commons IO מספק שיטות נוספות לעבודה InputStreams ו- OutputStreamס. IOUtils.copyLarge () יש להשתמש בכל פעם שיש צורך להעתיק נתונים של 2 GB או יותר.

6. מסקנה

במאמר זה בחנו דרכים פשוטות להעתיק נתונים מ- InputStream ל OutputStream.

היישום של דוגמאות אלה זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found