在java中将字符串转换为压缩十进制

在java中将字符串转换为压缩十进制,java,ascii,mainframe,packed-decimal,Java,Ascii,Mainframe,Packed Decimal,我有一个用例,我需要为大型机创建一个文件,其中包含文本和使用Java压缩的十进制数 我已经经历了很多关于堆栈溢出的线程,但似乎什么都不起作用。我正在使用JTOpen图书馆 下面是我编写的一个示例程序: package com.amazonaws.samples.util; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.math.Bi

我有一个用例,我需要为大型机创建一个文件,其中包含文本和使用Java压缩的十进制数

我已经经历了很多关于堆栈溢出的线程,但似乎什么都不起作用。我正在使用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进行传输

下面是一个从一个代码页转换到另一个代码页的方法的链接


您看到的损坏来自将ASCII文件转换为EBCDIC。你 需要以EBCDIC的形式写入文件,并向大型机进行二进制(直接无翻译)传输

根据@Hogstroms的回答

改变

        fos.write(joiner.toString().getBytes());

这将把文件写为EBCDIC。 您需要将主机传输更改为二进制



您可能会发现它很有用,特别是如果您有cobol抄本的话。

谢谢@Hogstrom,在用java编写文件时,我们可以用文本文件或任何特定的文件格式编写吗?我想这个链接将帮助您实现您想要实现的功能。谢谢@Bruce Martin,我将尝试您提供的代码片段Hi@Bruce Martin,我尝试使用JRecord,当我们将文件导入大型机时,文件中写入的所有数据都是单行的。大型机如何知道线路的终点?是否基于复印本中定义的长度?我试图通过导入到大型机中而不使用副本来测试通过Jrecord生成的文件。@praveen它在大型机上的文件定义中。您可以指定recfm=fb,lrecl/b;在发送文件或发送到具有正确属性的现有mainfram时,lsize etc
        fos.write(joiner.toString().getBytes("cp037"));