[ https://issues.apache.org/activemq/browse/CAMEL-2551?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=58246#action_58246 ]
Sergey Zolotaryov commented on CAMEL-2551: ------------------------------------------ Current workaround we have to use is the following: \\ {code} InputStream is = .... final InputStream camelBugWorkaround = new InputStream() { @Override public int read(final byte[] b, int off, int len) throws IOException { final int expectedMaxBytes = len; int read = 0; int totalRead = 0; while ((read = is.read(b, off, len)) != -1) { if (read < len) { off += read; len -= read; } totalRead += read; if (totalRead == expectedMaxBytes) { break; } } return totalRead == 0 ? -1 : totalRead; } @Override public int read() throws IOException { return is.read(); } @Override public void close() throws IOException { is.close(); } @Override public int available() throws IOException { return is.available(); } @Override public long skip(final long n) throws IOException { return is.skip(n); } }; exchange.getOut().setBody(camelBugWorkaround); {code} Where _is_ is the PipedInputStream. > File component does not correctly handle PipedInputStream in message body. > -------------------------------------------------------------------------- > > Key: CAMEL-2551 > URL: https://issues.apache.org/activemq/browse/CAMEL-2551 > Project: Apache Camel > Issue Type: Bug > Components: camel-core > Affects Versions: 2.2.0 > Environment: does not matter > Reporter: Sergey Zolotaryov > Attachments: patch.txt > > > Streams that do not have their contents length at immediate disposal, like > PipedInputStream, are not processed correctly by the file component. > \\ > {code} > private void writeFileByStream(InputStream in, File target) throws > IOException { > FileChannel out = null; > try { > out = prepareOutputFileChannel(target, out); > if (LOG.isTraceEnabled()) { > LOG.trace("Using InputStream to transfer from: " + in + " to: > " + out); > } > int size = endpoint.getBufferSize(); > byte[] buffer = new byte[size]; > ByteBuffer byteBuffer = ByteBuffer.wrap(buffer); > while (true) { > int count = in.read(buffer); > if (count <= 0) { > break; > } else if (count < size) { > byteBuffer = ByteBuffer.wrap(buffer, 0, count); > out.write(byteBuffer); > break; > } else { > out.write(byteBuffer); > byteBuffer.clear(); > } > } > } finally { > ObjectHelper.close(in, target.getName(), LOG); > ObjectHelper.close(out, target.getName(), LOG); > } > } > {code} > The code > {code} > } else if (count < size) { > byteBuffer = ByteBuffer.wrap(buffer, 0, count); > out.write(byteBuffer); > break; > } else { > {code} > does not take into account that bytes read can be less than the size of the > buffer passed into the InputStream.read method and stream can still have more > content. The only indication that EOF was reached is -1 returned from the > read method according to Java API. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.