大部分情況下,我們面對在兩個java進程只見傳遞數(shù)據(jù)的問題時,第一個想到的就是開server,然后通過socket收發(fā)消息。這方面有大量的框架可用,就不細說了。
但如果兩個進程是在一臺機器上,那么還可以使用另一種方式來傳遞數(shù)據(jù),那就是使用RandomAccessFile的文件映射模式。
RandomAccessFile的map方法把文件映射到內(nèi)存中進行快速讀寫。因此可以通過把消息包寫入到文件中,然后另一個進程讀取出來的方式來完成數(shù)據(jù)傳遞。
在這個過程中,重點是要考慮什么時候?qū)懭胪瓿桑挥袑懭胪瓿珊?,讀取進程才可以去讀數(shù)據(jù),否則就是錯誤的數(shù)據(jù)。具體方案如下:
保留文件的首個byte作為標志位,1表示A進程寫入完畢,0表示B進程讀取完畢。
步驟1:A進程開始寫入時,先跳過首字節(jié),然后將數(shù)據(jù)長度,數(shù)據(jù)內(nèi)容寫入到文件。寫入完畢后,將文件的首字節(jié)置為1
步驟2:B進程定時刷新文件到內(nèi)存中,讀取首字節(jié),如果是0則跳出,等待下次刷新。如果是1表示有新數(shù)據(jù),則加載。加載完畢后設置首字節(jié)為0.表示已經(jīng)讀取完畢。
步驟3:A進程定時刷新文件到內(nèi)存,讀取首字節(jié),如果是0,表示可以寫入,繼續(xù)步驟1的流程。如果是1,則表示數(shù)據(jù)還沒被讀取,不可寫入。等待下次刷新。
經(jīng)過以上3個步驟,完成數(shù)據(jù)的進程間傳遞。此模式也可以用于將數(shù)據(jù)傳遞到非java進程。
代碼如下:
public class TestRandomAccessFile { private static String FileName="aa.a"; private static volatile Linux1 lx1; private static volatile Linux2 lx2; private static long from; private static void close(Closeable c){ try{ c.close(); }catch(IOException ie){ ie.printStackTrace(); } } public static class Linux1{ MappedByteBuffer buf; RandomAccessFile raf; public Linux1