abstractfile.scala
来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 194 行
SCALA
194 行
/* NSC -- new Scala compiler * Copyright 2005-2007 LAMP/EPFL * @author Martin Odersky */// $Id: AbstractFile.scala 12886 2007-09-17 16:36:10Z mcdirmid $package scala.tools.nsc.ioimport java.io.{File, IOException, InputStream}import java.net.URLimport scala.collection.mutable.ArrayBuffer/** * @author Philippe Altherr * @version 1.0, 23/03/2004 */object AbstractFile { /** Returns "getFile(new File(path))". */ def getFile(path: String): AbstractFile = getFile(new File(path)) /** * If the specified File exists and is a regular file, returns an * abstract regular file backed by it. Otherwise, returns <code>null</code>. */ def getFile(file: File): AbstractFile = if (file.isFile() && file.exists()) new PlainFile(file) else null /** Returns "getDirectory(new File(path))". */ def getDirectory(path: String): AbstractFile = getDirectory(new File(path)) /** * If the specified File exists and is either a directory or a * readable zip or jar archive, returns an abstract directory * backed by it. Otherwise, returns <code>null</code>. * * @param file ... * @return ... */ def getDirectory(file: File): AbstractFile = { if (file.isDirectory() && file.exists()) return new PlainFile(file) if (file.isFile() && file.exists()) { val path = file.getPath() if (path.endsWith(".jar") || path.endsWith(".zip")) return ZipArchive.fromFile(file); } null } /** * If the specified URL exists and is a readable zip or jar archive, * returns an abstract directory backed by it. Otherwise, returns * <code>null</code>. * * @param file ... * @return ... */ def getURL(url: URL): AbstractFile = if (url ne null) { val path = url.getPath() if (path.endsWith(".jar") || path.endsWith(".zip")) ZipArchive.fromURL(url) else null } else null}/** * <p> * This class and its children serve to unify handling of files and * directories. These files and directories may or may not have some * real counter part within the file system. For example, some file * handles reference files within a zip archive or virtual ones * that exist only in memory. * </p> * <p> * Every abstract file has a path (i.e. a full name) and a name * (i.e. a short name) and may be backed by some real File. There are * two different kinds of abstract files: regular files and * directories. Regular files may be read and have a last modification * time. Directories may list their content and look for subfiles with * a specified name or path and of a specified kind. * </p> * <p> * The interface does <b>not</b> allow to access the content. * The class <code>symtab.classfile.AbstractFileReader</code> accesses * bytes, knowing that the character set of classfiles is UTF-8. For * all other cases, the class <code>SourceFile</code> is used, which honors * <code>global.settings.encoding.value</code>. * </p> */abstract class AbstractFile extends AnyRef with Iterable[AbstractFile] { /** Returns the name of this abstract file. */ def name: String /** Returns the path of this abstract file. */ def path: String /** Returns the containing directory of this abstract file */ def container : AbstractFile /** Returns the underlying File if any and null otherwise. */ def file: File /** Is this abstract file a directory? */ def isDirectory: Boolean /** Returns the time that this abstract file was last modified. */ def lastModified: Long /** returns an input stream so the file can be read */ def input: InputStream /** size of this file if it is a concrete file. */ def size: Option[Int] = None /** returns contents of file (if applicable) in a byte array. * warning: use <code>Global.getSourceFile()</code> to use the proper * encoding when converting to the char array . * * @throws java.io.IOException */ final def toCharArray = new String(toByteArray).toCharArray /** returns contents of file (if applicable) in a byte array. * * @throws java.io.IOException */ @throws(classOf[IOException]) final def toByteArray: Array[Byte] = { val in = input var rest = size.get val arr = new Array[Byte](rest) while (rest > 0) { val res = in.read(arr, arr.length - rest, rest) if (res == -1) throw new IOException("read error") rest -= res } in.close() arr } /** Returns all abstract subfiles of this abstract directory. */ def elements: Iterator[AbstractFile] /** Returns the abstract file in this abstract directory with the specified * name. If there is no such file, returns <code>null</code>. The argument * <code>directory</code> tells whether to look for a directory or * a regular file. * * @param name ... * @param directory ... * @return ... */ def lookupName(name: String, directory: Boolean): AbstractFile /** Returns the abstract file in this abstract directory with the specified * path relative to it, If there is no such file, returns null. The argument * <code>directory</code> tells whether to look for a directory or a regular * file. * * @param path ... * @param directory ... * @return ... */ def lookupPath(path: String, directory: Boolean): AbstractFile = { val length = path.length() val separator = File.separatorChar assert(0 < length && path.lastIndexOf(separator) < length - 1, path) var file = this var start = 0 while (true) { val index = path.indexOf(separator, start) assert(index < 0 || start < index) val name = path.substring(start, if (index < 0) length else index) file = file.lookupName(name, if (index < 0) directory else true) if ((file eq null) || index < 0) return file start = index + 1 } file } /** Returns the path of this abstract file. */ override def toString() = path}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?