/* * File : StreamIO.java * Created : 06-feb-2001 18:30 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2005 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.util; import java.awt.Component; import java.awt.event.*; import java.io.*; import javax.swing.*; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class StreamIO{ private static boolean cancel=false; //public static final int DEFAULT_READ_STEP_SIZE=1024; public static final int DEFAULT_READ_STEP_SIZE=4096; private StreamIO(){ } public static void setCancel(boolean value){ cancel=value; } public interface InputStreamListener{ void notify(InputStream in, int bytesRead); } public static byte[] readInputStream(InputStream is) throws IOException{ return readInputStream(is, null, DEFAULT_READ_STEP_SIZE); } public static byte[] readInputStream(InputStream is, InputStreamListener lst, int stepSize) throws IOException{ cancel=false; BufferedInputStream bufferedStream; if(is instanceof BufferedInputStream) bufferedStream=(BufferedInputStream)is; else bufferedStream = new BufferedInputStream(is); ByteArrayOutputStream os=new ByteArrayOutputStream(); byte[] buffer=new byte[stepSize]; while(!cancel){ //bytesRead=is.read(buffer); int bytesRead=bufferedStream.read(buffer); if(lst!=null) lst.notify(is, bytesRead); if(bytesRead<=0) break; os.write(buffer, 0, bytesRead); Thread.yield(); } buffer=os.toByteArray(); os.close(); //is.close(); bufferedStream.close(); if(cancel) throw new InterruptedIOException("Cancelled by user"); return buffer; } public static byte[] readFile(File file) throws IOException{ return readFile(file, null, 0); } public static byte[] readFile(File file, InputStreamListener lst, int stepSize) throws IOException{ cancel=false; long fileLength = file.length(); if(/*fileLength<1 ||*/ fileLength>Integer.MAX_VALUE) throw new IOException(); int intFileLength=(int)fileLength; byte[] result=new byte[intFileLength]; BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file)); int bytesRead=0; for(int k=0; k<fileLength && !cancel; k+=bytesRead){ int bytesToRead= intFileLength-k; if(stepSize>0 && stepSize<bytesToRead) bytesToRead=stepSize; bytesRead=fis.read(result, k, bytesToRead); if(bytesRead<0) break; if(lst!=null) lst.notify(fis, bytesRead); Thread.yield(); } fis.close(); if(cancel) throw new InterruptedIOException("Cancelled by user"); return result; } public static byte[] getResourceBytes(Object caller, String packageName, String resourceName) throws IOException{ return readInputStream(caller.getClass().getResourceAsStream(packageName+"/"+resourceName)); } public static void writeStreamTo(InputStream is, OutputStream os) throws IOException{ writeStreamTo(is, os, null, DEFAULT_READ_STEP_SIZE); } public static void writeStreamTo(InputStream is, OutputStream os, InputStreamListener lst, int stepSize) throws IOException{ cancel=false; BufferedInputStream bufferedStream; if(is instanceof BufferedInputStream) bufferedStream=(BufferedInputStream)is; else bufferedStream = new BufferedInputStream(is); int bytesRead; byte[] buf = new byte[stepSize]; while(!cancel){ bytesRead=bufferedStream.read(buf, 0, stepSize); if(lst!=null) lst.notify(is, bytesRead); if(bytesRead<=0) break; os.write(buf, 0, bytesRead); Thread.yield(); } bufferedStream.close(); os.flush(); os.close(); if(cancel) throw new InterruptedIOException("Cancelled by user"); } public interface InputStreamProvider{ java.io.InputStream getInputStream(String resourceName) throws Exception; } public static boolean writeStreamDlg(final InputStream is, final OutputStream os, int knownSize, String mainMsg, Component dlgOwner, Options options){ final Messages msg=options.getMessages(); String title=msg.get("WRITING_FILE"); JDialog dialog; if(dlgOwner instanceof java.awt.Dialog) dialog=new JDialog((java.awt.Dialog)dlgOwner, title, true); else if(dlgOwner!=null) dialog=new JDialog(JOptionPane.getFrameForComponent(dlgOwner), title, true); else dialog=new JDialog((JFrame)null, title, true); if(mainMsg!=null) dialog.getContentPane().add(new JLabel(mainMsg)); final JProgressBar progress=new JProgressBar(); if(knownSize>0){ progress.setMinimum(0); progress.setMaximum(knownSize); progress.setIndeterminate(false); } else progress.setIndeterminate(true); InputStreamListener isl=new InputStreamListener(){ public void notify(InputStream in, int bytesRead){ progress.setValue(bytesRead); } }; dialog.getContentPane().add(progress); final InputStreamListener iis=isl; JButton cancelButton=new JButton(msg.get("CANCEL")); cancelButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ev){ cancel=true; } }); dialog.getContentPane().add(cancelButton); dialog.pack(); final JDialog dlg=dialog; edu.xtec.util.SwingWorker sw=new edu.xtec.util.SwingWorker(){ private boolean result=false; @Override public Object construct(){ try{ writeStreamTo(is, os, iis, DEFAULT_READ_STEP_SIZE); result=!cancel; } catch(Exception ex){ result=false; msg.showErrorWarning(dlg, "ERROR", ex); } dlg.setVisible(false); return result; } }; sw.startLater(); dialog.setVisible(true); return ((Boolean)sw.get()).booleanValue(); } public static Object cloneObject(Serializable obj) throws Exception{ ByteArrayOutputStream baos = new ByteArrayOutputStream(512); ObjectOutputStream out = new ObjectOutputStream(baos); out.writeObject(obj); out.close(); ByteArrayInputStream bais=new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream in=new ObjectInputStream(bais); return in.readObject(); } }