나는 두 개의 모듈이 개발 단계에이고 하나 나는 같은 출력을 가지고 OutputStream
만 수락하고 두 번째를 InputStream
. 당신은 변환하는 방법을 알고 계십니까 OutputStream
에 InputStream
나는이 두 부분을 연결 할 수있을 것입니다 (정말이 방법을 의미 반대하지)?
감사
답변
은 OutputStream
당신이 데이터를 쓸 것입니다. 일부 모듈이을 노출 OutputStream
하면 다른 쪽 끝에 무언가가있을 것으로 예상됩니다.
를 노출 뭔가 InputStream
, 다른 한편으로는, 당신이 스트림을 청취 할 필요가 있음을 나타내는하며, 당신이 읽을 수있는 데이터가있을 것입니다.
따라서에 연결할 InputStream
수 있습니다OutputStream
InputStream----read---> intermediateBytes[n] ----write----> OutputStream
누군가가 언급했듯이, 이것은 IOUtils 의 copy()
방법으로 가능합니다. 다른 방향으로가는 것은 이치에 맞지 않습니다.
최신 정보:
물론 이것을 더 많이 생각할수록 이것이 실제로 어떻게 요구되는지 알 수 있습니다. Piped
입력 / 출력 스트림에 대해 언급 한 의견 중 일부는 알고 있지만 다른 가능성이 있습니다.
노출 된 출력 스트림이 인 경우 ByteArrayOutputStream
항상 toByteArray()
메서드 를 호출하여 전체 내용을 가져올 수 있습니다 . 그런 다음 ByteArrayInputStream
서브 클래스를 사용하여 입력 스트림 랩퍼를 작성할 수 있습니다 . 이 두 가지는 의사 스트림이며 기본적으로 바이트 배열을 래핑합니다. 따라서이 방식으로 스트림을 사용하는 것은 기술적으로 가능하지만 나에게는 여전히 매우 이상합니다 …
답변
많은 링크와 다른 것들이 있지만 파이프를 사용하는 실제 코드는없는 것 같습니다. 사용의 장점 java.io.PipedInputStream
및 java.io.PipedOutputStream
메모리의 추가 소비가 없다는 것입니다. ByteArrayOutputStream.toByteArray()
원래 버퍼의 복사본을 반환하므로 메모리에있는 것이 무엇이든 이제 두 개의 복사본이 있음을 의미합니다. 그런 다음 쓰는 InputStream
방법은 이제 세 개의 데이터 사본이 있음을 의미합니다.
코드:
// take the copy of the stream and re-write it to an InputStream
PipedInputStream in = new PipedInputStream();
final PipedOutputStream out = new PipedOutputStream(in);
new Thread(new Runnable() {
public void run () {
try {
// write the original OutputStream to the PipedOutputStream
// note that in order for the below method to work, you need
// to ensure that the data has finished writing to the
// ByteArrayOutputStream
originalByteArrayOutputStream.writeTo(out);
}
catch (IOException e) {
// logging and exception handling should go here
}
finally {
// close the PipedOutputStream here because we're done writing data
// once this thread has completed its run
if (out != null) {
// close the PipedOutputStream cleanly
out.close();
}
}
}
}).start();
이 코드는이 있다고 가정 originalByteArrayOutputStream
A는 ByteArrayOutputStream
이 파일에 사용자를 제외하고있는 거 쓰기, 일반적으로 만 사용할 수있는 출력 스트림 때문이다. 이게 도움이 되길 바란다! 이것에 대한 좋은 점은 별도의 스레드에 있기 때문에 병렬로도 작동하므로 입력 스트림을 소비하는 모든 것이 이전 출력 스트림에서도 스트리밍된다는 것입니다. 이는 버퍼가 더 작게 유지 될 수 있고 대기 시간과 메모리 사용량이 적기 때문에 유리합니다.
답변
입력 및 출력 스트림은 시작 및 끝 지점이므로 데이터를 바이트 배열로 임시 저장하는 것이 해결책입니다. 따라서 new에 대한 입력으로 사용 ByteArrayOutputStream
되는 중간을 작성해야합니다 .byte[]
ByteArrayInputStream
public void doTwoThingsWithStream(InputStream inStream, OutputStream outStream){
//create temporary bayte array output stream
ByteArrayOutputStream baos = new ByteArrayOutputStream();
doFirstThing(inStream, baos);
//create input stream from baos
InputStream isFromFirstData = new ByteArrayInputStream(baos.toByteArray());
doSecondThing(isFromFirstData, outStream);
}
도움이 되길 바랍니다.
답변
버퍼링 할 중간 클래스가 필요합니다. InputStream.read(byte[]...)
호출 될 때마다 버퍼링 클래스는 전달 된 다음 청크로 전달 된 바이트 배열을 채 웁니다 OutputStream.write(byte[]...)
. 청크의 크기가 동일하지 않을 수 있으므로, 어댑터 클래스는 읽기 버퍼를 채울 수있을 때까지 및 / 또는 버퍼 오버 플로우를 저장할 수있을 때까지 일정량을 저장해야합니다.
이 기사에는이 문제에 대한 몇 가지 다른 접근 방식이 자세히 설명되어 있습니다.
http://blog.ostermiller.org/convert-java-outputstream-inputstream
답변
ByteArrayOutputStream buffer = (ByteArrayOutputStream) aOutputStream;
byte[] bytes = buffer.toByteArray();
InputStream inputStream = new ByteArrayInputStream(bytes);
답변
easystream 오픈 소스 라이브러리는의 InputStream에 OutputStream를 변환하는 직접 지원이 있습니다 http://io-tools.sourceforge.net/easystream/tutorial/tutorial.html
그들은 또한 다른 옵션을 나열합니다 : http://io-tools.sourceforge.net/easystream/OutputStream_to_InputStream.html
답변
a ByteArrayOutputStream
를 a 로 변환하는 것과 동일한 문제가 발생하여 의 내부 버퍼로 초기화 ByteArrayInputStream
된를 ByteArrayOutputStream
반환 할 수 있는 파생 클래스를 사용하여 해결했습니다 . 이렇게하면 추가 메모리가 사용되지 않고 ‘변환’이 매우 빠릅니다.ByteArrayInputStream
ByteArrayOutputStream
package info.whitebyte.utils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
/**
* This class extends the ByteArrayOutputStream by
* providing a method that returns a new ByteArrayInputStream
* which uses the internal byte array buffer. This buffer
* is not copied, so no additional memory is used. After
* creating the ByteArrayInputStream the instance of the
* ByteArrayInOutStream can not be used anymore.
* <p>
* The ByteArrayInputStream can be retrieved using <code>getInputStream()</code>.
* @author Nick Russler
*/
public class ByteArrayInOutStream extends ByteArrayOutputStream {
/**
* Creates a new ByteArrayInOutStream. The buffer capacity is
* initially 32 bytes, though its size increases if necessary.
*/
public ByteArrayInOutStream() {
super();
}
/**
* Creates a new ByteArrayInOutStream, with a buffer capacity of
* the specified size, in bytes.
*
* @param size the initial size.
* @exception IllegalArgumentException if size is negative.
*/
public ByteArrayInOutStream(int size) {
super(size);
}
/**
* Creates a new ByteArrayInputStream that uses the internal byte array buffer
* of this ByteArrayInOutStream instance as its buffer array. The initial value
* of pos is set to zero and the initial value of count is the number of bytes
* that can be read from the byte array. The buffer array is not copied. This
* instance of ByteArrayInOutStream can not be used anymore after calling this
* method.
* @return the ByteArrayInputStream instance
*/
public ByteArrayInputStream getInputStream() {
// create new ByteArrayInputStream that respects the current count
ByteArrayInputStream in = new ByteArrayInputStream(this.buf, 0, this.count);
// set the buffer of the ByteArrayOutputStream
// to null so it can't be altered anymore
this.buf = null;
return in;
}
}
나는 github에 물건을 넣었다 : https://github.com/nickrussler/ByteArrayInOutStream