我是靠谱客的博主 激情机器猫,最近开发中收集的这篇文章主要介绍android向U盘中拷贝文件成功后立刻断开,文件0字节,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

用OutputStream写入Sd上的文件,写完后会有打印提示,如果立即把机器断电,再打开被写入的文件,发现成了0字节。一直怀疑是写在缓存,没同步到磁盘,于是在write()后加了个flush(),结果还是0字节。是因OutputStream是字节流,其写入操作不会用到缓存。

所以flush根本没用。但OutputStream又找不到一个类似linux中的sync()方法,所幸在论坛找到一同样问题的帖子,终于找到解决方法:

用OutputStream的子类FileOutputStream打开文件,FileOutputStream中就有同步的方法:FileOutputStream.getFD().sync(),在write()后执行就不会出现文件清0的问题了。

 

附源码注释中翻:

flush

   刷新此输出流并强制写出所有缓冲的输出字节。flush 的常规协定是:如果此输出流的实现已经缓冲了以前写入的任何字节,则调用此方法指示应将这些字节立即写入它们预期的目标。

   如果此流的预期目标是由基础操作系统提供的一个抽象(如一个文件),则刷新此流只能保证将以前写入到流的字节传递给操作系统进行写入,但不保证能将这些字节实际写入到物理设备(如磁盘驱动器)。

 OutputStream 的 flush 方法不执行任何操作。为什么会这样? 原因是,这个缓冲我们java自己实现的。 flush保证的是内部的缓冲写入到系统中。但是系统中文件也可能有缓冲,所以并不一定flush后立即可见。

 那么如何解决这个问题?在文件流或数据流中均可以看见getFD()这个方法, 它返回的是与此流有关的文件描述符。

所以调用文件描述符的sync的方法即可让实际文件强制同步了。JDK中描述如下:

sync

强制所有系统缓冲区与基础设备同步。该方法在此 FileDescriptor 的所有修改数据和属性都写入相关设备后返回。特别是,如果此 FileDescriptor 引用物理存储介质,比如文件系统中的文件,则一直要等到将与此 FileDesecriptor 有关的缓冲区的所有内存中修改副本写入物理介质中,sync 方法才会返回。 sync 方法由要求物理存储(比例文件)处于某种已知状态下的代码使用。例如,提供简单事务处理设施的类可以使用 sync 来确保某个文件所有由给定事务造成的更改都记录在存储介质上。 sync 只影响此 FileDescriptor 的缓冲区下游。如果正通过应用程序(例如,通过一个 BufferedOutputStream 对象)实现内存缓冲,那么必须在数据受 sync 影响之前将这些缓冲区刷新,并转到 FileDescriptor 中(例如,通过调用 OutputStream.flush)。

最后

以上就是激情机器猫为你收集整理的android向U盘中拷贝文件成功后立刻断开,文件0字节的全部内容,希望文章能够帮你解决android向U盘中拷贝文件成功后立刻断开,文件0字节所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部