OutputStream Java InputStream məzmununu yazmanın asan yoludur

InputStream in məzmununu Java-da OutputStream -a yazmaq üçün asan bir yol tapmaq mümkün olmadığını bu gün tapmaq üçün təəccübləndim. Şübhəsiz ki, bayt tampon kodu yazmaq çətin deyil, amma sadəcə həyatımı daha asanlaşdıracaq bir şey olmadığından şübhələnirəm (və kod aydın olacaq).

Belə ki, InputStream inOutputStream out InputStream , aşağıdakıları yazmağın daha asan bir yolu varmı?

 byte[] buffer = new byte[1024]; int len = in.read(buffer); while (len != -1) { out.write(buffer, 0, len); len = in.read(buffer); } 
375
04 сент. Matt Sheppard tərəfindən hazırlanan 04 sentyabr. 2008-09-04 06:46 '08 saat 06:46 'da 2008-09-04 06:46
ответ 21 cavab

Java 7 kullanıyorsanız, Dosyalar (standart kütüphanede) ən yaxşı bir yaklaşımdır:

  Files.copy(InputStream in, Path target) Files.copy(Path source, OutputStream out) 

Düzəliş et: Əlbəttə ki, bir fayldan InputStream və ya OutputStream birini yaratdığınızda faydalıdır. file.toPath() yol almaq üçün file.toPath() istifadə edin.

Mövcud bir File.createTempFile() yazmaq üçün (məsələn, File.createTempFile() ilə File.createTempFile() REPLACE_EXISTING surəti (başqa FileAlreadyExistsException ) FileAlreadyExistsException :

 Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING) 
293
05 окт. İstifadəçi cavabı 1079877 05 oktyabr . 2013-10-05 09:03 '13 'da 9:03' da 2013-10-05 09:03

WMR-də qeyd edildiyi kimi, Apache-dən org.apache.commons.io.IOUtils bir copy(InputStream,OutputStream) ki, siz aradığınız şeyi copy(InputStream,OutputStream) .

Beləliklə, siz:

 InputStream in; OutputStream out; IOUtils.copy(in,out); in.close(); out.close(); 
border=0

... kodunuzda.

IOUtils bir səbəb IOUtils ?

376
09 сент. Cavab Mikezx6r tərəfindən verilir 09 Sep. 2008-09-09 15:36 '08 at 3:36 pm 2008-09-09 15:36

Java 9

Java InputStream başlayan InputStream , aşağıdakı imza ilə transferTo adlı bir metodu təmin edir:

 public long transferTo(OutputStream out) throws IOException 

Sənədlərdə göstərildiyi kimi , transferTo aşağıdakılardır:

Bu giriş axınındakı bütün baytları oxuyur və baytları oxuduqları sırada verilmiş axın streaminə yazır. Geri döndükdə, bu giriş axını axın sonunda olacaq. Bu üsul hər hansı bir axını bağlamır.

Bu metod, giriş axınından sonsuz oxuma oxuya bilər və ya çıxış axınına yaza bilər. Giriş və / və ya çıxış axını asinxron olaraq bağlandığı halda və ya ötürülmə zamanı kəsilən axın giriş və çıxış üçün çox xüsusi olduğundan və bu səbəblə göstərilmədiyi hallarda davranış

Buna görə, bir OutputStream üçün Java InputStream məzmununu yazmaq üçün aşağıdakıları yaza bilərsiniz:

 input.transferTo(output); 
96
12 сент. Əli Dehqani tərəfindən verilmiş cavab 12 sentyabr 2016-09-12 00:44 '16 'da 0:44' də 2016-09-12 00:44 'də

Hesab edirəm ki, işləyəcək, amma onu yoxlamaq üçün əmin olun ... yüngül bir "yaxşılaşma", ancaq okunabilirlik üçün bir az bahalı ola bilər.

 byte[] buffer = new byte[1024]; int len; while ((len = in.read(buffer)) != -1) { out.write(buffer, 0, len); } 
94
04 сент. 04 Sentyabrda Mike Stone tərəfindən verilmiş cavab 2008-09-04 06:58 '08 saat 06:58 'da 2008-09-04 06:58

Guava ByteStreams.copy() istifadə edərək:

 ByteStreams.copy(inputStream, outputStream); 
43
26 марта '14 в 13:12 2014-03-26 13:12 Cavab Andrejs tərəfindən 26 Mart '14 'da saat 13:12' də verilir. 2014-03-26 13:12

Sadə funksiya

Yalnız InputStream yazmaq lazımdırsa, bu sadə funksiyadan istifadə edə bilərsiniz:

 private void copyInputStreamToFile( InputStream in, File file ) { try { OutputStream out = new FileOutputStream(file); byte[] buf = new byte[1024]; int len; while((len=in.read(buf))>0){ out.write(buf,0,len); } out.close(); in.close(); } catch (Exception e) { e.printStackTrace(); } } 
24
13 сент. Cavab 13 İordaniya LaPrise tərəfindən verilmişdir . 2013-09-13 22:33 '13 saat 10:33 'da 2013-09-13 22:33

PipedInputStreamPipedOutputStream yalnız bir neçə axın var və Javadoc işarəsi ilə istifadə olunmalıdır.

Ayrıca, giriş axınları və çıxış axınları IOException s istifadə edərək mövzu kesintileri IOException ... Beləliklə, IOException kəsilmə siyasəti daxil edilməlidir:

 byte[] buffer = new byte[1024]; int len = in.read(buffer); while (len != -1) { out.write(buffer, 0, len); len = in.read(buffer); if (Thread.interrupted()) { throw new InterruptedException(); } } 

Bu API uzunmüddətli bir müddət üçün sıxışdırılmış axınlardan böyük miqdarda məlumat və ya məlumatın surətini çıxarmaq üçün istifadə etməyi planlaşdırırsınızsa bu faydalı bir əlavə olacaq.

14
12 февр. Cavab 12 fevralda Dilum Ranatunga tərəfindən verilir. 2009-02-12 13:37 '09 da 13:37 'da 2009-02-12 13:37

JDK eyni kodu istifadə edir, buna görə də görünür ki, heç bir şey yoxdur ki, heç bir "sadə" yol yoxdur (ehtimal ki, başqa heç bir şey yoxdur). Birbaşa java.nio.file.Files.java kopyalanır:

 // buffer size used for reading and writing private static final int BUFFER_SIZE = 8192;  private static long copy(InputStream source, OutputStream sink) throws IOException { long nread = 0L; byte[] buf = new byte[BUFFER_SIZE]; int n; while ((n = source.read(buf)) > 0) { sink.write(buf, 0, n); nread += n; } return nread; } 
11
13 окт. Cavab verilən BullyWiiPlaza 13 oktyabr 2016-10-13 14:10 '16 'da saat 14:10' da 2016-10-13 14:10

Bahar çərçivəsini istifadə edənlər üçün faydalı StreamUtils sinfi var:

 StreamUtils.copy(in, out); 

Yuxarıdakılar axınları bağlamır. Kopyadan sonra axınların qapalı olmasını istəyirsinizsə, yerinə FileCopyUtils sinfi istifadə edin :

 FileCopyUtils.copy(in, out); 
9
02 февр. Cavab verilib holmis83 02 fevral. 2017-02-02 17:33 '17 saat 17:33 'də 2017-02-02 17:33

JDK metodlarından istifadə edərək bunu daha asan etmək mümkün deyil, lakin Apocalisp artıq qeyd etdiyimiz kimi, bu fikri olan yeganə şəxs deyilsiniz: Jakarta Commons IO- dan IOUtils istifadə edə bilərsiniz, həmçinin IMO-nun əslində JDK'nın bir parçası ...

8
04 сент. Cavab WMR 04 Sep verilir. 2008-09-04 13:50 '08 saat 13:50 'da 2008-09-04 13:50

Java7-i və resursları sınayın , sadələşdirilmiş və oxunan bir versiyası ilə gəlir.

  try(InputStream inputStream = new FileInputStream("C:\\mov.mp4"); OutputStream outputStream = new FileOutputStream("D:\\mov.mp4")){ byte[] buffer = new byte[10*1024]; for (int length; (length = inputStream.read(buffer)) != -1; ){ outputStream.write(buffer, 0, length); } }catch (FileNotFoundException exception){ exception.printStackTrace(); }catch (IOException ioException){ ioException.printStackTrace(); } 
6
21 авг. cavab Sivakumar 21 avqustda verilir . 2015-08-21 11:52 '15 at 11:52 am 2015-08-21 11:52

Net Util icma sinfi istifadə edin:

 import org.apache.commons.net.io.Util; ... Util.copyStream(in, out); 
4
11 нояб. Cavab DejanLekic 11 noyabrda verilir . 2013-11-11 23:56 '13 at 23:56 2013-11-11 23:56

Ən sadə döngə ilə bunu necə edəcəyəm.

 private void copy(final InputStream in, final OutputStream out) throws IOException { final byte[] b = new byte[8192]; for (int r; (r = in.read(b)) != -1;) { out.write(b, 0, r); } } 
4
22 авг. Cavab 22 avqustda Jin Kwon tərəfindən verilmişdir . 2016-08-22 04:17 '16 'da 4:17' də 2016-08-22 04:17 'də

IMHO daha minimal fraqment (bu da dəyişən uzunluqları daha da dar bir şəkildə əhatə edir):

 byte[] buffer = new byte[2048]; for (int n = in.read(buffer); n >= 0; n = in.read(buffer)) out.write(buffer, 0, n); 

Bir yan qeyd olaraq, niyə daha çox insanın loop for istifadə etmədiyini anlamıram, bunun əvəzinə bəzi ifadələri "yoxsul" üslub hesab edirlər.

2
10 дек. Cavab 10 dekabrda Bohem tərəfindən verilir . 2015-12-10 03:29 '15 'də 3:29' de, 2015-12-10 03:29

Çox faylların 1024 baytdan daha böyük olduğu üçün böyük bir tampon istifadə etmək daha yaxşı olar. Həm də müsbət oxunan baytların sayını yoxlamaq yaxşı bir fikirdir.

 byte[] buffer = new byte[4096]; int n; while ((n = in.read(buffer)) > 0) { out.write(buffer, 0, n); } out.close(); 
2
13 сент. Aleksandr Volkovun 13 sentyabrda verdiyi cavabı 2013-09-13 17:24 '13 at 17:24 2013-09-13 17:24

BufferedInputStreamBufferedOutputStream buffering semantikasını çıxarmaq üçün istifadə edirəm

 try (OutputStream out = new BufferedOutputStream(...); InputStream in = new BufferedInputStream(...))) { int ch; while ((ch = in.read()) != -1) { out.write(ch); } } 
0
20 янв. Cavab Archimedes Trajano tərəfindən verilir 2019-01-20 05:04 '19 saat 05:04 'da 2019-01-20 05:04

Digər mümkün namizəd Guava I / O kommunaldır:

http://code.google.com/p/guava-libraries/wiki/IOExplained

Guava mənim layihəmdə artıq çox faydalıdır və bir funksiya üçün başqa bir kitabxana əlavə etmir, çünki mən onları istifadə edəcəyəm.

0
11 дек. Cavab Andrew Mao tərəfindən verilir 11 dekabr. 2012-12-11 08:42 '12 at 8:42 2012-12-11 08:42

PipedInputStream və PipedOutputStream digərləri ilə əlaqələndirə biləcəyi kimi faydalı ola bilər.

0
04 сент. cavab Arktronic 04 sep tərəfindən verilir . 2008-09-04 07:04 '08 at 07:04 'da 2008-09-04 07:04
 public static boolean copyFile(InputStream inputStream, OutputStream out) { byte buf[] = new byte[1024]; int len; long startTime=System.currentTimeMillis(); try { while ((len = inputStream.read(buf)) != -1) { out.write(buf, 0, len); } long endTime=System.currentTimeMillis()-startTime; Log.v("","Time taken to transfer all bytes is : "+endTime); out.close(); inputStream.close(); } catch (IOException e) { return false; } return true; } 
-2
02 апр. Cavab Nour Rteil 02 Aprel verilir. 2015-04-02 21:48 '15 at 21:48 2015-04-02 21:48

Cactoos'u cəhd edin:

 new LengthOf(new TeeInput(input, output)).value(); 

Daha ətraflı burada: http://www.yegor256.com/2017/06/22/object-oriented-input-output-in-cactoos.html

-2
21 сент. cavab yegor256 verildi 21 sentyabr 2017-09-21 19:06 '17 də 7:06 'də 2017-09-21 19:06

bu üsuldan istifadə edə bilərsiniz

 public static void copyStream(InputStream is, OutputStream os) { final int buffer_size=1024; try { byte[] bytes=new byte[buffer_size]; for(;;) { int count=is.read(bytes, 0, buffer_size); if(count==-1) break; os.write(bytes, 0, count); } } catch(Exception ex){} } 
-5
06 марта '14 в 14:23 2014-03-06 14:23 Cavab Pranav mart 06 '14 saat 14:23 'də verilir 2014-03-06 14:23

tags ilə bağlı digər suallar və ya bir sual