All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.uberfire.java.nio.file.Files Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2012 JBoss Inc
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.uberfire.java.nio.file;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.PatternSyntaxException;

import org.uberfire.java.nio.IOException;
import org.uberfire.java.nio.channels.SeekableByteChannel;
import org.uberfire.java.nio.file.attribute.BasicFileAttributeView;
import org.uberfire.java.nio.file.attribute.BasicFileAttributes;
import org.uberfire.java.nio.file.attribute.FileAttribute;
import org.uberfire.java.nio.file.attribute.FileAttributeView;
import org.uberfire.java.nio.file.attribute.FileTime;
import org.uberfire.java.nio.file.attribute.PosixFilePermission;
import org.uberfire.java.nio.file.attribute.UserPrincipal;
import org.uberfire.java.nio.file.spi.FileSystemProvider;

import static java.util.Collections.*;
import static org.uberfire.java.nio.file.AccessMode.*;
import static org.uberfire.commons.util.Preconditions.*;

/**
 * Back port of JSR-203 from Java Platform, Standard Edition 7.
 * @see Original JavaDoc
 */
public final class Files {

    //TODO remove it
    private static File BASE_TEMP_DIR = new File(System.getProperty("java.io.tmpdir"));
    private static final Path TEMP_PATH = Paths.get(BASE_TEMP_DIR.toURI());

    private static final Set CREATE_NEW_FILE_OPTIONS = EnumSet.of(StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE);

    /**
     * Maximum loop count when creating temp directories.
     */
    private static final int TEMP_DIR_ATTEMPTS = 10000;

    private static final int BUFFER_SIZE = 8192;

    private Files() {
    }

    // internal shortcut
    private static FileSystemProvider providerOf(final Path path) {
        return path.getFileSystem().provider();
    }

    //contents

    /**
     * @throws IllegalArgumentException
     * @throws UnsupportedOperationException
     * @throws NoSuchFileException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static InputStream newInputStream(final Path path, final OpenOption... options)
            throws IllegalArgumentException, NoSuchFileException, UnsupportedOperationException, IOException, SecurityException {
        checkNotNull("path", path);

        return providerOf(path).newInputStream(path, options);
    }

    /**
     * @throws IllegalArgumentException
     * @throws UnsupportedOperationException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static OutputStream newOutputStream(final Path path, final OpenOption... options)
            throws IllegalArgumentException, UnsupportedOperationException, IOException, SecurityException {
        checkNotNull("path", path);

        return providerOf(path).newOutputStream(path, options);
    }

    /**
     * @throws IllegalArgumentException
     * @throws UnsupportedOperationException
     * @throws FileAlreadyExistsException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static SeekableByteChannel newByteChannel(final Path path, final OpenOption... options)
            throws IllegalArgumentException, UnsupportedOperationException, FileAlreadyExistsException,
            IOException, SecurityException {
        checkNotNull("path", path);

        final Set set = new HashSet(options.length);
        addAll(set, options);
        return newByteChannel(path, set);
    }

    /**
     * @throws IllegalArgumentException
     * @throws UnsupportedOperationException
     * @throws FileAlreadyExistsException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static SeekableByteChannel newByteChannel(final Path path,
            final Set options, final FileAttribute... attrs)
            throws IllegalArgumentException, UnsupportedOperationException, FileAlreadyExistsException,
            IOException, SecurityException {
        checkNotNull("path", path);
        checkNotNull("options", options);

        return providerOf(path).newByteChannel(path, options, attrs);
    }

    //directories

    /**
     * @throws IllegalArgumentException
     * @throws NotDirectoryException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static DirectoryStream newDirectoryStream(final Path dir)
            throws IllegalArgumentException, NotDirectoryException, IOException, SecurityException {
        checkNotNull("dir", dir);

        return newDirectoryStream(dir, new DirectoryStream.Filter() {
            @Override public boolean accept(Path entry) throws IOException {
                return true;
            }
        });
    }

    //TODO impl
    public static DirectoryStream newDirectoryStream(final Path dir, final String glob)
            throws IllegalArgumentException, UnsupportedOperationException, PatternSyntaxException, NotDirectoryException, IOException, SecurityException {
        checkNotNull("dir", dir);
        checkNotEmpty("glob", glob);

        if (!isDirectory(dir)) {
            throw new NotDirectoryException(dir.toString());
        }

        throw new UnsupportedOperationException("feature not available");
    }

    /**
     * @throws IllegalArgumentException
     * @throws NotDirectoryException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static DirectoryStream newDirectoryStream(final Path dir, final DirectoryStream.Filter filter)
            throws IllegalArgumentException, NotDirectoryException, IOException, SecurityException {
        checkNotNull("dir", dir);
        checkNotNull("filter", filter);

        return providerOf(dir).newDirectoryStream(dir, filter);
    }

    //creation and deletion

    /**
     * @throws IllegalArgumentException
     * @throws UnsupportedOperationException
     * @throws FileAlreadyExistsException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static Path createFile(final Path path, final FileAttribute... attrs)
            throws IllegalArgumentException, UnsupportedOperationException,
            FileAlreadyExistsException, IOException, SecurityException {
        checkNotNull("path", path);

        try {
            newByteChannel(path, CREATE_NEW_FILE_OPTIONS, attrs).close();
        } catch (java.io.IOException e) {
            throw new IOException(e);
        }

        return path;
    }

    /**
     * @throws IllegalArgumentException
     * @throws UnsupportedOperationException
     * @throws FileAlreadyExistsException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static Path createDirectory(final Path dir, final FileAttribute... attrs)
            throws IllegalArgumentException, UnsupportedOperationException,
            FileAlreadyExistsException, IOException, SecurityException {
        checkNotNull("dir", dir);

        providerOf(dir).createDirectory(dir, attrs);

        return dir;
    }

    public static Path createDirectories(final Path dir, final FileAttribute... attrs)
            throws UnsupportedOperationException, FileAlreadyExistsException, IOException, SecurityException {
        checkNotNull("dir", dir);

        final Path absoluteDir = dir.toAbsolutePath();

        if (!notExists(absoluteDir)) {
            throw new FileAlreadyExistsException(absoluteDir.toString());
        }

        Path parent = absoluteDir.getParent();

        while (parent != null) {
            try {
                providerOf(parent).checkAccess(parent);
                break;
            } catch (NoSuchFileException x) {
            }
            parent = parent.getParent();
        }

        if (parent == null) {
            throw new IOException("Root directory does not exist");
        }

        // create directories
        Path child = parent;
        for (final Path name : parent.relativize(dir)) {
            child = child.resolve(name);
            providerOf(child).createDirectory(child, attrs);
        }

        return dir;
    }

    /**
     * @throws IllegalArgumentException
     * @throws UnsupportedOperationException
     * @throws FileAlreadyExistsException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static Path createSymbolicLink(final Path link, final Path target, final FileAttribute... attrs)
            throws IllegalArgumentException, UnsupportedOperationException,
            FileAlreadyExistsException, IOException, SecurityException {
        checkNotNull("link", link);
        checkNotNull("target", target);

        providerOf(link).createSymbolicLink(link, target, attrs);

        return link;
    }

    /**
     * @throws IllegalArgumentException
     * @throws UnsupportedOperationException
     * @throws FileAlreadyExistsException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static Path createLink(final Path link, final Path existing)
            throws IllegalArgumentException, UnsupportedOperationException,
            FileAlreadyExistsException, IOException, SecurityException {
        checkNotNull("link", link);
        checkNotNull("existing", existing);

        providerOf(link).createLink(link, existing);

        return link;
    }

    /**
     * @throws IllegalArgumentException
     * @throws NoSuchFileException
     * @throws DirectoryNotEmptyException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static void delete(final Path path)
            throws IllegalArgumentException, NoSuchFileException,
            DirectoryNotEmptyException, IOException, SecurityException {
        checkNotNull("path", path);

        providerOf(path).delete(path);
    }

    /**
     * @throws IllegalArgumentException
     * @throws DirectoryNotEmptyException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static boolean deleteIfExists(final Path path)
            throws IllegalArgumentException, DirectoryNotEmptyException, IOException, SecurityException {
        checkNotNull("path", path);

        return providerOf(path).deleteIfExists(path);
    }

    //temp implemantation are based on google's guava lib
    public static Path createTempFile(final String prefix, final String suffix, final FileAttribute... attrs)
            throws IllegalArgumentException, UnsupportedOperationException, IOException, SecurityException {
        return createTempFile(TEMP_PATH, prefix, suffix, attrs);
    }

    public static Path createTempFile(final Path dir, final String prefix,
            final String suffix, final FileAttribute... attrs)
            throws IllegalArgumentException, UnsupportedOperationException, IOException, SecurityException {
        checkNotNull("dir", dir);

        if (notExists(dir)) {
            throw new NoSuchFileException(dir.toString());
        }

        final StringBuilder sb = new StringBuilder();

        if (prefix != null && prefix.trim().length() > 0) {
            sb.append(prefix).append("-");
        }

        final String baseName = sb.append(System.currentTimeMillis()).append("-").toString();

        final String realSufix;
        if (suffix != null && suffix.trim().length() > 0) {
            realSufix = normalizeSuffix(suffix);
        } else {
            realSufix = ".tmp";
        }

        for (int counter = 0; counter < TEMP_DIR_ATTEMPTS; counter++) {
            try {
                return createFile(dir.resolve(baseName + counter + realSufix), attrs);
            } catch (Exception ex) {
            }
        }

        throw new IllegalStateException("Failed to create directory within "
                + TEMP_DIR_ATTEMPTS + " attempts (tried "
                + baseName + "0 to " + baseName + (TEMP_DIR_ATTEMPTS - 1) + ')');
    }

    private static String normalizeSuffix(final String suffix) {
        if (suffix.startsWith(".")) {
            return suffix;
        }
        return "." + suffix;
    }

    public static Path createTempDirectory(final String prefix, final FileAttribute... attrs)
            throws IllegalArgumentException, UnsupportedOperationException, IOException, SecurityException {
        return createTempDirectory(TEMP_PATH, prefix, attrs);
    }

    public static Path createTempDirectory(final Path dir, final String prefix, final FileAttribute... attrs)
            throws IllegalArgumentException, UnsupportedOperationException, IOException, SecurityException {
        checkNotNull("dir", dir);

        if (notExists(dir)) {
            throw new NoSuchFileException(dir.toString());
        }

        final StringBuilder sb = new StringBuilder();

        if (prefix != null && prefix.trim().length() > 0) {
            sb.append(prefix).append("-");
        }

        final String baseName = sb.append(System.currentTimeMillis()).append("-").toString();

        for (int counter = 0; counter < TEMP_DIR_ATTEMPTS; counter++) {
            final Path path2Create = dir.resolve(baseName + counter);
            try {
                return createDirectory(path2Create, attrs);
            } catch (Exception ex) {
            }
        }

        throw new IllegalStateException("Failed to create directory within "
                + TEMP_DIR_ATTEMPTS + " attempts (tried "
                + baseName + "0 to " + baseName + (TEMP_DIR_ATTEMPTS - 1) + ')');
    }

    //copying and moving
    public static Path copy(final Path source, final Path target, final CopyOption... options)
            throws UnsupportedOperationException, FileAlreadyExistsException,
            DirectoryNotEmptyException, IOException, SecurityException {
        checkNotNull("source", source);
        checkNotNull("target", target);

        final FileSystemProvider provider = providerOf(source);
        if (providerOf(target) == provider) {
            provider.copy(source, target, options);
            return target;
        }

        throw new UnsupportedOperationException("can't copy from different providers");
    }

    public static Path move(final Path source, final Path target, final CopyOption... options)
            throws UnsupportedOperationException, FileAlreadyExistsException, DirectoryNotEmptyException,
            AtomicMoveNotSupportedException, IOException, SecurityException {
        checkNotNull("source", source);
        checkNotNull("target", target);

        final FileSystemProvider provider = providerOf(source);
        if (providerOf(target) == provider) {
            provider.move(source, target, options);
            return target;
        }
        throw new UnsupportedOperationException("can't move from different providers");
    }

    //misc

    /**
     * @throws IllegalArgumentException
     * @throws UnsupportedOperationException
     * @throws NotLinkException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static Path readSymbolicLink(final Path link)
            throws IllegalArgumentException, UnsupportedOperationException,
            NotLinkException, IOException, SecurityException {
        checkNotNull("link", link);

        return providerOf(link).readSymbolicLink(link);
    }

    /**
     * @throws IllegalArgumentException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static FileStore getFileStore(final Path path)
            throws IllegalArgumentException, IOException, SecurityException {
        checkNotNull("path", path);

        return providerOf(path).getFileStore(path);
    }

    //TODO impl
    public static String probeContentType(final Path path)
            throws UnsupportedOperationException, IOException, SecurityException {
        checkNotNull("path", path);

        if (notExists(path)) {
            throw new NoSuchFileException(path.toString());
        }

        if (!isRegularFile(path)) {
            throw new NoSuchFileException(path.toString());
        }

        throw new UnsupportedOperationException("feature not available");
    }

    //attributes

    /**
     * @throws IllegalArgumentException
     * @see Original JavaDoc
     */
    public static  V getFileAttributeView(final Path path,
            final Class type, final LinkOption... options)
            throws IllegalArgumentException {
        checkNotNull("path", path);
        checkNotNull("type", type);

        return providerOf(path).getFileAttributeView(path, type, options);
    }

    /**
     * @throws IllegalArgumentException
     * @throws UnsupportedOperationException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static  A readAttributes(final Path path,
            final Class type, final LinkOption... options)
            throws IllegalArgumentException, NoSuchFileException, UnsupportedOperationException, IOException, SecurityException {
        checkNotNull("path", path);
        checkNotNull("type", type);

        return providerOf(path).readAttributes(path, type, options);
    }

    /**
     * @throws UnsupportedOperationException
     * @throws IllegalArgumentException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static Map readAttributes(final Path path, final String attributes, final LinkOption... options)
            throws UnsupportedOperationException, NoSuchFileException, IllegalArgumentException, IOException, SecurityException {
        checkNotNull("path", path);
        checkNotEmpty("attributes", attributes);

        if (notExists(path)) {
            throw new NoSuchFileException(path.toString());
        }

        return providerOf(path).readAttributes(path, attributes, options);
    }

    /**
     * @throws UnsupportedOperationException
     * @throws IllegalArgumentException
     * @throws ClassCastException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static Path setAttribute(final Path path, final String attribute,
            final Object value, final LinkOption... options)
            throws UnsupportedOperationException, IllegalArgumentException,
            ClassCastException, IOException, SecurityException {
        checkNotNull("path", path);
        checkNotEmpty("attribute", attribute);

        providerOf(path).setAttribute(path, attribute, value, options);

        return path;
    }

    public static Object getAttribute(final Path path, final String attribute, final LinkOption... options)
            throws UnsupportedOperationException, IllegalArgumentException, IOException, SecurityException {
        checkNotNull("path", path);
        checkNotEmpty("attribute", attribute);

        if (attribute.indexOf('*') >= 0 || attribute.indexOf(',') >= 0) {
            throw new IllegalArgumentException(attribute);
        }

        final Map map = readAttributes(path, attribute, options);
        final String name;

        final int pos = attribute.indexOf(':');
        if (pos == -1) {
            name = attribute;
        } else {
            name = (pos == attribute.length()) ? "" : attribute.substring(pos + 1);
        }

        return map.get(name);
    }

    //TODO impl
    public static Set getPosixFilePermissions(final Path path, final LinkOption... options)
            throws UnsupportedOperationException, IOException, SecurityException {
        checkNotNull("path", path);

        if (notExists(path)) {
            throw new NoSuchFileException(path.toString());
        }

        throw new UnsupportedOperationException("feature not available");
    }

    //TODO impl
    public static Path setPosixFilePermissions(final Path path, final Set perms)
            throws UnsupportedOperationException, ClassCastException, IOException, SecurityException {
        checkNotNull("path", path);
        checkNotNull("perms", perms);

        if (notExists(path)) {
            throw new NoSuchFileException(path.toString());
        }

        throw new UnsupportedOperationException("feature not available");
    }

    //TODO impl
    public static UserPrincipal getOwner(final Path path, final LinkOption... options)
            throws UnsupportedOperationException, IOException, SecurityException {
        checkNotNull("path", path);

        if (notExists(path)) {
            throw new NoSuchFileException(path.toString());
        }

        throw new UnsupportedOperationException("feature not available");
    }

    //TODO impl
    public static Path setOwner(final Path path, final UserPrincipal owner)
            throws UnsupportedOperationException, IOException, SecurityException {
        checkNotNull("path", path);
        checkNotNull("owner", owner);

        if (notExists(path)) {
            throw new NoSuchFileException(path.toString());
        }

        throw new UnsupportedOperationException("feature not available");
    }

    /**
     * @throws IllegalArgumentException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static FileTime getLastModifiedTime(final Path path, final LinkOption... options)
            throws IllegalArgumentException, IOException, SecurityException {
        checkNotNull("path", path);

        return readAttributes(path, BasicFileAttributes.class, options).lastModifiedTime();
    }

    public static Path setLastModifiedTime(final Path path, final FileTime time)
            throws IOException, SecurityException {
        checkNotNull("path", path);

        getFileAttributeView(path, BasicFileAttributeView.class).setTimes(time, null, null);

        return path;
    }

    /**
     * @throws IllegalArgumentException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static long size(final Path path)
            throws IllegalArgumentException, IOException, SecurityException {
        checkNotNull("path", path);

        return readAttributes(path, BasicFileAttributes.class).size();
    }

    //accessibility

    /**
     * @throws IllegalArgumentException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static boolean exists(final Path path, final LinkOption... options)
            throws IllegalArgumentException, SecurityException {
        checkNotNull("path", path);

        try {
            readAttributes(path, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS);
            return true;
        } catch (Exception x) {
        }
        return false;
    }

    /**
     * @throws IllegalArgumentException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static boolean notExists(final Path path, final LinkOption... options)
            throws IllegalArgumentException, SecurityException {
        checkNotNull("path", path);

        try {
            readAttributes(path, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS);
            return false;
        } catch (NoSuchFileException x) {
            return true;
        } catch (Exception x) {
        }
        return false;
    }

    /**
     * @throws IllegalArgumentException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static boolean isSameFile(final Path path, final Path path2)
            throws IllegalArgumentException, IOException, SecurityException {
        checkNotNull("path", path);
        checkNotNull("path2", path2);

        return providerOf(path).isSameFile(path, path2);
    }

    /**
     * @throws IllegalArgumentException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static boolean isHidden(final Path path)
            throws IllegalArgumentException, IOException, SecurityException {
        checkNotNull("path", path);

        return providerOf(path).isHidden(path);
    }

    /**
     * @throws IllegalArgumentException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static boolean isReadable(final Path path) throws
            IllegalArgumentException, SecurityException {
        checkNotNull("path", path);

        try {
            providerOf(path).checkAccess(path, READ);
            return true;
        } catch (Exception x) {
        }
        return false;
    }

    /**
     * @throws IllegalArgumentException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static boolean isWritable(final Path path)
            throws IllegalArgumentException, SecurityException {
        checkNotNull("path", path);

        try {
            providerOf(path).checkAccess(path, WRITE);
            return true;
        } catch (Exception x) {
        }
        return false;
    }

    /**
     * @throws IllegalArgumentException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static boolean isExecutable(final Path path)
            throws IllegalArgumentException, SecurityException {
        checkNotNull("path", path);

        try {
            providerOf(path).checkAccess(path, EXECUTE);
            return true;
        } catch (Exception x) {
        }
        return false;
    }

    /**
     * @throws IllegalArgumentException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static boolean isSymbolicLink(final Path path)
            throws IllegalArgumentException, SecurityException {
        checkNotNull("path", path);

        try {
            return readAttributes(path, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS).isSymbolicLink();
        } catch (Exception ioe) {
        }
        return false;
    }

    /**
     * @throws IllegalArgumentException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static boolean isDirectory(final Path path, final LinkOption... options)
            throws IllegalArgumentException, SecurityException {
        checkNotNull("path", path);

        try {
            return readAttributes(path, BasicFileAttributes.class, options).isDirectory();
        } catch (IOException ioe) {
        }
        return false;
    }

    /**
     * @throws IllegalAccessError
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static boolean isRegularFile(final Path path, final LinkOption... options)
            throws IllegalAccessError, SecurityException {
        checkNotNull("path", path);

        try {
            return readAttributes(path, BasicFileAttributes.class, options).isRegularFile();
        } catch (IOException ioe) {
        }
        return false;
    }

    //recursive operations

    public static Path walkFileTree(final Path start, final Set options,
            final int maxDepth, final FileVisitor visitor)
            throws IllegalArgumentException, SecurityException, IOException {
        new FileTreeWalker(visitor, maxDepth).walk(start);

        return start;
    }

    /**
     * @throws IllegalArgumentException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static Path walkFileTree(final Path start, final FileVisitor visitor)
            throws IllegalArgumentException, IOException, SecurityException {
        checkNotNull("start", start);
        checkNotNull("visitor", visitor);

        final Set options = emptySet();

        return walkFileTree(start, options, Integer.MAX_VALUE, visitor);
    }

    //utility methods - simple cases

    /**
     * @throws IllegalArgumentException
     * @throws NoSuchFileException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static BufferedReader newBufferedReader(final Path path, final Charset cs)
            throws IllegalArgumentException, NoSuchFileException, IOException, SecurityException {
        checkNotNull("path", path);
        checkNotNull("cs", cs);

        return new BufferedReader(new InputStreamReader(newInputStream(path), cs.newDecoder()));
    }

    /**
     * @throws IllegalArgumentException
     * @throws IOException
     * @throws UnsupportedOperationException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static BufferedWriter newBufferedWriter(final Path path,
            final Charset cs, final OpenOption... options)
            throws IllegalArgumentException, IOException, UnsupportedOperationException, SecurityException {
        checkNotNull("path", path);
        checkNotNull("cs", cs);

        return new BufferedWriter(new OutputStreamWriter(newOutputStream(path, options), cs));
    }

    public static long copy(final InputStream in, final Path target, final CopyOption... options)
            throws IOException, FileAlreadyExistsException, DirectoryNotEmptyException,
            UnsupportedOperationException, SecurityException {
        checkNotNull("in", in);
        checkNotNull("target", target);
        checkNotNull("options", options);

        boolean replaceExisting = false;
        for (final CopyOption opt : options) {
            if (opt == StandardCopyOption.REPLACE_EXISTING) {
                replaceExisting = true;
                break;
            } else {
                checkNotNull("opt", opt);
                throw new UnsupportedOperationException(opt + " not supported");
            }
        }

        if (replaceExisting) {
            deleteIfExists(target);
        }

        final OutputStream out = newOutputStream(target, StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE);

        try {
            return internalCopy(in, out);
        } finally {
            try {
                out.close();
            } catch (java.io.IOException e) {
                throw new IOException(e);
            }
        }
    }

    public static long copy(final Path source, final OutputStream out)
            throws IOException, SecurityException {
        checkNotNull("source", source);
        checkNotNull("out", out);

        final InputStream in = newInputStream(source);

        try {
            return internalCopy(in, out);
        } finally {
            try {
                in.close();
            } catch (java.io.IOException e) {
                throw new IOException(e);
            }
        }
    }

    private static long internalCopy(InputStream in, OutputStream out) {
        long read = 0L;
        byte[] buf = new byte[BUFFER_SIZE];
        int n;
        try {
            while ((n = in.read(buf)) > 0) {
                out.write(buf, 0, n);
                read += n;
            }
        } catch (java.io.IOException e) {
            throw new IOException(e);
        }
        return read;
    }

    public static byte[] readAllBytes(final Path path)
            throws IOException, OutOfMemoryError, SecurityException {
        long size = size(path);
        if (size > (long) Integer.MAX_VALUE) {
            throw new OutOfMemoryError("Required array size too large");
        }

        final InputStream in = newInputStream(path);
        final ByteArrayOutputStream buffer = new ByteArrayOutputStream((int) size);

        int read;
        byte[] data = new byte[BUFFER_SIZE];

        try {
            while ((read = in.read(data, 0, data.length)) != -1) {
                buffer.write(data, 0, read);
            }
            buffer.flush();
            return buffer.toByteArray();
        } catch (java.io.IOException e) {
            throw new IOException(e);
        } finally {
            try {
                in.close();
            } catch (java.io.IOException e) {
                throw new IOException(e);
            }
        }
    }

    /**
     * @throws IllegalArgumentException
     * @throws NoSuchFileException
     * @throws IOException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static List readAllLines(final Path path, final Charset cs)
            throws IllegalArgumentException, NoSuchFileException, IOException, SecurityException {
        checkNotNull("path", path);
        checkNotNull("cs", cs);

        BufferedReader bufferedReader = null;

        try {
            bufferedReader = newBufferedReader(path, cs);
            final List result = new ArrayList();
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                result.add(line);
            }
            return result;
        } catch (java.io.IOException ex) {
            throw new IOException(ex);
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (java.io.IOException e) {
                    throw new IOException();
                }
            }
        }
    }

    public static Path write(final Path path, final byte[] bytes, final OpenOption... options)
            throws IOException, UnsupportedOperationException, SecurityException {
        checkNotNull("path", path);
        checkNotNull("bytes", bytes);

        final OutputStream out = newOutputStream(path, options);
        int len = bytes.length;
        int rem = len;
        try {
            while (rem > 0) {
                int n = (rem <= BUFFER_SIZE) ? rem : BUFFER_SIZE;
                out.write(bytes, (len - rem), n);
                rem -= n;
            }
            return path;
        } catch (java.io.IOException e) {
            throw new IOException(e);
        } finally {
            try {
                out.close();
            } catch (java.io.IOException e) {
                throw new IOException(e);
            }
        }
    }

    /**
     * @throws IllegalArgumentException
     * @throws IOException
     * @throws UnsupportedOperationException
     * @throws SecurityException
     * @see Original JavaDoc
     */
    public static Path write(final Path path,
            final Iterable lines, final Charset cs, final OpenOption... options)
            throws IllegalArgumentException, IOException, UnsupportedOperationException, SecurityException {
        checkNotNull("path", path);
        checkNotNull("cs", cs);
        checkNotNull("lines", lines);

        final CharsetEncoder encoder = cs.newEncoder();
        final OutputStream out = newOutputStream(path, options);

        BufferedWriter bufferedWriter = null;
        try {
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(out, encoder));
            for (final CharSequence line : lines) {
                try {
                    bufferedWriter.append(line);
                    bufferedWriter.newLine();
                } catch (java.io.IOException e) {
                    throw new IOException();
                }
            }
        } catch (final IOException ex) {
            throw ex;
        } finally {
            if (bufferedWriter != null) {
                try {
                    bufferedWriter.close();
                } catch (java.io.IOException e) {
                    throw new IOException();
                }
            }
        }

        return path;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy