public interface JavaFileManager extends Closeable, Flushable, OptionChecker
当构建新的JavaFileObjects时,文件管理器必须确定在哪里创建它们。 例如,如果文件管理器管理文件系统上的常规文件,则很有可能在创建或查找文件时使用当前/工作目录作为默认位置。 可以向文件管理器提供关于在哪里创建文件的许多提示。 任何文件管理器可能会选择忽略这些提示。
此接口中的某些方法使用类名。 这些类名必须在Java Virtual Machine内部格式的完全限定类和接口名称中给出。 为了方便 '。' 和'/'是可互换的。 内部形式在The Java™ Virtual Machine Specification的第四章中定义。
Discussion: this means that the names "java/lang.package-info", "java/lang/package-info", "java.lang.package-info", are valid and equivalent. Compare to binary name as defined in The Java™ Language Specification, section 13.1 "The Form of a Binary".
姓名的情况很重要。 所有名称应视为区分大小写。 例如,某些文件系统具有不区分大小写,区分大小写的文件名。 代表这样的文件的文件对象应该使用File.getCanonicalFile()
或类似的方法来保护大小写。 如果系统不区分大小写,文件对象必须使用其他方式来保护大小写。
Relative names :这个接口中的一些方法使用相对名称。 相对名称是以“/”分隔的路径段的非空,非空序列。 ''' 或'..'是无效的路径段。 有效的相对名称必须与RFC 3986第3.3节的“无路径”规则相匹配。 非正式地,这应该是真的:
URI.create(relativeName).normalize().getPath().equals(relativeName)
此接口中的所有方法可能会抛出SecurityException异常。
此接口的对象不需要支持多线程访问,即同步。 但是,它必须支持对此对象创建的不同文件对象的并发访问。
实现说明:这个要求的结果是,输出到一个JarOutputStream的一个微不足道的实现不是一个充分的实现。 也就是说,而不是直接创建返回JarOutputStream的JavaFileObject,内容必须缓存直到关闭,然后写入JarOutputStream。
除非明确允许,如果给定了一个null
参数,则该接口中的所有方法都可能会抛出null
。
JavaFileObject
, FileObject
Modifier and Type | Interface and Description |
---|---|
static interface |
JavaFileManager.Location
文件对象的位置接口。
|
isSupportedOption
ClassLoader getClassLoader(JavaFileManager.Location location)
ANNOTATION_PROCESSOR_PATH
位置请求类加载器。
location
- 一个位置
null
如果从给定位置加载插件已禁用或位置未知
SecurityException
- 如果无法在当前安全上下文中创建类加载器
IllegalStateException
- 如果已经调用了
close()
,并且该文件管理器无法重新打开
Iterable<JavaFileObject> list(JavaFileManager.Location location, String packageName, Set<JavaFileObject.Kind> kinds, boolean recurse) throws IOException
注意:即使给定的位置对于该文件管理器是未知的,它也可能不会返回null
。 而且,未知的位置可能不会引起异常。
location
- 一个位置
packageName
- 一个包名
kinds
- 只返回这些类型的对象
recurse
- 如果真的包括“子包”
IOException
- 如果发生I / O错误,或者如果
调用了close()
,并且此文件管理器无法重新打开
IllegalStateException
- 如果
close()
已被调用,并且此文件管理器无法重新打开
String inferBinaryName(JavaFileManager.Location location, JavaFileObject file)
location
- 一个位置
file
- 一个文件对象
null
在给定位置找不到文件对象
IllegalStateException
- 如果已经调用了
close()
,并且此文件管理器无法重新打开
boolean isSameFile(FileObject a, FileObject b)
a
- 一个文件对象
b
- 一个文件对象
IllegalArgumentException
- 如果任一参数是使用另一个文件管理器创建的,并且此文件管理器不支持外部文件对象
boolean handleOption(String current, Iterator<String> remaining)
current
是该文件管理器的选项, remaining
从remaining
使用该选项的任何参数,并返回true,否则返回false。
current
- 当前选项
remaining
- 剩余选项
IllegalArgumentException
- 如果此文件管理器的此选项被错误地使用
IllegalStateException
- 如果已经调用了
close()
,并且该文件管理器无法重新打开
boolean hasLocation(JavaFileManager.Location location)
location
- 一个位置
JavaFileObject getJavaFileForInput(JavaFileManager.Location location, String className, JavaFileObject.Kind kind) throws IOException
location
- 一个位置
className
- 一个类的名称
kind
- 文件的种类,必须是
SOURCE
或
CLASS
之一
null
IllegalArgumentException
- 如果该文件管理器不知道该位置,并且文件管理器不支持未知位置,或者该类型无效
IOException
- 如果发生I / O错误,或者如果
调用了close()
,并且该文件管理器无法重新打开
IllegalStateException
- 如果
close()
已被调用,并且该文件管理器无法重新打开
JavaFileObject getJavaFileForOutput(JavaFileManager.Location location, String className, JavaFileObject.Kind kind, FileObject sibling) throws IOException
可选地,该文件管理器可以将兄弟姐妹视为提示放置输出的位置。 这个提示的确切语义是未指定的。 例如,JDK编译器javac将将类文件放置在与源文件源相同的目录中,除非提供了一个类文件输出目录。 为了方便这种行为,javac可以在调用此方法时将起始源文件提供为兄弟。
location
- 一个位置
className
- 一个类的名称
kind
- 文件的种类,必须是
SOURCE
或
CLASS
之一
sibling
- 用作放置提示的文件对象;
可能是null
IllegalArgumentException
- 如果此文件管理器不知道同级,或者该文件管理器不知道该位置,并且文件管理器不支持未知位置,或者该类型无效
IOException
- 如果发生I / O错误,或者如果
调用了close()
,并且该文件管理器无法重新打开
IllegalStateException
-
close()
,这个文件管理器无法重新打开
FileObject getFileForInput(JavaFileManager.Location location, String packageName, String relativeName) throws IOException
如果返回的对象表示一个source或class文件,则它必须是JavaFileObject
的一个实例。
非法地,此方法返回的文件对象位于位置,包名称和相对名称的并置中。 例如,要在SOURCE_PATH位置的“com.sun.tools.javac”包中找到属性文件“resources / compiler.properties”,可能会调用此方法:
getFileForInput(SOURCE_PATH, "com.sun.tools.javac", "resources/compiler.properties");
如果调用在Windows上执行,SOURCE_PATH设置为"C:\Documents and Settings\UncleBob\src\share\classes"
,则有效的结果将是表示文件"C:\Documents and Settings\UncleBob\src\share\classes\com\sun\tools\javac\resources\compiler.properties"的文件"C:\Documents and Settings\UncleBob\src\share\classes\com\sun\tools\javac\resources\compiler.properties"
。
location
- 一个位置
packageName
- 一个包名
relativeName
- 相对名称
null
IllegalArgumentException
- 如果该文件管理器不知道该位置,并且文件管理器不支持未知位置,或者如果
relativeName
无效
IOException
- 如果发生I / O错误,或者如果已调用
close()
,并且无法重新打开该文件管理器
IllegalStateException
- 如果已经调用了
close()
,并且该文件管理器无法重新打开
FileObject getFileForOutput(JavaFileManager.Location location, String packageName, String relativeName, FileObject sibling) throws IOException
可选地,该文件管理器可以将兄弟姐妹视为提示放置输出的位置。 这个提示的确切语义是未指定的。 例如,JDK编译器javac将将类文件放置在与源文件源相同的目录中,除非提供了一个类文件输出目录。 为了方便这种行为,javac可以在调用此方法时将起始源文件提供为兄弟。
如果返回的对象表示一个source或class文件,则它必须是JavaFileObject
的一个实例。
非法地,此方法返回的文件对象位于位置,包名称和相对名称的连接中,或者位于兄弟参数旁边。 见例getFileForInput
。
location
- 一个位置
packageName
- 一个包名
relativeName
- 相对名称
sibling
- 用作放置提示的文件对象;
可能是null
IllegalArgumentException
- 如果此文件管理器不知道同胞,或者该文件管理器不知道该位置,并且文件管理器不支持未知位置,或者如果
relativeName
无效
IOException
- 如果发生I / O错误,或者如果已调用
close()
,并且无法重新打开该文件管理器
IllegalStateException
- 如果
close()
已被调用,并且该文件管理器无法重新打开
void flush() throws IOException
flush
中的
Flushable
IOException
- 如果发生I / O错误
close()
void close() throws IOException
close
在界面
AutoCloseable
close
在接口
Closeable
IOException
- 如果发生I / O错误
flush()