java - 在 bitbucket api 方法中从 InputStream 读取内容

标签 java git bitbucket inputstream bitbucket-api

我正在尝试使用 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/

相关文章:

git move 正在将文件视为新文件

c# - 如何在自述文件中将链接显示为纯文本

java - 更改所选 jbutton 的边框颜色而不命名按钮

bash - 不在 git 存储库中时无法抑制 git 分支错误

node.js - Azure BitBucket 分发失败

git - 如何将本地 git 存储库从父文件夹 move 到子文件夹?

java - 如何使用 for 语句在 java 数组中创建多个图像?

xss - 如何修复反射(reflect)在 java 中的 XSS

java - 访问 forEach 中的流数据

Bitbucket 问题类型 : enhancement vs. 任务