localfilesystem.java

来自「jsr170接口的java实现。是个apache的开源项目。」· Java 代码 · 共 467 行

JAVA
467
字号
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements.  See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.jackrabbit.core.fs.local;import org.apache.jackrabbit.core.fs.FileSystem;import org.apache.jackrabbit.core.fs.FileSystemException;import org.apache.jackrabbit.core.fs.RandomAccessOutputStream;import org.apache.jackrabbit.util.LazyFileInputStream;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.File;import java.io.FileFilter;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.RandomAccessFile;/** * A <code>LocalFileSystem</code> ... */public class LocalFileSystem implements FileSystem {    private static Logger log = LoggerFactory.getLogger(LocalFileSystem.class);    private File root;    private HandleMonitor monitor = null;    /**     * Default constructor     */    public LocalFileSystem() {    }    public String getPath() {        if (root != null) {            return root.getPath();        } else {            return null;        }    }    /**     * Sets the path to the root directory of this local filesystem. please note     * that this method can be called via reflection during initialization and     * must not be altered.     *     * @param rootPath the path to the root directory     */    public void setPath(String rootPath) {        setRoot(new File(osPath(rootPath)));    }    public void setRoot(File root) {        this.root = root;    }    /**     * Enables/Disables the use of the handle monitor.     *     * @param enable     */    public void setEnableHandleMonitor(String enable) {        setEnableHandleMonitor(Boolean.valueOf(enable).booleanValue());    }    /**     * Enables/Disables the use of the handle monitor.     *     * @param enable flag     */    public void setEnableHandleMonitor(boolean enable) {        if (enable && monitor == null) {            monitor = new HandleMonitor();        }        if (!enable && monitor != null) {            monitor = null;        }    }    /**     * Returns <code>true</code> if use of the handle monitor is currently     * enabled, otherwise returns <code>false</code>.     *     * @see #setEnableHandleMonitor(boolean)     */    public String getEnableHandleMonitor() {        return monitor == null ? "false" : "true";    }    private String osPath(String genericPath) {        if (File.separator.equals(SEPARATOR)) {            return genericPath;        }        return genericPath.replace(SEPARATOR_CHAR, File.separatorChar);    }    //-------------------------------------------< java.lang.Object overrides >    public boolean equals(Object obj) {        if (this == obj) {            return true;        }        if (obj instanceof LocalFileSystem) {            LocalFileSystem other = (LocalFileSystem) obj;            if (root == null) {                return other.root == null;            } else {                return root.equals(other.root);            }        }        return false;    }    /**     * Returns zero to satisfy the Object equals/hashCode contract.     * This class is mutable and not meant to be used as a hash key.     *     * @return always zero     * @see Object#hashCode()     */    public int hashCode() {        return 0;    }    //-----------------------------------------------------------< FileSystem >    /**     * {@inheritDoc}     */    public void init() throws FileSystemException {        if (root == null) {            String msg = "root directory not set";            log.debug(msg);            throw new FileSystemException(msg);        }        if (root.exists()) {            if (!root.isDirectory()) {                String msg = "path does not denote a folder";                log.debug(msg);                throw new FileSystemException(msg);            }        } else {            if (!root.mkdirs()) {                String msg = "failed to create root";                log.debug(msg);                throw new FileSystemException(msg);            }        }        log.info("LocalFileSystem initialized at path " + root.getPath());        if (monitor != null) {            log.info("LocalFileSystem using handle monitor");        }    }    /**     * {@inheritDoc}     */    public void close() throws FileSystemException {        root = null;    }    /**     * {@inheritDoc}     */    public void copy(String srcPath, String destPath)            throws FileSystemException {        File src = new File(root, osPath(srcPath));        File dest = new File(root, osPath(destPath));        try {            FileUtil.copy(src, dest);        } catch (IOException ioe) {            String msg = "copying " + src.getPath() + " to "                    + dest.getPath() + " failed";            log.debug(msg);            throw new FileSystemException(msg, ioe);        }    }    /**     * {@inheritDoc}     */    public void createFolder(String folderPath) throws FileSystemException {        File f = new File(root, osPath(folderPath));        if (f.exists()) {            String msg = f.getPath() + " already exists";            log.debug(msg);            throw new FileSystemException(msg);        }        if (!f.mkdirs()) {            String msg = "failed to create folder " + f.getPath();            log.debug(msg);            throw new FileSystemException(msg);        }    }    /**     * {@inheritDoc}     */    public void deleteFile(String filePath) throws FileSystemException {        File f = new File(root, osPath(filePath));        if (!f.isFile()) {            String msg = f.getPath() + " does not denote an existing file";            throw new FileSystemException(msg);        }        try {            FileUtil.delete(f);        } catch (IOException ioe) {            String msg = "failed to delete " + f.getPath();            if (monitor != null && monitor.isOpen(f)) {                log.error("Unable to delete. There are still open streams.");                monitor.dump(f);            }            throw new FileSystemException(msg, ioe);        }    }    /**     * {@inheritDoc}     */    public void deleteFolder(String folderPath) throws FileSystemException {        File f = new File(root, osPath(folderPath));        if (!f.isDirectory()) {            String msg = f.getPath() + " does not denote an existing folder";            log.debug(msg);            throw new FileSystemException(msg);        }        try {            FileUtil.delete(f);        } catch (IOException ioe) {            String msg = "failed to delete " + f.getPath();            log.debug(msg);            throw new FileSystemException(msg, ioe);        }    }    /**     * {@inheritDoc}     */    public boolean exists(String path) throws FileSystemException {        File f = new File(root, osPath(path));        return f.exists();    }    /**     * {@inheritDoc}     */    public InputStream getInputStream(String filePath)            throws FileSystemException {        File f = new File(root, osPath(filePath));        try {            if (monitor == null) {                return new LazyFileInputStream(f);            } else {                return monitor.open(f);            }        } catch (FileNotFoundException fnfe) {            String msg = f.getPath() + " does not denote an existing file";            log.debug(msg);            throw new FileSystemException(msg, fnfe);        }    }    /**     * {@inheritDoc}     */    public OutputStream getOutputStream(String filePath)            throws FileSystemException {        File f = new File(root, osPath(filePath));        try {            return new FileOutputStream(f);        } catch (FileNotFoundException fnfe) {            String msg = "failed to get output stream for " + f.getPath();            log.debug(msg);            throw new FileSystemException(msg, fnfe);        }    }    /**     * {@inheritDoc}     */    public RandomAccessOutputStream getRandomAccessOutputStream(String filePath)            throws FileSystemException {        File f = new File(root, osPath(filePath));        try {            return new RAFOutputStream(new RandomAccessFile(f, "rw"));        } catch (IOException e) {            String msg = "failed to get output stream for " + f.getPath();            log.debug(msg);            throw new FileSystemException(msg, e);        }    }    /**     * {@inheritDoc}     */    public boolean hasChildren(String path) throws FileSystemException {        File f = new File(root, osPath(path));        if (!f.exists()) {            String msg = f.getPath() + " does not exist";            log.debug(msg);            throw new FileSystemException(msg);        }        if (f.isFile()) {            return false;        }        return (f.list().length > 0);    }    /**     * {@inheritDoc}     */    public boolean isFile(String path) throws FileSystemException {        File f = new File(root, osPath(path));        return f.isFile();    }    /**     * {@inheritDoc}     */    public boolean isFolder(String path) throws FileSystemException {        File f = new File(root, osPath(path));        return f.isDirectory();    }    /**     * {@inheritDoc}     */    public long lastModified(String path) throws FileSystemException {        File f = new File(root, osPath(path));        return f.lastModified();    }    /**     * {@inheritDoc}     */    public long length(String filePath) throws FileSystemException {        File f = new File(root, osPath(filePath));        if (!f.exists()) {            return -1;        }        return f.length();    }    /**     * {@inheritDoc}     */    public void touch(String filePath) throws FileSystemException {        File f = new File(root, osPath(filePath));        f.setLastModified(System.currentTimeMillis());    }    /**     * {@inheritDoc}     */    public String[] list(String folderPath) throws FileSystemException {        File f = new File(root, osPath(folderPath));        String[] entries = f.list();        if (entries == null) {            String msg = folderPath + " does not denote a folder";            log.debug(msg);            throw new FileSystemException(msg);        }        return entries;    }    /**     * {@inheritDoc}     */    public String[] listFiles(String folderPath) throws FileSystemException {        File folder = new File(root, osPath(folderPath));        File[] files = folder.listFiles(new FileFilter() {            public boolean accept(File f) {                return f.isFile();            }        });        if (files == null) {            String msg = folderPath + " does not denote a folder";            log.debug(msg);            throw new FileSystemException(msg);        }        String[] entries = new String[files.length];        for (int i = 0; i < files.length; i++) {            entries[i] = files[i].getName();        }        return entries;    }    /**     * {@inheritDoc}     */    public String[] listFolders(String folderPath) throws FileSystemException {        File file = new File(root, osPath(folderPath));        File[] folders = file.listFiles(new FileFilter() {            public boolean accept(File f) {                return f.isDirectory();            }        });        if (folders == null) {            String msg = folderPath + " does not denote a folder";            log.debug(msg);            throw new FileSystemException(msg);        }        String[] entries = new String[folders.length];        for (int i = 0; i < folders.length; i++) {            entries[i] = folders[i].getName();        }        return entries;    }    /**     * {@inheritDoc}     */    public void move(String srcPath, String destPath)            throws FileSystemException {        File src = new File(root, osPath(srcPath));        File dest = new File(root, osPath(destPath));        if (dest.exists()) {            // we need to move the existing file/folder out of the way first            try {                FileUtil.delete(dest);            } catch (IOException ioe) {                String msg = "moving " + src.getPath() + " to "                        + dest.getPath() + " failed";                log.debug(msg);                throw new FileSystemException(msg, ioe);            }        }        File destParent = dest.getParentFile();        if (!destParent.exists()) {            // create destination parent folder first            if (!destParent.mkdirs()) {                String msg = "moving " + src.getPath() + " to "                        + dest.getPath() + " failed";                log.debug(msg);                throw new FileSystemException(msg);            }        }        // now we're ready to move/rename the file/folder        if (!src.renameTo(dest)) {            String msg = "moving " + src.getPath() + " to "                    + dest.getPath() + " failed";            log.debug(msg);            throw new FileSystemException(msg);        }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?