在读取大型文件或者其它大批量数据输入操作时希望能够通过一个进度条显示当前的进度现在在Java中非常容易实现仅仅需要几行代码即可Java的swing包提供了ProgressMonitorInputStream类该类提供了自动地弹出进度窗口和事件处理机制
使用这个类也非常方便只需要把任何一个InputStream作为参数构造一个新的ProgressMonitorInputStream类其它不需要任何额外的代码即可实现进度窗口的自动生成ProgressMonitorInputStream类可以和其它InputStream一样使用
ProgressMonitorInputStream类继承层次
[pre]javalangObject
|
+javaioInputStream
|
+javaioFilterInputStream
|
+javaxswingProgressMonitorInputStream[/pre]
构造方法
ProgressMonitorInputStream
(Component parentComponent
Object message InputStream in)
parentComponent 触发被监视操作的组件
message (如果弹出进度显示窗口)
显示在进度显示窗口中的指示信息
in 需要监视的输入流
操作方法
除了在InputStream和FilterInputStream中继承的方法外还增加了如下方法
ProgressMonitor getProgressMonitor()
//得到当前对象使用的ProgressMonitor对象
int read()
int read(byte[] b)
int read(byte[] b int off int len)
void reset()
long skip(long n)
//上面几个方法都是覆盖了FilterInputStream中的方法
因为需要更新进度指示
void close()
//因为需要关闭进度监视对象和窗口
所以覆盖了FilterInputStream父类中的close方法
示例代码:
import javaawtFlowLayout;
import javaawteventActionEvent;
import javaawteventActionListener;
import javaioFileInputStream;
import javaioInputStream;
import javaxswingJButton;
import javaxswingJFrame;
import javaxswingProgressMonitorInputStream;
public class ProgressMonitorTest
{
public static void main(String[] args)
{
// 创建一个包含Click me的窗口
final JFrame f =
new JFrame(ProgressMonitor Sample);
fgetContentPane()setLayout(new FlowLayout());
JButton b = new JButton(Click me);
fgetContentPane()add(b);
fpack();
// 设置按钮的动作事件
baddActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
// 这儿使用了新的线程处理按钮的动作事件
因为我们需要
//主窗口的线程响应用户这样你可以多次点击该按钮
//会启动多个读取文件的线程主窗口也保持响应
new Thread()
{
public void run()
{
try {
// 打开文件输出流
把InputStream包装在ProgressMonitorInputStream中
//在当前目录中需要放置一个大文件建议超过M
InputStream in = new FileInputStream(bigfiledat);
ProgressMonitorInputStream pm =
new ProgressMonitorInputStream(fReading a big filein);
// 读取文件如果总耗时超过秒
将会自动弹出一个进度监视窗口
// 显示已读取的百分比
int c;
while((c=pmread()) != )
{
// 处理代码
}
pmclose();
}
catch(Exception ex)
{
exprintStackTrace();
}
}
}start();
}});
// 设置缺省的窗口关闭行为并显示窗口
fsetDefaultCloseOperation
(JFrameEXIT_ON_CLOSE);
fsetVisible(true);
}
}