有没有人感觉 StandardOpenOption 很难理解的?

只有我感觉 StandardOpenOption 的设计很难理解和记忆吗?

它的各个枚举项之间是什么关系? 哪些枚举项之间有冲突? 读和写操作的缺省枚举项是什么?
每次都要翻相关文档查阅用法, 根本记不住。

它的各个枚举项就像一个大杂烩。

我能说这是设计的最烂的Java API吗?


2024-12-23 补充:举一个简单的例子:

如果选择 写操作,WRITE,但是既未选择 CREATE、也未选择CREATE_NEW
问题1:上面的用法是正确的、还是错误的? 假如是错误的,在API哪个地方能找到对应说明?
问题2:假如上面用法是正确的,那么文件不存在时,是默认CREATE?还是报错? 在API哪个地方能找到对应说明?这些规则要靠人猜测的吗? 或者要去实际测试完,才能知道的吗?

所以我说这是一个设计混乱的API

多谢 @Seven的回答,虽然并没有能解决我的困惑。

阅读 1.1k
1 个回答

枚举项及其关系

StandardOpenOption 是一个枚举类,定义了文件操作的标准选项。常用的枚举项包括:

  • READ: 以读的方式打开文件。
  • WRITE: 以写的方式打开文件。
  • APPEND: 以追加的方式打开文件,不会覆盖文件原本内容。
  • TRUNCATE_EXISTING: 如果文件存在并且以 WRITE 的方式打开时,会把文件内容清空。
  • CREATE: 创建一个新文件,如果文件已存在则打开文件。
  • CREATE_NEW: 创建一个新文件,如果文件已存在则抛出异常。
  • DELETE_ON_CLOSE: 文件关闭时删除文件。
  • SPARSE: 创建稀疏文件。
  • SYNC: 每次写入时将内容和元数据同步到存储设备。
  • DSYNC: 每次写入时将内容同步到存储设备。

枚举项之间的冲突

  • CREATECREATE_NEW 不能同时使用,因为它们的行为是互斥的。
  • TRUNCATE_EXISTING 只在文件以 WRITE 方式打开时有效,如果文件以 READ 方式打开则会被忽略。

读和写操作的缺省枚举项

  • 读操作: 默认使用 READ
  • 写操作: 默认使用 WRITE,可以根据需要添加 APPENDTRUNCATE_EXISTING

补充

分类记忆
将枚举项按功能分类,有助于理解和记忆。比如:

  • 读写操作: READ, WRITE
  • 文件创建: CREATE, CREATE_NEW
  • 文件修改: APPEND, TRUNCATE_EXISTING
  • 特殊操作: DELETE_ON_CLOSE, SPARSE, SYNC, DSYNC
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏