java - 通过 NFS 共享挂载将数据刷新到文件时的特殊字符

标签 java

我们的应用程序读取 XML 文件并将文本文件作为输出写入共享 NFS 文件系统。应用程序运行的 RHEL 版本为 7.6,NFS 为 veritas Access 版本 7.2 和 7.4(在两个环境上都有问题),NFS 服务器操作系统为 RHEL 7.2 和 RHEl 7.4(在两个环境上都有问题)

在实际写入文件之前已检查要写入文件的值。检索到的数据是正确的。一旦写入文件后,就会得到特殊字符。 (并不是一直都是同一个角色)

Veritas、RHEL 或 JAVA 上是否有任何可疑之处?请分享是否有任何可用的故障排除程序。

用于写入文件的Java API是Printwriter

已尝试所有可以匹配 NFS 服务器和 RHEL 客户端的编码。 尝试了所有java编码JVM参数 尝试所有文件打开关闭和刷新机制。 将JAVA api更改为FileOutPutStream,并通过存储在StringBuilder中写入数据。

即使在尝试了所有可能的解决方案之后。但问题仍然存在。

代码:

osw = new OutputStreamWriter(new FileOutputStream(outFile, true), "ISO-8859-1");
        coldelimiter = "\t";
        rowdelimiter = "\n";

        writer = new PrintWriter(new BufferedWriter(osw));

        while (iterator.hasNext()) {

            final DataToWrite data = iterator.next();
            writer.write(data.getDataName());
            writer.write(coldelimiter);

            }
            writer.write(rowdelimiter);
            writer.flush();

预期:

testSystem testSystem 1 14 1 ManagedSystem 1 1 1310 2019-04-10 01:00:00 2019-04-10 10 Alpha testSystem +0100 1 0 4 15 29201 15MIN 2019-04-10 00:00:00 2019 13

实际:

测试系统测试系统1 14 1管理系统1 1 1310 2019-04-10 01:00:00 2019-04-10 10 Alpha Testsystem +0100 1 0 4 15 29201 15min 2019-04-10 004-10 00:00:00:00 2019 13 2019 13

我希望末尾有新行 [\n ],但有时像 `q,) 等垃圾字符会被附加到随机列中。

最佳答案

该代码看起来不错,理论上只有 rowdelimiter 可能会被覆盖,但为什么会出现一些随机字符。

您正在追加,但如果存在错误(例如文件结束字符),则追加后仍然会显示换行符。

如果数据没有错误的话,可能是读码的问题。使用反引号+q,它看起来像数据。

注意到: - 对于特殊的 Windows-Latin-1(和浏览器 Latin-1),可以使用 Windows-1252 i.o. ISO-8859-1。 - Linux 上的换行符是 "\n",Windows 上的换行符是 "\r\n"。

    osw = new OutputStreamWriter(new FileOutputStream(outFile, true), "Windows-1252");
    final String coldelimiter = "\t";
    final String rowdelimiter = "\r\n";
    writer = new PrintWriter(new BufferedWriter(osw));

或者使用更封闭、更不易出错的代码:

final String coldelimiter = "\t";
final String rowdelimiter = "\r\n";
Charset charset = StandardCharsets.ISO_8859_1;
Path outPath = outFile.toPath(); // File outFile
Path outPath = Paths.get(outFile); // String outFile

try (BufferedWriter osw = Files.newBufferedWriter(outPath, charset,
            StandardOpenOptions.APPEND, StandardOpenOptions.CREATE);
        PrintWriter writer = new PrintWriter(osw)) {

   while (iterator.hasNext()) {
        final DataToWrite data = iterator.next();
        writer.write(data.getDataName());
        writer.write(coldelimiter);
        ...
        writer.write(rowdelimiter);
        writer.flush();  
    }
} // Automatic close, also on exception

关于java - 通过 NFS 共享挂载将数据刷新到文件时的特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57819398/

相关文章:

java - KeyListener 有问题

java - @UpdateTimestamp 不会更新第二次保存时的值

java - 通过代理 servlet 设置安全 cookie

java - 当数据写入服务器端的socket.getOutputStream时会发生什么?

java - 试图解析 json 以在 android 上列出 View 但出现错误

java - 从 Netty Handler 内部访问 Netty 服务器实例

java - 是否有任何实现 maxlen 的 java Deque,如 python collections.deque?

java - 如何使用 modelmapper 将多个字段映射到一个目标字段

java - 截断二进制对数

java - 运行 lint 测试时出现 JAXBException