测试在本地 Windows 机器上有效,但在 Linux 服务器上失败
Test works on local Windows machine but fails on Linux server
我有这个测试:
@Test
void testHeader() {
String inputFile = ".\src\main\resources\binaryFile";
MDHeader addHeader = new MDHeader();
try (
InputStream inputStream = new FileInputStream(inputFile);
) {
long fileSize = new File(inputFile).length();
byte[] allBytes = new byte[(int) fileSize];
inputStream.read(allBytes);
ProducerRecord<String, byte[]> record = new ProducerRecord<String, byte[]>("foo", allBytes);
ProducerRecord<String, byte[]> hdr = addHeader.addMDHeader(record);
for (Header header : hdr.headers()) {
assertEquals("mdpHeader", header.key());
}
}
catch(Exception e) {
assert (false);
}
}
在我的 Windows 桌面上通过 Eclipse 在本地 运行 时测试成功,但在 com.me.be.HeaderTests.testMDHeader(HeaderTests.java:81)
尝试在 Linux 服务器上构建 jar 时测试失败。那是行 assert (false)
。我还没有得到关于这个问题的更多信息,但想知道它是否可能是 Linux 环境中 inputFile
中的反斜杠?
Windows 和 Linux 上的 Java 都接受 /
作为路径分隔符,而 Linux 不喜欢 \
作为路径分隔符路径分隔符 - 因此将整个字符串视为一个路径组件,而不是您期望的 4 个部分:
String inputFile = "./src/main/resources/binaryFile";
但是对于文件处理,最好使用 java.nio.Path
或 java.io.File
代替 String
。
WINDOWS
jshell> Path.of("./src/main/resources/binaryFile")
==> .\src\main\resources\binaryFile
Linux
jshell> Path.of("./src/main/resources/binaryFile")
==> ./src/main/resources/binaryFile
您也可以使用 Path.of
不带任何文件分隔符,任何 OS:
Path p = Path.of("src","main","resources","binaryFile");
File.separator
字符串可以方便地连接到路径字符串中以生成 OS 独立文件路径。
String inputFile = "." + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "binaryFile";
应该给你一个跨平台兼容的文件路径。
我有这个测试:
@Test
void testHeader() {
String inputFile = ".\src\main\resources\binaryFile";
MDHeader addHeader = new MDHeader();
try (
InputStream inputStream = new FileInputStream(inputFile);
) {
long fileSize = new File(inputFile).length();
byte[] allBytes = new byte[(int) fileSize];
inputStream.read(allBytes);
ProducerRecord<String, byte[]> record = new ProducerRecord<String, byte[]>("foo", allBytes);
ProducerRecord<String, byte[]> hdr = addHeader.addMDHeader(record);
for (Header header : hdr.headers()) {
assertEquals("mdpHeader", header.key());
}
}
catch(Exception e) {
assert (false);
}
}
在我的 Windows 桌面上通过 Eclipse 在本地 运行 时测试成功,但在 com.me.be.HeaderTests.testMDHeader(HeaderTests.java:81)
尝试在 Linux 服务器上构建 jar 时测试失败。那是行 assert (false)
。我还没有得到关于这个问题的更多信息,但想知道它是否可能是 Linux 环境中 inputFile
中的反斜杠?
Java 都接受 /
作为路径分隔符,而 Linux 不喜欢 \
作为路径分隔符路径分隔符 - 因此将整个字符串视为一个路径组件,而不是您期望的 4 个部分:
String inputFile = "./src/main/resources/binaryFile";
但是对于文件处理,最好使用 java.nio.Path
或 java.io.File
代替 String
。
WINDOWS
jshell> Path.of("./src/main/resources/binaryFile")
==> .\src\main\resources\binaryFile
Linux
jshell> Path.of("./src/main/resources/binaryFile")
==> ./src/main/resources/binaryFile
您也可以使用 Path.of
不带任何文件分隔符,任何 OS:
Path p = Path.of("src","main","resources","binaryFile");
File.separator
字符串可以方便地连接到路径字符串中以生成 OS 独立文件路径。
String inputFile = "." + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "binaryFile";
应该给你一个跨平台兼容的文件路径。