回答(21)

2 years ago

如果您使用的是Java 7,那么Files(在标准库中)是最好的方法:

/* You can get Path from file also: file.toPath() */

Files.copy(InputStream in, Path target)

Files.copy(Path source, OutputStream out)

编辑:当然,从文件创建一个InputStream或OutputStream时它非常有用 . 使用 file.toPath() 从文件中获取路径 .

要写入现有文件(例如,使用 File.createTempFile() 创建的文件),您需要传递 REPLACE_EXISTING 复制选项(否则抛出 FileAlreadyExistsException ):

Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING)

2 years ago

正如WMR所提到的,来自Apache的 org.apache.commons.io.IOUtils 有一个名为copy(InputStream,OutputStream)的方法,它可以完全满足您的需求 .

所以你有了:

InputStream in;

OutputStream out;

IOUtils.copy(in,out);

in.close();

out.close();

...在你的代码中 .

你有没有理由避免 IOUtils ?

2 years ago

Java 9

从Java 9开始, InputStream 提供了一个名为 transferTo 的方法,其签名如下:

public long transferTo(OutputStream out) throws IOException

正如documentation所述, transferTo 将:

读取此输入流中的所有字节,并按读取顺序将字节写入给定的输出流 . 返回时,此输入流将位于流的末尾 . 此方法不会关闭任一流 . 此方法可能会无限期地阻止从输入流中读取或写入输出流 . 输入和/或输出流异步关闭或传输过程中线程中断的情况下的行为是高度输入和输出流特定的,因此未指定

因此,为了将Java InputStream 的内容写入 OutputStream ,您可以编写:

input.transferTo(output);

2 years ago

我认为这样可行,但一定要测试它......轻微的“改进”,但可读性可能有点费用 .

byte[] buffer = new byte[1024];

int len;

while ((len = in.read(buffer)) != -1) {

out.write(buffer, 0, len);

}

2 years ago

ByteStreams.copy(inputStream, outputStream);

2 years ago

简单功能

如果您只需要将 InputStream 写入 File ,那么您可以使用这个简单的函数:

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();

}

}

2 years ago

只有在有多个线程时才应使用 PipedInputStream 和 PipedOutputStream ,如noted by the Javadoc .

另请注意,输入流和输出流不会使用 IOException 包装任何线程中断...因此,您应该考虑在代码中加入中断策略:

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();

}

}

如果您希望使用此API来复制大量数据,或者将数据从流中陷入无法忍受的长时间,这将是一个有用的补充 .

2 years ago

JDK 使用相同的代码,所以看起来没有"easier"方式没有笨重的第三方库(可能不会做任何不同的事情) . 以下内容直接从 java.nio.file.Files.java 复制:

// buffer size used for reading and writing

private static final int BUFFER_SIZE = 8192;

/**

* Reads all bytes from an input stream and writes them to an output stream.

*/

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;

}

2 years ago

对于那些使用 Spring framework 的人来说,有一个有用的StreamUtils类:

StreamUtils.copy(in, out);

以上并没有关闭流 . 如果您希望在复制后关闭流,请使用FileCopyUtils class:

FileCopyUtils.copy(in, out);

2 years ago

有's no way to do this a lot easier with JDK methods, but as Apocalisp has already noted, you'并不是唯一一个有这个想法的人:你可以使用Jakarta Commons IO来自Jakarta Commons IO,它还有很多其他有用的东西,IMO实际上应该是JDK的一部分......

2 years ago

使用Java7和try-with-resources,附带简化且可读的版本 .

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();

}

2 years ago

使用Commons Net的Util类:

import org.apache.commons.net.io.Util;

...

Util.copyStream(in, out);

2 years ago

这就是我如何使用最简单的for循环 .

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);

}

}

2 years ago

我认为最好使用大缓冲区,因为大多数文件大于1024字节 . 另外,最好将读取的字节数检查为正数 .

byte[] buffer = new byte[4096];

int n;

while ((n = in.read(buffer)) > 0) {

out.write(buffer, 0, n);

}

out.close();

2 years ago

一个恕我直言的更小的片段(也更窄范围长度变量):

byte[] buffer = new byte[2048];

for (int n = in.read(buffer); n >= 0; n = in.read(buffer))

out.write(buffer, 0, n);

作为旁注,我不要使用 for 循环,而是选择带有assign-and-test表达式的 while ,该表达式被某些人视为"poor"样式 .

2 years ago

PipedInputStream和PipedOutputStream可能有一些用处,因为您可以将一个连接到另一个 .

2 years ago

另一个可能的候选者是Guava I / O实用程序:

我以为我会使用这些,因为Guava在我的项目中已经非常有用,而不是为一个函数添加另一个库 .

2 years ago

我使用 BufferedInputStream 和 BufferedOutputStream 从中删除缓冲语义码

try (OutputStream out = new BufferedOutputStream(...);

InputStream in = new BufferedInputStream(...))) {

int ch;

while ((ch = in.read()) != -1) {

out.write(ch);

}

}

2 years ago

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 years ago

你可以使用这种方法

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){}

}

java inputstream write_将Java InputStream的内容写入OutputStream的简便方法相关推荐

  1. Java基础,读取文件中的内容写入到另外一个文件。

    有两种方法,首先: 第一种方法:一次性全部读取所有文件内容(这里Arrays.sort(b)代表对字节进行排序,如果不需要进行删除即可) import java.io.FileInputStream; ...

  2. java实现读取txt文件和将内容写入txt文件

    1.java读取txt和写入txt文件 package com.ztesoft.TestClusterHHHT;import java.io.BufferedReader; import java.i ...

  3. java中求两个数的最小公倍数,最大公约数的简便方法

    1.新建GcdLcm类,在main中测试所调用的方法. import java.util.Scanner;public class GcdLcm {public static void main(St ...

  4. 如何在Java中将字节数组转换为InputStream和OutputStream

    您是否坚持使用编码,因为您有字节数组,并且链中的下一个方法需要InputStream? 不用担心Java有解决方案,您可以使用 ByteArrayInputStream 在Java中将字节数组转换为I ...

  5. java string 转 inputstream_String和inputstream互转【转文】

    URLConnection urlConn = url.openConnection(); // 打开网站链接s BufferedReader reader = new BufferedReader( ...

  6. java scanner转string,Java InputStream to String 转化

    1. 概况 这篇文章主要是讲怎样将InputStream转换为String.采用[weblink url="http://code.google.com/p/guava-libraries/ ...

  7. java 复制 inputstream_关于对inputstream流的复制

    今天因为项目需要,获取到一个inputstream后,可能要多次利用它进行read的操作.由于流读过一次就不能再读了,所以得想点办法. 而InputStream对象本身不能复制,因为它没有实现Clon ...

  8. java文件读写 outputstream_java IO文件读写例子(OutputStream,InputStream,Writer,Reader)...

    一,File创建文件 File file = new File("D:" + File.separator + "yi.txt"); 代码示例: package ...

  9. java inputstream长度_java - 带有InputStream长度示例的AmazonS3 putObject

    我实际上在做同样的事情,但在我的AWS S3存储上: - 接收上传文件的servlet代码: - import java.io.IOException; import java.io.PrintWri ...

最新文章

  1. php实现 统计输入中各种字符的个数
  2. 封装进程内存相关操作函数
  3. APK安装时如何拷贝apk里的文件到sdcard
  4. 求不选修c语言课程的学生学号,数据库综合练习二.docx
  5. pmp每日三题(2022年3月4日)
  6. Direct3D 11.1新特性曝光
  7. 办公技巧:Excel教程36个逆天功能,全面了解一下!
  8. 移动端布局 - REM方式
  9. 解决:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
  10. startService()和bindService()区别
  11. SSH项目ueditor插件jsp版本
  12. IDEA 插件开发 中文乱码
  13. python执行bat文件_让Python文件也可以当bat文件运行
  14. js数组倒序reverse
  15. 软件设计师-3.数据结构与算法基础
  16. Lab3: 自行车码表
  17. 全同态加密知识体系整理
  18. AB测试-A/B Test
  19. SOYO的主板如何进入BIOS系统
  20. oracle用户授所有权限,在Oracle模式上授予用户所有权限

热门文章

  1. 什么是内核——linux内核解析
  2. 大疆Mini1充电管家拆解分享
  3. Spring核心和设计思想
  4. 前端查漏补缺 全知识点合集(更新中9.3)
  5. 如果当时这20道题能答好,现在应该已经被录取了(记一次面试的亲身经历 2020-8-27)
  6. 利用Intent启动Activity
  7. .net core 使用swagger提示:Failed to load API definition.加载API定义失败
  8. 为什么要做接口测试?接口测试的优势。
  9. JAVA static是什么?修饰符总结整理
  10. 输入一个三角形的三条边,判断有这三条边能否构成一个三角形,如果是,输出周长,不是,输出非法三角形。