首页 > 代码库 > Apache commons VFS之Shell源代码示例

Apache commons VFS之Shell源代码示例

         这个示例主要是模拟一个Shell程序,通过输入一些命令,执行操作。源代码来自官网。

这个示例的特点:

1.       接收用户的输入;

2.       通过字符解析和判断;

3.       利用VFS自带的一些功能进行功能实现;

 

package test.ffm83.commons.VFS;

 

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.text.DateFormat;

import java.util.ArrayList;

import java.util.Date;

import java.util.StringTokenizer;

 

import org.apache.commons.vfs2.FileContent;

import org.apache.commons.vfs2.FileObject;

import org.apache.commons.vfs2.FileSystemException;

import org.apache.commons.vfs2.FileSystemManager;

import org.apache.commons.vfs2.FileType;

import org.apache.commons.vfs2.FileUtil;

import org.apache.commons.vfs2.Selectors;

import org.apache.commons.vfs2.VFS;

 

/**

 * A simple command-line shell for performing file operations.

 * @author <ahref="mailto:adammurdoch@apache.org">AdamMurdoch</a>

 * @authorGary D. Gregory,范芳铭整理和添加注释

 */

public classShell

{

   private static final String CVS_ID ="$Id:Shell.java 232419 2005-08-13 07:23:40 +0200(Sa, 13 Aug 2005) imario $";

   private final FileSystemManager mgr;

   privateFileObjectcwd;

   privateBufferedReaderreader;

 

   public static void main(final String[] args)

   {

        try

       {

            (new Shell()).go();

        }

        catch (Exception e)

        {

            e.printStackTrace();

            System.exit(1);

        }

        System.exit(0);

   }

 

   privateShell()throwsFileSystemException

   {

        mgr = VFS.getManager();

        cwd = mgr.resolveFile(System.getProperty("user.dir"));//获取当前文件夹

        reader = new BufferedReader(new InputStreamReader(System.in));//接收输入内容

   }

 

   private void go() throws Exception

   {

        System.out.println("VFS Shell [" +CVS_ID + "]");

        while (true)

        {

            final String[] cmd = nextCommand();

            if (cmd ==null)

            {

                return;

            }

            if (cmd.length == 0)

            {

                continue;

            }

            final String cmdName = cmd[0];

            if (cmdName.equalsIgnoreCase("exit") ||cmdName.equalsIgnoreCase("quit"))

            {

                return;

            }

            try

            {

                handleCommand(cmd);

            }

            catch (final Exception e)

            {

                System.err.println("Command failed:");

                e.printStackTrace(System.err);

            }

        }

   }

 

   /**

     * Handles a command.

     */

   private void handleCommand(final String[] cmd)throws Exception

   {

        final String cmdName = cmd[0];

        if (cmdName.equalsIgnoreCase("cat"))

        {

            cat(cmd);

        }

        else if (cmdName.equalsIgnoreCase("cd"))

        {

            cd(cmd);

        }

        else if (cmdName.equalsIgnoreCase("cp"))

        {

            cp(cmd);

        }

        else if (cmdName.equalsIgnoreCase("help"))

        {

            help();

        }

        else if (cmdName.equalsIgnoreCase("ls"))

        {

            ls(cmd);

        }

        else if (cmdName.equalsIgnoreCase("pwd"))

        {

            pwd();

        }

        else if (cmdName.equalsIgnoreCase("rm"))

        {

            rm(cmd);

        }

        else if (cmdName.equalsIgnoreCase("touch"))

        {

            touch(cmd);

        }

        else

        {

            System.err.println("Unknown command \""+ cmdName +"\".");

        }

   }

 

   /**

     * Does a ‘help‘ command.

     */

   private void help()

   {

        System.out.println("Commands:");

        System.out.println("cat <file>        Displays the contents of a file.");

        System.out.println("cd [folder]        Changescurrent folder.");

        System.out.println("cp <src> <dest>   Copies a file or folder.");

        System.out.println("help               Shows thismessage.");

        System.out.println("ls [-R] [path]     Listscontents of a file or folder.");

        System.out.println("pwd                Displayscurrent folder.");

        System.out.println("rm <path>         Deletes a file or folder.");

        System.out.println("touch <path>       Setsthe last-modified time of a file.");

        System.out.println("exit       Exits thisprogram.");

        System.out.println("quit       Exits thisprogram.");

   }

 

   /**

     * Does an ‘rm‘ command.

     */

   private void rm(final String[] cmd)throws Exception

   {

        if (cmd.length < 2)

        {

            throw new Exception("USAGE: rm <path>");

        }

 

        final FileObject file =mgr.resolveFile(cwd, cmd[1]);

        file.delete(Selectors.SELECT_SELF);

   }

 

   /**

     * Does a ‘cp‘ command.

     */

   private void cp(final String[] cmd)throws Exception

   {

        if (cmd.length < 3)

        {

            throw new Exception("USAGE: cp <src><dest>");

        }

 

        final FileObject src =http://www.mamicode.com/mgr.resolveFile(cwd, cmd[1]);

        FileObject dest = mgr.resolveFile(cwd, cmd[2]);

        if (dest.exists() && dest.getType() ==FileType.FOLDER)

        {

            dest =dest.resolveFile(src.getName().getBaseName());

        }

 

        dest.copyFrom(src, Selectors.SELECT_ALL);

   }

 

   /**

     * Does a ‘cat‘ command.

     */

   private void cat(final String[] cmd)throws Exception

   {

        if (cmd.length < 2)

        {

            throw new Exception("USAGE: cat<path>");

        }

 

        // Locate the file

        final FileObject file =mgr.resolveFile(cwd, cmd[1]);

 

        // Dump the contents to System.out

        FileUtil.writeContent(file,System.out);

        System.out.println();

   }

 

   /**

     * Does a ‘pwd‘ command.

     */

   private void pwd()

   {

        System.out.println("Current folder is " +cwd.getName());

   }

 

   /**

     * Does a ‘cd‘ command.

     * If the taget directory does notexist, a message is printed to<code>System.err</code>.

     */

   private void cd(final String[] cmd)throws Exception

   {

        final String path;

        if (cmd.length > 1)

        {

            path = cmd[1];

        }

        else

        {

            path = System.getProperty("user.home");

        }

 

        // Locate and validate the folder

        FileObject tmp = mgr.resolveFile(cwd, path);

        if (tmp.exists())

        {

            cwd = tmp;

        }

        else

        {

            System.out.println("Folder does not exist: "+ tmp.getName());

        }

        System.out.println("Current folder is " +cwd.getName());

   }

 

   /**

     * Does an ‘ls‘ command.

     */

   private void ls(final String[] cmd)throws FileSystemException

   {

        int pos = 1;

        final boolean recursive;

        if (cmd.length > pos && cmd[pos].equals("-R"))

        {

            recursive = true;

            pos++;

        }

        else

        {

            recursive = false;

        }

 

        final FileObject file;

        if (cmd.length > pos)

        {

            file = mgr.resolveFile(cwd, cmd[pos]);

        }

        else

        {

            file = cwd;

        }

 

        if (file.getType() == FileType.FOLDER)

        {

            // List the contents

            System.out.println("Contents of " + file.getName());

            listChildren(file, recursive, "");

        }

        else

        {

            // Stat the file

            System.out.println(file.getName());

            final FileContent content = file.getContent();

            System.out.println("Size: " + content.getSize() +" bytes.");

            final DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);

            final String lastMod = dateFormat.format(newDate(content.getLastModifiedTime()));

            System.out.println("Last modified: " + lastMod);

        }

   }

 

   /**

     * Does a ‘touch‘ command.

     */

   private void touch(final String[] cmd)throws Exception

   {

        if (cmd.length < 2)

        {

            throw new Exception("USAGE: touch<path>");

        }

        final FileObject file =mgr.resolveFile(cwd, cmd[1]);

        if (!file.exists())

        {

            file.createFile();

        }

        file.getContent().setLastModifiedTime(System.currentTimeMillis());

   }

 

   /**

     * Lists the children of a folder.

     */

   private void listChildren(final FileObject dir,

                              finalboolean recursive,

                              final String prefix)

        throws FileSystemException

   {

        final FileObject[] children = dir.getChildren();

        for (int i = 0; i < children.length; i++)

        {

            final FileObject child = children[i];

            System.out.print(prefix);

            System.out.print(child.getName().getBaseName());

            if (child.getType() == FileType.FOLDER)

            {

                System.out.println("/");

                if (recursive)

                {

                    listChildren(child,recursive, prefix + "    ");

                }

            }

            else

            {

                System.out.println();

            }

        }

   }

 

   /**

     * Returns the next command, split intotokens.

     */

   privateString[] nextCommand()throws IOException

   {

        System.out.print("> ");

        final String line =reader.readLine();

        if (line ==null)

        {

            return null;

        }

        final ArrayList<String> cmd =newArrayList<String>();

        final StringTokenizer tokens =new StringTokenizer(line);

        while (tokens.hasMoreTokens())

        {

            cmd.add(tokens.nextToken());

        }

        return cmd.toArray(new String[cmd.size()]);

   }

}

运行结果如下:

VFS Shell [$Id:Shell.java 2324192005-08-13 07:23:40 +0200 (Sa, 13 Aug 2005) imario $]

> pwd

Current folder isfile:///D:/develop/eclipse/Workspaces/test_all

Apache commons VFS之Shell源代码示例