我正在尝试使用 bitbucket api 读取预接收 Hook 的文件。关键是,我需要检查一些具体文件和内容才能批准或拒绝提交。您可以在此处查看代码:
request.getRefChanges().stream()
.filter(change -> change.getRef().getId().equalsIgnoreCase("refs/heads/master"))
.forEach(refChange -> {
scmService.getBulkContentCommandFactory(request.getRepository())
.contents(new BulkContentCommandParameters.Builder(refChange.getToHash())
.sinceCommitId(refChange.getFromHash())
.build(), new BulkContentCallback() {
@Override
public void onFile(@Nonnull BulkFile file, @Nonnull InputStream content) {
this.processFile(file, content);
}
private void processFile(BulkFile file, InputStream content) {
log.info("Streaming file {} with content id {}, file: {}, size: {}",
file.getPath(), file.getContentId(), file.getSize());
try {
StringWriter writer = new StringWriter();
//IOUtils.copy(content, writer, "UTF-8");
log.info("file content: {}", readSB(content));
} catch (IOException e) {
// TODO Auto-generated catch block
log.error(e.getMessage(), e);
}
}
}).call();});
问题是,我从BulkContentCallback的onFile
方法获得的InputStream就像只给我文件的第一行。我在 readSB 方法中尝试过不同的实现,例如
InputStream首次实现
StringBuilder textBuilder = new StringBuilder();
try (Reader reader = new BufferedReader(new InputStreamReader
(inputStream, Charset.forName(StandardCharsets.UTF_8.name())))) {
int c = 0;
while ((c = reader.read()) != -1) {
textBuilder.append((char) c);
}
}
return textBuilder.toString();
或者InputStream第二个实现:
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
byte[] byteArray = buffer.toByteArray();
String text = new String(byteArray, StandardCharsets.UTF_8);
return text;
或者InputStream第三个实现:
try (BufferedReader buffer = new BufferedReader(new InputStreamReader(inputStream))) {
return buffer.lines().collect(Collectors.joining("\n"))
}
但是结果总是一样的,只是打印第一行。
有什么想法吗?
最佳答案
在 Bitbucket 5.13.0 及更早版本中检测为错误(在 5.10.1 及更高版本中测试,但不起作用)。我刚刚更新到 5.14.0 并且可以正常工作。
希望有帮助。
关于java - 在 bitbucket api 方法中从 InputStream 读取内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52498282/