Solved

slow

Posted on 2001-06-25
7
234 Views
Last Modified: 2008-02-26
I am reading standard output from a child process using getInputStream. The standard output is empty. However, it spends a lot of time reading it (30-40 seconds). What is the problem and How do I fix it?
Thanks.
------------

Process p=Runtime.getRuntime().exec(cmd);
InputStream is = p.getInputStream();
int c;
while((c=is.read())!=-1)System.out.print((char)c);
......
0
Comment
Question by:menubar
  • 4
  • 3
7 Comments
 
LVL 7

Accepted Solution

by:
Igor Bazarny earned 50 total points
ID: 6225133
Hi,

How much time takes process execution? I believe that is.read() will wait till precess out stream gets closed which happens typically on exit.

Regards,
Igor Bazarny,
Brainbench MVP for Java 1
www.brainbench.com
0
 

Author Comment

by:menubar
ID: 6225231
You are correct.
Can you also answer me this question?
The method "read()" is an abstract method inside the abstract class InputStream. API doc says the abstract method has to be implemented in a subclass.
However, I never sub-class InputStream. All I did is

InputStream is = p.getInputStream();
.. is.read()...

Who implemented "read()", how does this work?
0
 
LVL 7

Expert Comment

by:Igor Bazarny
ID: 6225420

Real class of the object returned from getInputStream() is not java.io.InputStream, but subclass which implements read() in some way--in this case in a way that makes program output available. Typically you don't need to subclass InputStream--there are plenty of subclasses to choose from. And you don't need to know precise class at compile time--what code will be executed in this case determined at runtime, because method is virtual (like most java instance methods).
0
Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 

Author Comment

by:menubar
ID: 6225498
Sorry, I still dont understand.
getInputStream() is a method of Class Process. The doc says:
public abstract InputStream getInputStream()
The link of InputStream leads to java.io.InputStream.

>And you don't
need to know precise class at compile time--what code will be executed in this case determined at runtime,
because method is virtual (like most java instance methods).

Can you explain more? I'll up the points to 50. Thanks.
0
 
LVL 7

Expert Comment

by:Igor Bazarny
ID: 6225560
OK.

It's an example of polymorphism, one of the basic notions of OO programming. When in your code you have variable of base class type (InputStream), it may hold (and will hold, because InputStream is abstract class) a reference to an instance of subclass (e.g. FileInputStream). When you call read(), sequence of bytecodes to be executed determined by actual class of that instance (FileInputStream). Situation is same with function result. You need not know precise type of getInputStream() result. All you need to know is that is subclass of InputStream and must implement method read(). Try to add the following line somewhere after getInputStream() call:

System.out.println(is.getClass());

Does that make question more clear?

Regards,
Igor Bazarny

 
0
 

Author Comment

by:menubar
ID: 6227531
One last clafication:
what determines the instance of which subclass to be returned by getInputStream()? (Since InputStream has many subclasses, which I suppose can have different methods of their own.)
0
 
LVL 7

Expert Comment

by:Igor Bazarny
ID: 6228566
getInputStream() implementation is free to choose which subclass to return.
0

Featured Post

Active Directory Webinar

We all know we need to protect and secure our privileges, but where to start? Join Experts Exchange and ManageEngine on Tuesday, April 11, 2017 10:00 AM PDT to learn how to track and secure privileged users in Active Directory.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
hibernate example using maven 12 59
Desingning Refactoring existing code 2 26
Adding multiple JVM environments to RedHat 6 7 48
Bot application - advice 3 38
Java contains several comparison operators (e.g., <, <=, >, >=, ==, !=) that allow you to compare primitive values. However, these operators cannot be used to compare the contents of objects. Interface Comparable is used to allow objects of a cl…
Introduction This article is the last of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article covers our test design approach and then goes through a simple test case example, how …
Viewers learn about the “for” loop and how it works in Java. By comparing it to the while loop learned before, viewers can make the transition easily. You will learn about the formatting of the for loop as we write a program that prints even numbers…
Viewers will learn about basic arrays, how to declare them, and how to use them. Introduction and definition: Declare an array and cover the syntax of declaring them: Initialize every index in the created array: Example/Features of a basic arr…

828 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question