我有以下文件,其中包含.MSG
文件的二进制表示形式:
binaryMessage.txt
我把它放在我的Eclipse工作区,在以下文件夹中 - src/main/resources/test
:
我想在以下JUnit代码中使用此文本文件中的字符串,所以我尝试了以下方法:
request.setContent("src/main/resources/test/binaryMessage");
mockMvc.perform(post(EmailController.PATH__METADATA_EXTRACTION_OPERATION)
.contentType(MediaType.APPLICATION_JSON)
.content(json(request)))
.andExpect(status().is2xxSuccessful());
}
但这不起作用。有没有办法可以直接传入字符串文件而不使用IO代码?
答案 0 :(得分:1)
您无法在不使用IO代码(或使用IO代码的库)的情况下读取文件。也就是说,将文件读入内存并不难,所以你可以发送它。
要将二进制文件读入byte[]
,您可以使用此方法:
private byte[] readToByteArray(InputStream is) throws IOException {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
return baos.toByteArray();
} finally {
if (is != null) {
is.close();
}
}
}
然后你可以做
request.setContent(readToByteArray(getClass().getResourceAsStream("test/binaryMessage")));
答案 1 :(得分:1)
除了我对Samuel的答案的评论之外,我只是注意到你依赖于具体的执行目录。我个人不喜欢这样,通常使用类加载器的函数来查找资源。
因此,要独立于您的工作目录,您可以使用
getClass().getResource("/test/binaryMessage")
将其转换为URI和Path,然后使用Files.readAllBytes获取内容:
Path resourcePath = Paths.get(getClass().getResource("/test/binaryMessage").toURI());
byte[] content = Files.readAllBytes(resourcePath);
...甚至将其转换为单个表达式。
但回到原来的问题:不,这是I / O代码,你需要它。但是自从Java 7(2011年!)出现以来,这不再需要痛苦了。