如何解决java中将String转换为压缩十进制
我有一个用例,我需要为大型机创建一个文件,其中包含使用 Java 的文本和压缩十进制。
我在 Stack Overflow 上浏览了很多线程,但似乎没有任何效果。我正在使用 jtopen 库。
这是我编写的示例程序:
package com.amazonaws.samples.util;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.StringJoiner;
import com.ibm.as400.access.AS400PackedDecimal;
public class PackedDecimalTest {
public static void main(String args[]) throws IOException {
AS400PackedDecimal packedDecimal = new AS400PackedDecimal(8,0);
BigDecimal javaBigDecimal = new BigDecimal("20200521");
byte[] convertedBytesArray = packedDecimal.toBytes(javaBigDecimal);
try (FileOutputStream fos = new FileOutputStream("test.txt",false)) {
//StringJoiner joiner = new StringJoiner(" ");
//String firstName = new String("firstName1");
//String lastName = new String("lastName1");
//String empId = new String("1111");
//String dept = new String("empDept1");
//String n = new String("N");
//joiner = joiner.add(firstName).add(lastName).add(empId).add(dept).add(n);
//fos.write(joiner.toString().getBytes());
fos.write(convertedBytesArray);
}
try (FileInputStream fis = new FileInputStream("test.txt")) {
BigDecimal convertedBigDecimal = (BigDecimal) packedDecimal.toObject(fis.readAllBytes());
System.out.println(convertedBigDecimal.toString());
}
}
}
当我写入文件并立即读取时,它似乎在 Java 中运行良好。我能够正确地看到输出。
但是,在大型机中打开同一个文件时,我没有正确看到压缩的十进制数据。
以下是我在大型机中查看数据的方式:
我非常纠结于需要做什么来修复它。关于我做错了什么的任何指示?如何在同一个文件中同时写入 ASCII 和压缩十进制数据?在为大型机编写文件以正确读取数据之前,是否需要定义任何字符集?可以写成.txt文件吗,或者文件扩展名应该不同或者扩展名没有意义?我对大型机和文件格式以及它支持的字符集一无所知。
解决方法
鉴于压缩十进制实际上是一个“二进制”值,您需要使用主机编码(CP-037 或 CP-1047 或您首选的代码页)和压缩十进制“二进制”来创建文件字段,然后将文件作为二进制文件传输。我不熟悉用于 AS/400 的代码页,但无论如何都是同样的问题。
如果您使用 scp
,文件将进行隐式转换,这会损坏文件。
使用 FTP / FTPS 使用二进制模式进行传输。
这是关于从一个代码页转换为另一个代码页的方法的链接。
Converting String from One Charset to Another
,您看到的损坏来自将 ASCII 文件转换为 EBCDIC。你 需要将文件写为 EBCDIC 并进行二进制(直接没有翻译)传输到大型机。
根据@Hogstroms 的回答,
改变
fos.write(joiner.toString().getBytes());
到
fos.write(joiner.toString().getBytes("cp037"));
这会将文件写入为 EBCDIC。 您需要将大型机传输更改为二进制。
您可能会发现 JRecord 很有用,尤其是当您有一本 cobol Copybook 时。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。