001: /*
002: * Static File routines.
003: * Copyright (C) 2002 Stephen Ostermiller
004: * http://ostermiller.org/contact.pl?regarding=Java+Utilities
005: *
006: * This program is free software; you can redistribute it and/or modify
007: * it under the terms of the GNU General Public License as published by
008: * the Free Software Foundation; either version 2 of the License, or
009: * (at your option) any later version.
010: *
011: * This program is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
014: * GNU General Public License for more details.
015: *
016: * See COPYING.TXT for details.
017: */
018:
019: package com.Ostermiller.util;
020:
021: import java.io.*;
022: import java.text.MessageFormat;
023: import java.util.ResourceBundle;
024: import java.util.Locale;
025:
026: /**
027: * Utilities for File manipulation.
028: * More information about this class is available from <a target="_top" href=
029: * "http://ostermiller.org/utils/FileHelper.html">ostermiller.org</a>.
030: *
031: * @author Stephen Ostermiller http://ostermiller.org/contact.pl?regarding=Java+Utilities
032: * @since ostermillerutils 1.00.00
033: */
034: public class FileHelper {
035:
036: /**
037: * Locale specific strings displayed to the user.
038: *
039: * @since ostermillerutils 1.00.00
040: */
041: protected static ResourceBundle labels = ResourceBundle.getBundle(
042: "com.Ostermiller.util.FileHelper", Locale.getDefault());
043:
044: /**
045: * Move a file from one location to another. An attempt is made to rename
046: * the file and if that fails, the file is copied and the old file deleted.
047: *
048: * If the destination file already exists, an exception will be thrown.
049: *
050: * @param from file which should be moved.
051: * @param to desired destination of the file.
052: * @throws IOException if an error occurs.
053: *
054: * @since ostermillerutils 1.00.00
055: */
056: public static void move(File from, File to) throws IOException {
057: move(from, to, false);
058: }
059:
060: /**
061: * Move a file from one location to another. An attempt is made to rename
062: * the file and if that fails, the file is copied and the old file deleted.
063: *
064: * @param from file which should be moved.
065: * @param to desired destination of the file.
066: * @param overwrite If false, an exception will be thrown rather than overwrite a file.
067: * @throws IOException if an error occurs.
068: *
069: * @since ostermillerutils 1.00.00
070: */
071: public static void move(File from, File to, boolean overwrite)
072: throws IOException {
073: if (to.exists()) {
074: if (overwrite) {
075: if (!to.delete()) {
076: throw new IOException(MessageFormat.format(labels
077: .getString("deleteerror"),
078: (Object[]) new String[] { to.toString() }));
079: }
080: } else {
081: throw new IOException(MessageFormat.format(labels
082: .getString("alreadyexistserror"),
083: (Object[]) new String[] { to.toString() }));
084: }
085: }
086:
087: if (from.renameTo(to))
088: return;
089:
090: InputStream in = null;
091: OutputStream out = null;
092: try {
093: in = new FileInputStream(from);
094: out = new FileOutputStream(to);
095: copy(in, out);
096: in.close();
097: in = null;
098: out.flush();
099: out.close();
100: out = null;
101: if (!from.delete()) {
102: throw new IOException(MessageFormat.format(labels
103: .getString("deleteoriginalerror"),
104: (Object[]) new String[] { from.toString(),
105: to.toString() }));
106: }
107: } finally {
108: if (in != null) {
109: in.close();
110: in = null;
111: }
112: if (out != null) {
113: out.flush();
114: out.close();
115: out = null;
116: }
117: }
118: }
119:
120: /**
121: * Buffer size when reading from input stream.
122: *
123: * @since ostermillerutils 1.00.00
124: */
125: private final static int BUFFER_SIZE = 1024;
126:
127: /**
128: * Copy the data from the input stream to the output stream.
129: *
130: * @param in data source
131: * @param out data destination
132: * @throws IOException in an input or output error occurs
133: *
134: * @since ostermillerutils 1.00.00
135: */
136: private static void copy(InputStream in, OutputStream out)
137: throws IOException {
138: byte[] buffer = new byte[BUFFER_SIZE];
139: int read;
140: while ((read = in.read(buffer)) != -1) {
141: out.write(buffer, 0, read);
142: }
143: }
144: }
|