我试图使用JRecord库在eclipse应用程序中显示大型机文件,我已经将copybook作为文本文件。为了达到这个目的,
但我抵消了一些问题,因为一些特殊的特点。以下是问题所在
代码片段:
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();
}我在这里错过了什么?是否需要对从大型机传输的文件进行额外的预处理?
发布于 2016-07-30 23:23:57
如果是带有\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行结束标记的文本文件。这是一个FileOrganisation在JRecord中的描述。
不过,如果“数据”中有\n的“数据”,则end-of-line.将被视为特殊字符。如果是VB文件,您可能需要进行二进制传输,并保留RDW (记录描述符-Word)。
如果文件包含二进制数据,则需要:
我将添加第二个使用RecordEditor生成代码的答案
如果您绝对确定所有记录都是相同的长度,则可以使用低级例程来进行读取,请参阅https://sourceforge.net/p/jrecord/discussion/678634/thread/4b00fed4/中的https://sourceforge.net/p/jrecord/discussion/678634/thread/4b00fed4/程序。
基本上你会这样做:
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-31 03:13:14
未来参考/二进制文件
如果文件确实包含二进制数据,则确实需要执行二进制传输。您可能会发现RecordEditor很有用。
RecordEditor 0.98有一个JRecord码生成函数。使用RecordEditor生成函数的优点是
- **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代码。

https://stackoverflow.com/questions/38672227
复制相似问题