Jython 2.7.3中FileReader.read()传入char数组报错问题咨询
Jython 2.7.3中FileReader.read()传入jarray字符数组报错的解决方案
问题确认
这确实是Jython 2.7.3的已知适配bug,问题出在版本迭代时对Java原生char[]的类型映射逻辑调整上——2.7.2中jarray创建的字符数组能被FileReader.read()正确识别,而2.7.3的类型校验更严格,导致无法完成转换。切换JDK版本不会解决这个问题,因为根源在Jython的类型转换层。
可行解决方案
方案1:使用Python原生文件读取(推荐)
放弃Java IO类,直接用Python内置的文件操作,代码更简洁且兼容性更好:
with open("test1.txt", "r", encoding="utf-8") as f: content = f.read().strip() print(content)
方案2:改用Java IO的包装类或无参读取
如果必须依赖Java IO,可以用BufferedReader简化读取,或者调用FileReader的无参read()方法逐个字符读取:
from java.io import FileReader, BufferedReader # 用BufferedReader按行读取 reader = BufferedReader(FileReader("test1.txt")) content = reader.readLine() print(content) reader.close() # 或用无参read()循环读取 reader = FileReader("test1.txt") chars = [] c = reader.read() while c != -1: chars.append(chr(c)) c = reader.read() print(''.join(chars)) reader.close()
方案3:手动转换jarray为Java char[]
通过Java反射工具完成类型转换,适配2.7.3的校验逻辑:
from java.io import FileReader import jarray from java.lang.reflect import Array # 创建Jython字符数组 jython_char_arr = jarray.zeros(1024, 'c') # 转换为Java原生char[] java_char_arr = Array.newInstance(Character.TYPE, len(jython_char_arr)) for idx in range(len(jython_char_arr)): Array.setChar(java_char_arr, idx, jython_char_arr[idx]) # 调用read方法 reader = FileReader("test1.txt") read_len = reader.read(java_char_arr) print(''.join(java_char_arr[:read_len])) reader.close()
长期建议
由于Jython 2.x分支的维护已基本停滞,该bug大概率不会被官方修复。如果业务对Java IO依赖不高,优先采用Python原生文件操作;若必须使用旧版Jython+Java IO,回退到Jython 2.7.2是最省心的选择。
内容的提问来源于stack exchange,提问作者Peter Wu
相关产品推荐
相关产品推荐

