Java - כתוב InputStream לקובץ

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

במדריך מהיר זה אנו הולכים להמחיש כיצד לכתוב InputStream לקובץ - תחילה באמצעות Java רגיל, אחר כך גויאבה ולבסוף ספריית ה- IO של Apache Commons.

מאמר זה הוא חלק מה- "ג'אווה - חזרה לבסיסי”הדרכה כאן על באלדונג.

2. המר באמצעות Java רגיל

בוא נתחיל עם את פתרון Java:

@Test ציבורי בטל כאשר ConvertingToFile_thenCorrect () זורק IOException {InputStream initialStream = FileInputStream חדש (קובץ חדש ("src / main / resources / sample.txt")); בתא [] חיץ = בתים חדשים [initialStream.available ()]; initialStream.read (חיץ); קובץ targetFile = קובץ חדש ("src / main / resources / targetFile.tmp"); OutputStream outStream = FileOutputStream חדש (targetFile); outStream.write (חיץ); }

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

אם זרם הקלט מקושר ל- זרם מתמשך שלa - למשל, תגובת HTTP שמגיעה מחיבור מתמשך - ואז לקרוא את כל הזרם פעם אחת זה לא אפשרות. במקרה כזה, עלינו לוודא שאנחנו המשיכו לקרוא עד שנגיע לסוף הנחל:

@ מבחן ציבורי בטל כאשר ConvertingInProgressToFile_thenCorrect () זורק IOException {InputStream initialStream = FileInputStream חדש (קובץ חדש ("src / main / resources / sample.txt")); קובץ targetFile = קובץ חדש ("src / main / resources / targetFile.tmp"); OutputStream outStream = FileOutputStream חדש (targetFile); בתא [] חיץ = בתים חדשים [8 * 1024]; int bytesRead; בעוד ((bytesRead = initialStream.read (buffer))! = -1) {outStream.write (buffer, 0, bytesRead); } IOUtils.closeQuietly (InitialStream); IOUtils.closeQuietly (outStream); }

לבסוף, הנה דרך נוספת ופשוטה בה אנו יכולים להשתמש ב- Java 8 כדי לבצע את אותה הפעולה:

@ מבחן ציבורי בטל כאשר ConvertingAnInProgressInputStreamToFile_thenCorrect2 () זורק IOException {InputStream initialStream = FileInputStream חדש (קובץ חדש ("src / main / resources / sample.txt")); קובץ targetFile = קובץ חדש ("src / main / resources / targetFile.tmp"); java.nio.file.Files.copy (initialStream, targetFile.toPath (), StandardCopyOption.REPLACE_EXISTING); IOUtils.closeQuietly (initialStream); }

3. להמיר באמצעות גויאבה

הבא - בואו נסתכל על פיתרון פשוט יותר מבוסס גויאבה:

@ מבחן ציבורי בטל כאשר ConvertingInputStreamToFile_thenCorrect3 () זורק IOException {InputStream initialStream = FileInputStream חדש (קובץ חדש ("src / main / resources / sample.txt")); בייט [] חיץ = בתים חדשים [initialStream.available ()]; initialStream.read (חיץ); קובץ targetFile = קובץ חדש ("src / main / resources / targetFile.tmp"); Files.write (buffer, targetFile); }

4. המירו באמצעות IO של Commons

ולסיום - פיתרון מהיר עוד יותר עם Apache Commons IO:

@Test ציבורי בטל כאשר ConvertingInputStreamToFile_thenCorrect4 () זורק IOException {InputStream initialStream = FileUtils.openInputStream (קובץ חדש ("src / main / resources / sample.txt")); קובץ targetFile = קובץ חדש ("src / main / resources / targetFile.tmp"); FileUtils.copyInputStreamToFile (initialStream, targetFile); }

ויש לך את זה - 3 דרכים מהירות לכתוב את InputStream לקובץ.

היישום של כל הדוגמאות הללו ניתן למצוא בפרויקט GitHub שלנו.