1

我正在尝试使用JRecord库在 Eclipse RCP 应用程序中显示大型机文件。我已经将 COBOL 副本作为文本文件。为了做到这一点,

  1. 我正在通过 apache commons net FTPClient API 将文件从大型机传输到我的桌面
  2. 现在我有一个文本文件
  3. 我正在删除换行符和回车符
  4. 然后我通过 CobolIoProvider 读取它并将其转换为 AbstractLine 类型的 ArrayList

但由于一些特殊字符,我有抵消问题。这是问题

  1. 当我不执行第 3 步时,记录 1 中存在偏移问题。因此我包含了第 3 步
  2. 即使我执行第 3 步,前几千条记录似乎也被 AbstractLineReader 正确格式化(或读取),除非它遇到特殊字符(不确定,但这是我的假设)。

代码片段:

ArrayList<AbstractLine> lines = new ArrayList<AbstractLine>();
        InputStream copyStream;
        InputStream fis;
        try {
            copyStream = new FileInputStream(new File(copybookfile));

            String filec = FileUtils.readFileToString(new File(datafile));
            System.out.println("initial len: "+filec.length());
            filec=filec.replaceAll("\r", "");
            filec=filec.replaceAll("\n", "");
            System.out.println("initial len: "+filec.length());

            fis= new ByteArrayInputStream(filec.getBytes());

            CobolIoProvider ioProvider = CobolIoProvider.getInstance();
            AbstractLineReader reader = ioProvider.newIOBuilder(copyStream, "REQUEST",
                    Convert.FMT_MAINFRAME).newReader(fis);
            AbstractLine line;
            while ((line = reader.read()) != null) {
                lines.add(line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

我在这里想念什么?我需要对从大型机传输的文件进行额外的预处理吗?

4

2 回答 2

3

未来参考/二进制文件

如果文件确实包含Binary Data,则您确实需要进行二进制传输。您可能会发现RecordEditor很有用。

RecordEditor 0.98具有JRecord 代码生成 功能。使用RecordEditor 生成函数的优点是

  • Recordeditor 将尝试通过查看文件来计算出适当的文件属性
  • 您可以尝试各种属性(左侧窗格)并查看具有这些属性(右侧)的文件的外观。
  • 满意后,点击 Generate 按钮,RecordEditor将生成 JRecord 代码。有几个可用的代码模板

    • 标准- 将生成基本的 JRecord 代码(带有字段名称类
    • lineWrapper - 将生成一个“包装器”类,其中 Cobol 字段表示为 get/set 方法

记录编辑器生成

RecordEditor 中选择Generate >>> Java~JRecord code for Cobol

在此处输入图像描述

生成屏幕

输入 Cobol CopyBook / Sample 文件并根据需要调整属性

在此处输入图像描述

代码模板

接下来您可以选择代码模板

在此处输入图像描述

生成的代码

最后RecordEditor将根据输入的属性生成 JRecord 代码。

在此处输入图像描述

于 2016-07-31T03:13:14.157 回答
3

如果它是带有 \r\n 行分隔符的文本文件(无二进制数据),请尝试:

    ArrayList<AbstractLine> lines = new ArrayList<AbstractLine>();
    InputStream copyStream;
    InputStream fis;
    try {
        copyStream = new FileInputStream(new File(copybookfile));

        AbstractLineReader reader = CobolIoProvider.getInstance() 
            .newIOBuilder(copyStream, "REQUEST", ICopybookDialects.FMT_MAINFRAME)
                .setFileOrganization(Constants.IO_STANDARD_TEXT_FILE)
            .newReader(datafile);
        AbstractLine line;
        while ((line = reader.read()) != null) {
            lines.add(line);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

注意: setFileOrganization告诉 JRecord是什么类型的文件。所以.setFileOrganization(Constants.IO_STANDARD_TEXT_FILE)告诉 JRecord 它是一个带有 \n 或 \r\n 行尾标记的文本文件。这是JRecord 中 FileOrganisation 的描述

不过,特殊字符让我担心,如果“数据”中有 \n ,它将被视为end-of-line。如果是 VB 文件,您可能需要进行二进制传输并保留 RDW(记录-描述符-字)。

如果文件包含二进制数据,您将需要:

  • 进行二进制传输(如果是 VB 文件,则使用 RDW)
  • 使用适当的文件组织
  • 指定 Ebcdic ( .setFont("cp037")告诉 JRecord 是 US-Ebcdic)

我将添加使用RecordEditor生成代码的第二个答案


如果您绝对确定所有记录的长度相同,则可以使用低级例程进行读取,请参阅https://sourceforge.net/p/jrecord/discussion/678634/thread/4b00fed4中的 ReadAqtrans.java 程序/

基本上你会这样做:

    ICobolIOBuilder iobuilder = CobolIoProvider.getInstance()
            .newIOBuilder("copybookFileName", ICopybookDialects.FMT_MAINFRAME)
                    .setFont("CP037")
                    .setFileOrganization(Constants.IO_FIXED_LENGTH);
    LayoutDetail layout = iobuilder.getLayout();
    FixedLengthByteReader br 
         = new FixedLengthByteReader(layout.getMaximumRecordLength() + 2);
    br.open("...");

    byte[] bytes;
    while ((bytes = br.read()) != null) {           
        lines.add(iobuilder.newLine(bytes));
    }
于 2016-07-30T23:23:57.653 回答