דרכים קלות לכתוב 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.