Skip to Content
Author's profile photo Dilip Kumar Krishnadev Pandey

SAP PI UDF to compress file and archive

In this blog, SAP PI UDF example is been provided for below functionalities:

  1. To check file names in sap application directory with some starting key words
  2. If file is present, then compress it with zip extension and move it to other directory
  3. Post Archival, delete the file from source path

Java Imports required in UDF as

  • java.io.BufferedReader
    java.io.FileReader
    java.io.IOException
    java.util.zip.ZipEntry
    java.util.zip.ZipOutputStream

Java UDF Execution Type is “All Values of Queue”

Java UDF Code is as below:

public void file_Read_Move_Delete(ResultList result, Container container)
 throws StreamTransformationException{

String RequestDataStr = "XYZ";  	                //File Name Starting Key
String FilePath_str = "/folder1/folder2/";	        //File directory
String FileArchival_Path = "/folder1/folder2/folder2/";	//File Archival Path
String fileContentStr = "";
boolean StartsWithStr_Found = false;
			
File[] dirFiles = new File(FilePath_str).listFiles();
if (dirFiles.length > 0){	              //Check if Directory is not empty			   
 for (int i=0; i<dirFiles.length; i++){	      //Loop Iteration for Each File
  String fileNameStr = dirFiles[i].getName();  //Get File Name
  if (fileNameStr.startsWith(RequestDataStr)){ //Check if Filename starts with Key 'XYZ'
			        	
   StartsWithStr_Found = true;
   File inputFile = new File(FilePath_str  + fileNameStr);
			  			 
   //Start of compression and archival ----------------------
   /*
   If file found, the zip them
   and move them to other folder
   Here each file is been compressed to single zip file
   and Zip Output File Name will be same as of InputfileName, 
   but replacing .CSV extension to .zip
   */
   String OUTPUT_FILE = dirFiles[i].getName() ; 
   OUTPUT_FILE = OUTPUT_FILE.replaceAll(".CSV", "");			
   OUTPUT_FILE = FileArchival_Path + OUTPUT_FILE + ".zip";

   try{
     // Wrap a FileOutputStream around a ZipOutputStream to store the zip stream to a file. Note that this is not absolutely necessary 
     FileOutputStream fileOutputStream = new FileOutputStream(OUTPUT_FILE); 
     ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream); 
			 
     // a ZipEntry represents a file entry in the zip archive 
     // We name the ZipEntry after the original file's name 
     ZipEntry zipEntry = new ZipEntry(inputFile.getName()); 
     zipOutputStream.putNextEntry(zipEntry); 

     FileInputStream fileInputStream = new FileInputStream(inputFile); 
     byte[] buf = new byte[1024]; 
     int bytesRead; 

     // Read the input file by chucks of 1024 bytes 
     // and write the read bytes to the zip stream 
     while ((bytesRead = fileInputStream.read(buf)) > 0){ 
      zipOutputStream.write(buf, 0, bytesRead); 
     } 

     // close ZipEntry to store the stream to the file 
     zipOutputStream.closeEntry(); 
     zipOutputStream.close(); 
     fileOutputStream.close(); 	
   }catch (IOException e) { 
       e.printStackTrace(); 
   }		  
   //End of compression and archival ------------------------
					      		
   result.addValue(fileNameStr + " has been comressed and archived");

   }   //End of "fileName check
 }// End of Folder for loop
}// end of directory length check

if (StartsWithStr_Found = false){
  result.addValue("File not found");
}

}

Assigned Tags

      Be the first to leave a comment
      You must be Logged on to comment or reply to a post.