【问题标题】:Writing to file blocks sometimes有时写入文件块
【发布时间】:2012-12-24 02:18:04
【问题描述】:

我实现了一个下载管理器,它工作正常,除了我注意到一件事,有时线程在写入文件时会阻塞一段时间(50 毫秒到最多 10 秒),我在 Android 上运行这个程序(基于 Linux ),我的猜测是操作系统级别是否有某种 buffer 需要刷新,而我的写入实际上写入该缓冲区,如果该缓冲区已满,则写入需要等待.

我的问题是可能导致阻塞的可能原因是什么?

【问题讨论】:

  • java.io.BufferedWriter 是否也适用于 Android?
  • "...可能导致阻塞的原因是什么?" - 没有看到你的代码是不可能知道的。
  • 写入闪存是一项有时会遇到延迟的操作。 Android 是一个多任务系统,但许多实现在 Flash 接口的实现细节上存在“一次一个”的瓶颈,因此在某些情况下可能会看到性能不佳。这 10 秒显然令人惊讶,让人想知道手机上还运行着什么。

标签: java android file buffer


【解决方案1】:

众所周知,IO 是一种“阻塞”活动,因此您的问题应该是“当您的程序忙于等待 IO 完成时您应该做什么”

采用一些众所周知的并发策略和基于事件的编程模式是一个好的开始

【讨论】:

  • 我已经很久没有找到问题的原因了,我在这里发表评论以防其他人发现这有帮助。确实是因为忙IO。我正在使用多线程下载文件,如果目标文件太大,需要在线程开始写入文件之前创建一个大的稀疏文件(使用seek),所以write部分阻塞,我尝试保留所有线程写入文件的开头以避免一开始创建这么大的文件,通过这样做,我需要一个配置文件来保存每个线程的偏移量和写入的字节。现在一切正常。
【解决方案2】:

-我已经按照以下方式完成了文件的写入和读取,没有遇到任何问题。

例如:

File f = new File("Path");
FileWriter fw = new FileWriter(f);
BufferedWriter bw = new BufferedWriter(fw);

-您也可以试用 Java 中的 NIO 包。

【讨论】:

    猜你喜欢
    • 2012-07-11
    • 2016-01-30
    • 2015-11-24
    • 1970-01-01
    • 2019-04-30
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多