001: /*
002: * Author: Chris Seguin
003: *
004: * This software has been developed under the copyleft
005: * rules of the GNU General Public License. Please
006: * consult the GNU General Public License for more
007: * details about use and distribution of this software.
008: */
009: package org.acm.seguin.io;
010:
011: import java.io.File;
012: import java.io.FileInputStream;
013: import java.io.FileOutputStream;
014: import java.io.IOException;
015: import java.io.InputStream;
016: import java.io.OutputStream;
017:
018: import org.acm.seguin.awt.ExceptionPrinter;
019:
020: /**
021: * Responsible for copying a file from one location to another. This object
022: * is implemented as a thread so that if the user of this object does not
023: * care when the copy is complete, they can set the parameters and then
024: * launch the thread. <P>
025: *
026: * To perform other operations on the streams while copying the thread,
027: * simply overload the getInputStream or getOutputStream operations.
028: *
029: *@author Chris Seguin
030: *@author Mike Atkinson
031: *@date May 12, 1999
032: */
033: public class FileCopy implements Runnable {
034: // Instance Variables
035: private File source;
036: private File dest;
037: private boolean noisy;
038:
039: /**
040: * Constructor for the FileCopy object
041: *
042: *@param src the source
043: *@param dst the destination
044: */
045: public FileCopy(File src, File dst) {
046: source = src;
047: dest = dst;
048: noisy = true;
049: }
050:
051: /**
052: * Create a file copy thread
053: *
054: *@param src the source
055: *@param dst the destination
056: *@param isNoisy is this thread supposed to report on it's progress
057: */
058: public FileCopy(File src, File dst, boolean isNoisy) {
059: source = src;
060: dest = dst;
061: noisy = isNoisy;
062: }
063:
064: /**
065: * Copy the thread
066: */
067: public synchronized void run() {
068: try {
069: if (noisy) {
070: System.out.println("Copying from "
071: + source.getCanonicalPath() + " to "
072: + dest.getCanonicalPath());
073: }
074:
075: InputStream fis = getInputStream();
076: OutputStream fos = getOutputStream();
077: int bufferSize = 1024 * 8 * 4;
078: byte[] buffer = new byte[bufferSize];
079:
080: int bytesRead;
081: while ((bytesRead = fis.read(buffer)) >= 0) {
082: fos.write(buffer, 0, bytesRead);
083: }
084:
085: fos.close();
086: fis.close();
087: } catch (IOException ioe) {
088: ExceptionPrinter.print(ioe, false);
089: }
090: }
091:
092: /**
093: * Gets the InputStream attribute of the FileCopy object
094: *
095: *@return The InputStream value
096: *@exception FileNotFoundException Unable to open the file
097: */
098: protected synchronized InputStream getInputStream()
099: throws IOException {
100: return new FileInputStream(source);
101: }
102:
103: /**
104: * Gets the OutputStream attribute of the FileCopy object
105: *
106: *@return The OutputStream value
107: *@exception FileNotFoundException Unable to open the file
108: */
109: protected synchronized OutputStream getOutputStream()
110: throws IOException {
111: File parent = dest.getParentFile();
112: if ((parent != null) && !parent.exists()) {
113: parent.mkdirs();
114: }
115:
116: return new FileOutputStream(dest);
117: }
118:
119: /**
120: * Tester
121: *
122: *@param args The command line arguments
123: */
124: public static void main(String[] args) {
125: if (args.length < 2) {
126: System.out.println("Syntax: FileCopy source dest");
127: return;
128: }
129:
130: (new FileCopy(new File(args[0]), new File(args[1]))).run();
131: }
132: }
|