ProgressMonitorInputStream

Swing类包中有一个很有用的流过滤器,ProgressMonitorInputStream,它可以自动弹出一个对话框,监视已经读取了多少流。

进度监视器流使用InputStream类的available方法来确定流中的总字节数。不过available方法只报告流中可访问的、未中断的字节数。
进度监视器适用于文件以及HTTP URL,因为它们的长度都是事先可知道的,但它不适用于所有的流。

package swing.progress;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ProgressMonitorInputStream;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

/*2015-7-6*/
public class ProgressMonitorInputStreamTest {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame frame = new TextFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
                frame.setLocationRelativeTo(null);
            }
        });
    }

}

class TextFrame extends JFrame {
    private static final long serialVersionUID = 1L;

    private JMenuItem openItem;
    private JMenuItem exitItem;
    private JTextArea textArea;
    private JFileChooser chooser;
    public static final int DEFAULT_WIDTH = 300;
    public static final int DEFAULT_HEIGHT = 200;

    public TextFrame() {
        setTitle("ProgressMonitorInputStreamTest");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

        textArea = new JTextArea();
        add(new JScrollPane(textArea));

        chooser = new JFileChooser();
        chooser.setCurrentDirectory(new File("."));

        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);
        JMenu fileMenu = new JMenu("File");
        menuBar.add(fileMenu);
        openItem = new JMenuItem("Open");
        openItem.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    openFile();
                } catch (FileNotFoundException e1) {
                    e1.printStackTrace();
                }

            }
        });

        fileMenu.add(openItem);
        exitItem = new JMenuItem("Exit");
        exitItem.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        fileMenu.add(exitItem);

    }

    protected void openFile() throws FileNotFoundException {
        int r = chooser.showOpenDialog(this);
        if (r != JFileChooser.APPROVE_OPTION) {
            return;
        }

        File f = chooser.getSelectedFile();

        FileInputStream fileIn = new FileInputStream(f);
        ProgressMonitorInputStream progressIn = new ProgressMonitorInputStream(this, "Reading " + f.getName(), fileIn);
        final Scanner in = new Scanner(progressIn);
        textArea.setText("");
        SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {

            @Override
            protected Void doInBackground() throws Exception {
                while (in.hasNextLine()) {
                    String line = in.nextLine();
                    textArea.append(line);
                    textArea.append("\n");
                }
                in.close();
                return null;
            }

        };
        worker.execute();
    }

}
时间: 2024-11-15 06:42:59

ProgressMonitorInputStream的相关文章

Java HttpURLConnection 抓取网页内容 解析gzip格式输入流数据并转换为String格式字符串

最近GFW为了刷存在感,搞得大家是头晕眼花,修改hosts 几乎成了每日必备工作. 索性写了一个小程序,给办公室的同事们分享,其中有个内容 就是抓取网络上的hosts,废了一些周折. 我是在一个博客上抓取的.但是这位朋友的博客应该是在做防盗链,但他的方式比较简单就是5位数的一个整形随机数.这里折腾一下就ok了. 要命的是他这个链接的流类型 居然是gzip.这个郁闷好久,一直以为是编码格式导致解析不出来结果,后来发现是gzip搞的. 主要的一段代码做个记录吧. 1 /** 2 * 网络工具类 用于

《Java核心技术卷二》笔记(一)流与文件

一.流的概念 在Java中,可以提供字节序列的对象,或者可以接收字节序列的对象,都可以抽象成流.系统中的文件,网络,内存这些设备都可以读入或者写入字节,自然也可以用流的方式来操作.能向程序中提供字节序列,即可以从其中读入字节序列,这样的对象显然就是输入流.相反的,能够接收程序送来的字节序列,也就是可以向其中写入字节序列,就是输出流. Java提供丰富的流类家族,实现了各种常用的输入输出操作功能,如文件.内存读写等.InputStream和OutputStream类分别是字节输入/输出流继承体系的

接口 Closeable

java.io 接口 Closeable public interface Closeable Closeable 是可以关闭的数据源或目标.调用 close 方法可释放对象保存的资源(如打开文件). 从以下版本开始:1.5 方法摘要  void  close() 关闭此流并释放与此流关联的所有系统资源. 方法详细信息 close void close() throws IOException 关闭此流并释放与此流关联的所有系统资源.如果已经关闭该流,则调用此方法无效. 抛出: IOExcept

输入输出处理 上

第九章 输入输出处理 9.1 I/O流的概念和划分 9.1.1数据流是一组有顺序的.有起点和终点的字节集合,是对输入和输出的总称和抽象.一般地,数据流分为输入流(InputStream)和输出流(OutputStream).输入流只能读,不能写,而输出流只能写不能读 9.1.2 Java流的划分 Java2定义了两种流:字节流和字符流.字节流为处理字节的输入和输出提供了方便的方法.字符流为字符的输入和输出处理提供了方便.它们采用了统一的编码标准,因而可以国际化.在某些场合,字符流比字节流更有效.

java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端

java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端 启动界面如下图: 首先启动服务器: 客户端登陆,登陆成功后为: 默认发送是全部用户,是多人发送. 当在边列表里面选择了用户后,可以与此用户建立点对点链接进行聊天,可以发送文件. 用户在线离线状态会实时更新,如果离线,则存为离线消息.当下次上线的时候,会接受到离线消息 从一个用户接受文件的同时,还可以接受从服务器发过来的文件 接受文件完成后,显示记录,并显示保存目录 消息发送演示 服务器端代码: 1 im

java中经常使用的Swing组件总结

(一): 基本交互组件:获取用户的输入或者显示状态的简单组件. 1. 按钮(JButton):文本可提示快捷键,可相对图标任意放置,使用ActionListener: 2. 复选框(JCheckBox):可以选中或取消,使用ItemListener,复选框和单选钮都是开关钮JToggleButton的子类. 3. 组合框(JComboBox):可以从多个选项中选择一个或自编辑,可用数组.集合或模型ComboBoxModel构造,通过getSelected(Index|Item)判断选中项,使用I

20165330 2017-2018-2 《Java程序设计》第5周学习总结

课本知识总结 第七章 内部类与异常类 内部类:类的一种成员 外嵌类:包含内部类的类称为内部类的外嵌类 二者关系: 内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法. 内部类的类体中不可以声明类变量和类方法.外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员. 内部类仅供它的外嵌类使用,其他类不可以用某个类的内部类声明对象. 内部类可以修饰为static内部类 static内部类不能操作外嵌类中的实例成员变量 内部类对应的字节码文件名字格式:外嵌类名$内部类名

20165230 2017-2018-2 《Java程序设计》第5周学习总结

20165230 2017-2018-2 <Java程序设计>第5周学习总结 教材学习内容总结 第七章 内部类与异常类 内部类与外嵌类 可以在类中定义另一个类,即内部类 包含内部类的类为内部类的外嵌类 外嵌类的成员变量在内部类中有效,类体中可用内部类声明对象 内嵌类的类体中不可以声明类变量和类方法,内部类中的方法可调用外嵌类的方法 内部类仅供外嵌类使用 内部类可为static内部类,即可用外嵌类.内部类的访问内部类,不可操作外嵌类中的实例成员变量 匿名类 创建和子类有关的匿名类对象: new