ProgressMonitorInputStream creates an instance of ProgressMonitor (last example). The progress of reading an input stream is automatically shown when necessary.
Example
public class ProgressMonitorInputStreamExample {
public static void main(String[] args) throws IOException {
JFrame frame = createFrame("ProgressMonitorInputStream Example");
JButton button = new JButton("read file");
button.addActionListener(createReadFileListener(frame));
button.setEnabled(true);
frame.add(button, BorderLayout.NORTH);
frame.setVisible(true);
}
private static ActionListener createReadFileListener(Component parent) throws IOException {
File file = createTestFile();
file.deleteOnExit();
//for progress dialog title
UIManager.put("ProgressMonitor.progressText", "Reading a test file");
return (ae) -> {
new Thread(() -> {
ProgressMonitorInputStream pMonitorInputStream;
try (BufferedInputStream bis = new BufferedInputStream(
pMonitorInputStream = new ProgressMonitorInputStream(
parent,
"Reading " + file.getName(),
new FileInputStream(file)))) {
ProgressMonitor progressMonitor = pMonitorInputStream.getProgressMonitor();
progressMonitor.setMillisToDecideToPopup(100);
progressMonitor.setMillisToPopup(100);
byte[] buffer = new byte[2048];
while ((bis.read(buffer)) != -1) {
System.out.println(new String(buffer));
progressMonitor.setNote(bis.available()/1000+ " more kb to read.");
//simulating some processing delay
Thread.sleep(2);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}).start();
};
}
private static File createTestFile() throws IOException {
Path testPath = Files.createTempFile("test", ".txt");
String textData = IntStream.range(1, 1000000)
.mapToObj(Integer::toString)
.collect(Collectors.joining());
Files.write(testPath, textData.getBytes());
return testPath.toFile();
}
public static JFrame createFrame(String title) {
JFrame frame = new JFrame(title);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(new Dimension(800, 700));
return frame;
}
}