java 对文件进行操作file和datasoure有什么不同

如题所述

第1个回答  推荐于2016-08-01
看 data source 接口/类提供了什么方法就知道了。

使用 data source 是推迟读取内容的过程。比如发送一个邮件附件,我们设置好附件之后并不是立即就读取文件,而等到 smtp 准备发送邮件时要编码附件的时候才来读取内容,这个过程推迟了。

因此在设计中我们要意识到 data source 这个接口的约定,我们不能以为创建好一封邮件后内容就已经读取完成了,如果我们在发送邮件完成之前就把磁盘上的文件删除了就会出错的。

另外 Data Source 情况中也有类似的设计约定,例如它的 DataSource 中指明了 mime type 可以用在某个程序处理过程中了解文件类型,而普通的 file 方式我们并不知道 mime type 文件类型,就无法按具体类型处理文件,比如普通的 text 文件直接把内容按 ASCII 编码就可以了但二进制文件(如图片等)就要按 base64 编码。追问

为什么datasoure要转换成DataHandler,两者有什么不同

追答

哦,前面有些错误,那个 DataHandler 是用来做这个推迟的过程的,DataSource 只是一层抽象。

DataHandler 才有 Mime Type,它还直接从它的 data source 中拿 input stream 或 output stream。

这个在 Java activation framework 这个 API 中的作用就是延迟真实的数据读写,让我们告诉它的 mime type 及与什么文件位置进入读写操作。至于这其中的 Data Source 抽象层是因为我们不只是要支持基于 File I/O,还需要支持基于内存的 byte[] 的 I/O 操作,我们就需要一层抽象。这样当我们想直接把内存中的byte[] 或一个 image 对象编码到邮件中时就可以自己实现一个 data source 来处理了。这个过程中 data handler 则是不需要为 这种 I/O 的差异而改变,一般来说 API 被设计出来不需要太多改变,需要改变的部分一般是设计成 interface 而不是 class,并再提供一个 SPI (Service Provider Interface) 来自动化配置过程(不修改源码自动挂接新的实现类的方式)。

本回答被提问者和网友采纳
相似回答