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
Le classi I/O JZOS supportano diversi modelli di I/O quando si utilizzano set di dati MVS.
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

Leggere un dataset in modalità flusso di testo utilizzando la classe FileFactory :
BufferedReader rdr = FileFactory.newBufferedReader("//DD:INPUT"); 
try {
  String line;
  while ((line = rdr.readLine()) != null) { System.out.println(line);
  }
} finally { 
  rdr.close();
}
Elaborare un dataset in modalità flusso binario utilizzando la classe Zfile :
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();
}
Leggere un dataset in modalità record utilizzando un oggetto RecordReader :
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();
  }
}
Creare un dataset e scrivervi utilizzando un oggetto RecordWriter :
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
  }
}