• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
  • Campbell Ritchie
  • Devaka Cooray
  • Ron McLeod
  • Paul Clapham
  • Liutauras Vilda
  • paul wheaton
  • Jeanne Boyarsky
  • Tim Cooke
Saloon Keepers:
  • Stephan van Hulst
  • Tim Holloway
  • Tim Moores
  • Mikalai Zaikin
  • Carey Brown

Process p .waitFor() waits for ever please give suggestions

Posts: 2
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Dear Members,

I am trying to run a perl script from java code that generates a log file on file system and populates the date in to mysql table.In java code while calling method Process p .waitFor(), the java program will hangs up and i am also using p.destroy() method but no further code will be executed.The process will wait forever. I have also seen that the perl file is being executed as it generates a log file with some data but it never completes I am using Windows Xp platform and jdk 1.5. But when i explicitly terminates the java program the log file will be generated immediately and data will be populated in mysql table.
My java program simple converts xls file to csv and then this csv file is passed as an argument for perl script file.

My java code is written below:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.read.biff.BiffException;

public class ConvertXLSTOCSV
private static MyLogger lLog = MyLogger.getLogger();

public boolean convertXLSTOCSV(String xmlfilePath, String xlsFilename)
boolean conversionDoneFlag=false;
String csvFileName="";
String csvFilePath = "";
csvFilePath = xmlfilePath.substring(0, xmlfilePath.lastIndexOf("/"));
csvFilePath = csvFilePath+"/csv/";
lLog.info("csvFilePath :"+csvFilePath);

xlsFilename = xlsFilename.replaceAll(" ", "_");
csvFileName = xlsFilename.replaceAll(".xls", ".csv");
csvFileName = csvFilePath+csvFileName;
lLog.info("csvFileName : "+csvFileName);
xmlfilePath = xmlfilePath+"/"+xlsFilename;
lLog.info("xmlfilePath : "+xmlfilePath);

//File to store data in form of CSV
File f = new File(csvFileName);

OutputStream os = null;
try {
os = (OutputStream)new FileOutputStream(f);
} catch (FileNotFoundException e1) {
lLog.info("FileNotFoundException occurs");
//String encoding = "UTF8";
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);

//Excel document to be imported
String filename = xmlfilePath;
lLog.info("XLS File path : "+filename);
WorkbookSettings ws = new WorkbookSettings();
ws.setLocale(new Locale("en", "EN"));
Workbook w;
try {
w = Workbook.getWorkbook(new File(filename),ws);

// Gets the sheets from workbook
for (int sheet = 0; sheet < w.getNumberOfSheets(); sheet++)
Sheet s = w.getSheet(sheet);
Cell[] row = null;

// Gets the cells from sheet
// Gets the cells from sheet
for (int i = 0; i < s.getRows(); i++) {
row = s.getRow(i);
lLog.info("Row_no="+i+", row_length="+row.length);
// Fetching cell values
for (int j = 0 ; j < row.length; j++) {
String cellValue=row[j].getContents();
Pattern p = Pattern.compile("[\\n\\r\\t]");
Matcher m = p.matcher("");
String result = m.replaceAll("");
lLog.info("Coloumn index ="+j+"and its value\""+result+"\"");


lLog.info("Conversion completed");
} catch (BiffException e) {
lLog.info("BiffException occurs while Conversion");
}catch (UnsupportedEncodingException e){
}catch (IOException e){

// Call script to insert in temporary table
String pl_file = "";

lLog.info("going to execute perl file");
pl_file = "power_gen_report.pl";;
lLog.info("Perl file path :"+pl_file);

String cmdLine[] = { "perl", "-f", pl_file, csvFileName };
lLog.info("Perl command :"+"perl -f "+pl_file+" "+csvFileName );
Runtime rt= Runtime.getRuntime();
Process p = rt.exec(cmdLine);
InputStream in = p.getInputStream();
InputStream err = p.getErrorStream();
boolean finished = false; // Set to true when p is finished
while( !finished) {
try {
while( in.available() > 0) {
// Print the output of our system call.
Character c = new Character( (char) in.read());
while( err.available() > 0) {
// Print the output of errors
Character c = new Character( (char) in.read());
int exitVal;
try {
exitVal = p.waitFor();
//int exitVal = p.exitValue();
finished = true;
System.out.println("finished = "+finished);

if(exitVal == 0){
lLog.info("perl file executed sucessfully :"+pl_file);
lLog.info("Table Populated sucessfully if csv file has new records\n");
lLog.info("Table not Populated : Due to records in csv file are already present in table\n");
lLog.info("Exit Value returns from perl file : "+exitVal);

} catch (InterruptedException e) {

} catch (IllegalThreadStateException e) {
// Sleep a little to save on CPU cycles
try {
} catch (InterruptedException e1) {
lLog.info("InterruptedException occurs ");
}catch(IOException e){
lLog.info("IOException occurs ");


return conversionDoneFlag;

public static void main(String[] args){

System.out.println("Executing main() method ");
ConvertXLSTOCSV dv =new ConvertXLSTOCSV();
boolean ad = dv.convertXLSTOCSV("d:/attachment/excel","Technical_Associates_Ltd.16-06-2010.xls";);
if(ad== true){
System.out.println("Conversion completed");
System.out.println("Conversion not completed");


Please help me!.as i am unable to sort out this problem.
I will be very thankful to you for the same

Ranch Hand
Posts: 423
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
You must read from output and err streams of your process from separate threads to avoid system buffers overflow.
Read this article: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=2
Rakesh Shukla
Posts: 2
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
I have already read that but i never understood the reason foe hang up. Please do the need ful if any.
I will be vbery thanks ful to ypu for the same
Don't destroy the earth! That's where I keep all my stuff! Including this tiny ad:
a bit of art, as a gift, that will fit in a stocking
    Bookmark Topic Watch Topic
  • New Topic