-
Notifications
You must be signed in to change notification settings - Fork 0
/
README
54 lines (38 loc) · 3.25 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Android標準のSharedPreferencesがマルチプロセス非対応だった
( MODE_MULTI_PROCESS を指定しただけでは不十分)
ので、がっかりしつつ書いた設定ファイル管理モジュールです。
import jp.juggler.util.ConfigurationFileSP;
SharedPreferences pref = ConfigurationFileSP.getInstance(path,false);
という感じで作成した pref を SharedPreferences と同じ感じに使えます。
ConfigurationFileSP#getInstance は pathごとに固有のインスタンスを使い回します。
-----------------------------------------
src/jp/juggler/util/ConfigurationFileSP.java
キーと値のマップを保持するタイプの設定管理クラスです。
- インタフェースは SharedPreferences とおおむね互換があります。
- ファイル更新部分は複数プロセスからの読み書きに対応しています。
ただし制限がいくつかあります。
- OnSharedPreferenceChangeListener をサポートしてません。実行時にUnsupportedOperationExceptionを出します。
- SharedPreferences.Editor#apply() をサポートしてません。実行時にUnsupportedOperationExceptionを出します。
- SharedPreferences.Editor#commit の呼び出しスレッドから直接ファイルアクセスを行います。STRICTモードだと問題があるかもしれません。
- 継承元インタフェースの制限により、エラー時にIOExceptionではなくRuntimeExceptionを投げる場合があります
-----------------------------------------
src/jp/juggler/util/TransactionalFileAccess.java
複数のプロセスからデータファイルの読み書きを行うためのクラスです。
データの読み込みには byte[] load_if_update() を使います。
まだデータを読んだことがないか、最後に読んだあとに変更されていればデータを読み込みます。
データの書き出しには transaction(TransactionProc) を呼び出します。
古いデータを加工して新しいデータを返すようなコードを TransactionProc#update に 実装してください。
特徴
- 読み書きの際に flock (javaのFileLock) を取得して排他を行います。
- ヘッダ部分をmmap(javaの MappedByteBuffer)でメモリにマッピングして、更新チェックの負荷を下げています。
- データのSHA-1ダイジェストをヘッダに格納して、ロード時にチェックを行います。
- 保存時にバックアップファイルを作成するのでデータ破損に強い?かもしれません。破損の仕方にもよりますが。
注意点
- このクラスは実際にはデータファイルとバックアップファイルの2つのファイルを作成/更新します
- MappedByteBuffer は明示的に unmapを行うことができません。gcまかせです。
- MappedByteBuffer.force() の結果が別プロセス上のマッピングにすぐに伝達されるかどうかは未定義です。
- ファイル全体がメモリに収まるような用途しか想定してません。
-----------------------------------------
ライセンス
配布・改造などの再利用はご自由にどうぞ。
ただし著作権は放棄しません。