大部分情況下,我們面對在兩個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進程。
代碼如下:

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

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
        
		

網(wǎng)友評論