一个进程写文件,一个进程读文件的问题

问题描述

有一个进程 A 每隔一段时间(时间很短)往文件 F 后面加写数据,另一个进程 B 从文件 F 读数据,如何使进程 B 读的速度小于进程 A ,又要使其效率尽量高? 问题补充:xiaoyuqi00 写道

解决方案

如何使进程 B 读的速度小于进程 A ,又要使其效率尽量高?换个角度你把文件中每个字节看成队列中的节点,A一直写,你可以想象成A是往队列里面加值。B一直读,你可以想象成B从队列中取值。这时候B只需要判断队列长度是否发生了变化,如果有变化那么B就应该取值了,通过判断文件长度来触发B读取文件的事件。一开始B用非独占的模式打开文件,B获取文件大小,B读到该大小数据,B进入等待,B进行文件大小判断,如果文件到达需要读取长度B进行文件读取,B保留已经读取文件位置,进入下一个雷同操作。
解决方案二:
你说的不可控具体是指什么?一般的话可以给线程加名称来控制
解决方案三:
A线程写文件的时候加线程锁让B线程等待
解决方案四:
你这是两个进程间的同步?不是线程?进程之间,如果没有相互通信,我觉得很难保证B的速度刚好小于A,同时保证效率。用java的话,我觉得比较简单的方式是使用socket进行通信。比如读文件的进程起一个socketserver,写文件的进程每次写完数据以后,连接那个socket,发送信息说写了多少数据,然后,读文件的进程再进行相应的读取操作。

时间: 2024-12-02 07:27:19

一个进程写文件,一个进程读文件的问题的相关文章

JSP文件操作例程 - 读文件

js <%--作者:何志强[hhzqq@21cn.com]日期:2000-08-07版本:1.0功能:JSP文件操作例程 - 读文件--%> <%@ page contentType="text/html;charset=gb2312"%> <%//变量声明java.lang.String strFileName;     //文件名java.io.File objFile;             //文件对象java.io.FileReader obj

问一个大虾,读文件的简单问题!

问题描述 本人欲通过代码,执行打印文件命令.读文件时失败.DimpdfAsString="C:soccer.txt"DimfsAsFileStream=File.OpenRead(pdf)读之后是空文件. 解决方案 解决方案二:不会吧,何以得出结论是空文件?messagebox.showfs.lengh()看看,除非soccer.txt本身为空解决方案三:DimpdfAsString="C:soccer.txt"dimmyreaderStreamReaderas=n

JSP中读文件和写文件的例子

js 读文件的例子***************************************************<%@ page contentType="text/html;charset=gb2312"%><%//变量声明\java.lang.String strFileName; //文件名java.io.File objFile; //文件对象java.io.FileReader objFileReader; //读文件对象char[] chrBuff

改良XP预读文件 为系统启动提速

随着Windows系统的身躯越来越庞大,到了Windows XP中,微软提供了一种预读取的功能.即在Windows文件夹中添加了一个Prefetch文件夹,以利用该功能提高系统性能,加快系统启动和文件的读取速度.但是随着使用时间的增多,用户每使用一个程序,系统就会在该文件夹中留下一个以PF为扩展名的索引文件.预读文件导致系统启动变慢,是因为要读取运行程序时生成的索引文件所造成的.因此,我们只需要禁止PF文件的产生即可. 一.关闭相关服务 在"运行"窗口中输入"msconfig

Python操作文件和目录及文件读写

如果我们要在Python程序中执行目录和文件的操作,操作系统提供的命令只是简单地调用了操作系统提供的接口函数,Python内置的os模块也可以直接调用操作系统提供的接口函数. 打开Python交互式命令行,我们来看看如何使用os模块的基本功能: >>> import os>>> os.name # 操作系统名字'posix' 如果是posix,说明系统是Linux.Unix或Mac OS X,如果是nt,就是Windows系统. 要获取详细的系统信息,可以调用uname

c#写怎么防止并发操作(一个要删文件,一个要读文件)?

问题描述 c#写怎么防止并发操作(一个要删文件,一个要读文件)? c#写web后台文件和数据库操作,怎么防止并发操作(一个要删文件,一个要读文件)? 解决方案 你读文件的时候指定FileShare.Read,你删除的时候就会收到一个异常,不允许删除. 你在读文件的时候除非读完,不要Close文件,就可以了. https://msdn.microsoft.com/zh-cn/library/system.io.fileshare(VS.80).aspx

java读文件后的数据怎么写到一个数组中 数据格式如下

问题描述 java读文件后的数据怎么写到一个数组中 数据格式如下 解决方案 简单的写了一下,希望对你有帮助: public class Test { // 数组列数 private static final int COLUMN_COUNT = 3; public static void main(String[] args) { BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(new F

未能加载文件或程序集“Excel”或它的某一个依赖项。另一个程序正在使用此文件,进程无法访问。 (异常来自 HRESULT:0x80070020)

问题描述 未能加载文件或程序集"Excel"或它的某一个依赖项.另一个程序正在使用此文件,进程无法访问.(异常来自HRESULT:0x80070020)我的电脑不知道是怎么了,只是要外部引用的DLL,每次打开VS都会报这种错误,每次都是删除这个DLL,再重新引用,不行,再重起电脑,再删除,再重新引用...代码在其它电脑就不会有这种问题了....求大神指点.. 解决方案 解决方案二:你应该是用了excel的组件,然后没有从内存中释放...但是没道理啊,重启电脑还要再删除一次?解决方案三:

Linux下如何知道文件被那个进程写

本文链接地址: Linux下如何知道文件被那个进程写 一个问题:(想想能解决不?) "一个文件正在被进程写 我想查看这个进程 文件一直在增大 找不到谁在写 使用lsof也没找到" 这个问题挺有普遍性的,解决方法应该很多,这里我给大家提个比较直观的方法. linux下每个文件都会在某个块设备上存放,当然也都有相应的inode, 那么透过vfs.write我们就可以知道谁在不停的写入特定的设备上的inode. 幸运的是systemtap的安装包里带了inodewatch.stp,位于/us