I/O di file e set di dati MVS
MVS set di dati I/O
È possibile utilizzare il pacchetto java.io standard per accedere solo ai file nel file system HFS o zFS . Il toolkit JZOS integra questo pacchetto fornendo classi che consentono alle applicazioni Java™ di interagire con i set di dati dell' MVS. I programmi Java possono utilizzare JZOS per accedere a qualsiasi set di dati dell' MVS e supportato dalla libreria C/C++, inclusi i seguenti tipi:
- PDS (Partitioned Data Set)
- PDSE (Partitioned Data Set Extended)
- File sequenziali
- File ad accesso sequenziale virtuale ( VSAM ) di tipo KSDS, RRDS o ESDS
- Modalità di registrazione
- Ogni lettura o scrittura elabora un singolo record di un dataset.
- Modalità flusso
- I record del dataset vengono presentati come un flusso di byte. Ogni operazione di lettura o scrittura legge una parte di tali byte, indipendentemente dai limiti dei record. La modalità stream ha due tipi:
- Modalità di testo (flusso): i record del dataset vengono convertiti in un flusso di byte e un delimitatore di record di "nuova riga" viene posizionato nel flusso tra i record, dopo la rimozione degli spazi finali.
- Modalità binaria (flusso): i record del dataset vengono posizionati nel flusso così come sono, senza separatori di record.
Accesso al dataset generale con la classe ZFile
La classe com.ibm.jzos.Zfile JZOS è una classe generica che racchiude le routine di I/O della libreria z/OS® C/C++, fopen(), fread() fwrite(),, e così via, per accedere ai set di dati MVS in modalità stream (testo o binario) e in modalità record. La documentazione API per la classe ZFile fa riferimento a ciascuna routine I/O della libreria C/C++ richiamata, in modo che sia possibile consultare direttamente la documentazione per queste routine. Vedere il riferimento alla libreria runtime di z/OS XL C/C++ e la guida alla programmazione di z/OS XL C/C++.
I/O del file di testo indipendente dal sistema operativo con classe FileFactory
La classe com.ibm.jzos.FileFactory JZOS consente la creazione portatile di flussi, lettori e scrittori su file POSIX /DOS (utilizzando il java.io pacchetto) o set di dati MVS (utilizzando la ZFile classe in modalità testo). La classe FileFactory determina quale file system sottostante utilizzare in base al nome file, in modo che un'applicazione portabile possa essere configurata in fase di runtime per utilizzare il nome file o il file system appropriato.
I/O record dataset ad alta velocità con le classi RecordReader e RecordWriter
Le classi com.ibm.jzos.RecordReader e com.ibm.jzos.RecordWriter forniscono un'interfaccia ad alte prestazioni per la lettura e la scrittura di dataset sequenziali in modalità record. Queste classi utilizzano il BSAM (basic sequential access method) nativo di z/OS per l'interazione del dataset. Considerare l'utilizzo di queste classi quando un'applicazione Java richiede I/O in modalità di registrazione ad alte prestazioni. In alcuni casi, queste classi possono fornire una riduzione del 60-70% nell'utilizzo della CPU rispetto alla classe ZFile . I migliori risultati delle classi RecordReader e RecordWriter vengono visualizzati su dataset con un fattore di blocco relativamente grande.
Consigli sull'utilizzo
- Per accedere ai set di dati MVS con uno stream di fil POSIX, utilizzare la ZFile classe (o la classe più semplice FileFactory e indipendente dal sistema operativo, se è richiesto solo l'accesso in modalità testo).
- Per l'accesso in modalità di registrazione sequenziale ai dataset (testo e binario), utilizzare le classi RecordReader e RecordWriter . Utilizzare la classe ZFile nei casi in cui le applicazioni richiedono una funzionalità non fornita da queste classi (come il posizionamento).
- Per l'accesso generalizzato ai set di dati dell' VSAM (KSDS, RRDS o ESDS), utilizzare la ZFile classe. I seguenti esempi illustrano alcuni casi di utilizzo comuni.
Esempi
BufferedReader rdr = FileFactory.newBufferedReader("//DD:INPUT");
try {
String line;
while ((line = rdr.readLine()) != null) { System.out.println(line);
}
} finally {
rdr.close();
}SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
MyDocumentHandler handler = new MyDocumentHandler();
ZFile zFile = new Zfile("//MY.XML.DATA", "rb");
try {
parser.parse(zFile.getInputStream(), handler);
} finally {
zFile.close();
}RecordReader reader = null;
try {
reader = RecordReader.newReader("//my.dataset", ZFileConstants.FLAG_DISP_SHR);
byte[] recordBuf = new byte[reader.getLrecl()];
while ((bytesRead = reader.read(recordBuf)) >= 0) {
...
}
} finally {
if (reader != null) {
reader.close();
}
}String ddname = ZFile.allocDummyDDName();
String cmd = "alloc fi("+ddname+") da(HLQ.MYDATA) reuse new catalog msg(2)"
+ " recfm(f,b) space(100,50) cyl"
+ " lrecl(80)";
ZFile.bpxwdyn(cmd); // might throw RcException
RecordWriter writer = null;
try {
writer = RecordWriter.newWriterForDD(ddname);
byte[] recordBuf = new byte[writer.getLrecl()];
int bytesToWrite;
while ((bytesToWrite = getNextAppRecord(recordBuf)) > 0) {
writer.write(recordBuf, 0, bytesToWrite);
}
} finally {
if (writer != null) {
try {
writer.close();
} catch (ZFileException zfe) {
zfe.printStackTrace(); // but continue
}
}
try {
ZFile.bpxwdyn("free fi(" + ddname + ") msg(2)");
} catch (RcException rce) {
rce.printStackTrace(); // but continue
}
}