对于超过 8091 个字符的行,wlst/Jython 2.2.1 中的文件搜索失败

file seek in wlst / Jython 2.2.1 fails for lines longer than 8091 characters

对于在 WLST/Jython 2.2.1 中生成的 CSV 文件,我想在检测到新指标时更新输出文件的第一行 header。通过使用 seek 转到第一行并覆盖该行,效果很好。但是当第一行的字符数超过8091个字符时就失败了。

我制作了简化的脚本,它重现了我在这里面临的问题。

#!/usr/bin/python
#

import sys

global maxheaderlength
global initheader

maxheaderlength=8092

logFilename = "test.csv"

# Create (overwrite existing) file
logfileAppender = open(logFilename,"w",0)
logfileAppender.write("." * maxheaderlength)
logfileAppender.write("\n")
logfileAppender.close()

# Append some lines
logfileAppender = open(logFilename,"a",0)
logfileAppender.write("2nd line\n")
logfileAppender.write("3rd line\n")
logfileAppender.write("4th line\n")
logfileAppender.write("5th line\n")
logfileAppender.close()

# Seek back to beginning of file and add data
logfileAppender = open(logFilename,"r+",0)
logfileAppender.seek(0) ;
header = "New Header Line" + "." * maxheaderlength
header = header[:maxheaderlength]
logfileAppender.write(header)
logfileAppender.close()

当 maxheaderlength 为 8091 或更低时,我确实得到了预期的结果。文件 test.csv 以“New Header Line”开头,后跟 8076 点和 其次是线 第二行 第三行 第四行 第 5 行

当 maxheaderlength 为 8092> 时,test.csv 生成的文件以 8092 点开始,然后是 "New Header Line",然后是 8077 点。现在显示第 2 ... 5 行,可能被点覆盖了。

知道如何解决或解决这个问题吗?

我也能够重现这种极其奇怪的行为,而且它确实在 Jython 2.5.3 中正常工作,所以我认为我们可以有把握地说这是 2.2.1 中的一个错误(不幸的是,您在 WLST 中遇到了这个错误).

在这些情况下,我通常的做法是回退到使用本机 Java 方法。如下更改最后一段代码似乎按预期工作:-

# Seek back to beginning of file and add data
from java.io import RandomAccessFile

logfileAppender = RandomAccessFile(logFilename, "rw")
logfileAppender.seek(0) ;
header = "New Header Line" + "." * maxheaderlength
header = header[:maxheaderlength]
logfileAppender.writeBytes(header)
logfileAppender.close()