首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JRecord -从大型机传输的格式化文件

JRecord -从大型机传输的格式化文件
EN

Stack Overflow用户
提问于 2016-07-30 09:07:32
回答 2查看 2.5K关注 0票数 1

我试图使用JRecord库在eclipse应用程序中显示大型机文件,我已经将copybook作为文本文件。为了达到这个目的,

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

但我抵消了一些问题,因为一些特殊的特点。以下是问题所在

  1. 当我不执行步骤3时,记录1就会出现偏移问题,因此我包括了步骤3。
  2. 即使我执行第3步,最初的几个记录似乎被AbstractLineReader正确地格式化(或读取),除非它遇到一个特殊的字符(不确定,但这是我的假设)。

代码片段:

代码语言:javascript
复制
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();
        }

我在这里错过了什么?是否需要对从大型机传输的文件进行额外的预处理?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-30 23:23:57

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

代码语言:javascript
复制
    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行结束标记的文本文件。这是一个FileOrganisation在JRecord中的描述

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

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

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

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

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

基本上你会这样做:

代码语言:javascript
复制
    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));
    }
票数 3
EN

Stack Overflow用户

发布于 2016-07-31 03:13:14

未来参考/二进制文件

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

RecordEditor 0.98有一个JRecord码生成函数。使用RecordEditor生成函数的优点是

  • Recordeditor将通过查看文件尝试并计算出适当的文件属性
  • 您可以尝试各种属性(左侧窗格),并查看这些属性(右侧)文件的外观。
  • 高兴的时候,点击Generate按钮,RecordEditor就会生成JRecord代码。有几个代码模板可用:
代码语言:javascript
复制
- **Standard** - will generate basic JRecord code (with a field name class
- **lineWrapper** - will generate a "wrapper" class with the Cobol fields represented as get/set methods

RecordEditor生成

RecordEditor选择中,为Cobol生成>>> Java~JRecord代码

生成屏幕

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

代码模板

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

生成码

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38672227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档