11_数据存储(六): Properties的使用

本文详细介绍了Android环境下如何利用Properties文件进行配置信息的存储与管理,包括获取存储信息的IO流方法、Properties类的load方法应用、以及如何在工程中使用和维护这些配置文件。
Android基础汇总​​​​​​​
安卓中由于Properties可以将特定格式的文件转化为Properties对象,从而获取键值对,所以经常用来存储配置信息如请求网络的路径。
 
1.获取存储信息的io流:有2中方法一种是context,一种是类加载器:
 
    
2.调用Properties的load方法
 
Properties工程中路径:assets目录下,xxx.properties
 
工具类:
public class MyProperUtil {
 private static Properties urlProps;
 
 public static Properties getProperties(Context c) {
  Properties props = new Properties();
  try {
           // 方法一:通过activity中的context攻取setting.properties的FileInputStream
           InputStream in = c.getAssets().open("appConfig.properties");
 
           // 方法二:通过class获取setting.properties的FileInputStream
       // InputStream in = PropertiesUtill.class.getResourceAsStream("/assets/  setting.properties "));
  
         props.load(in);
  } catch (Exception e1) {
           e1.printStackTrace();
  }
      urlProps = props;
      return urlProps;
 }
}
 
使用:Properties  p = MyProperUtil.getProperties(context);
            //保存数据
 

p.put("picUrl", "http://blog.youkuaiyun.com/baopengjian");

//获取
String url = p.getProperty("picUrl")

//删除

 

p.remove("picUrl");

 

//清除

 

p.clear();

            
<think> 我们有一个JSON对象需要在鸿蒙系统中定义为全局只读静态变量。在鸿蒙开发中,我们通常使用TypeScript(或JavaScript)作为开发语言。由于鸿蒙系统支持JS/TS开发,我们可以使用TS的语法来定义全局只读变量。 根据需求,我们需要: 1. 定义一个全局变量,可以在整个应用中被访问。 2. 这个变量是只读的(即不可修改)。 3. 这个变量是静态的(即不需要实例化即可使用)。 在TypeScript中,我们可以使用`const`来定义常量,但是常量只能在模块内使用。如果要在全局使用,我们可以将其定义在一个模块中,然后通过导出(export)和导入(import)来使用。但是,如果希望真正的全局变量,我们可以将其挂载到全局对象上(如globalThis)或者使用单例模式。 然而,在鸿蒙系统中,我们也可以使用`export`导出常量,然后在需要的地方导入。但是,如果需要在多个文件中使用,每次导入可能比较麻烦。因此,我们可以考虑使用一个全局的配置文件。 但是,注意:用户要求是“全局只读静态变量”。在TypeScript中,我们可以这样实现: 方案1:在一个ts文件中定义并导出常量,然后在其他地方导入使用。这样,导入后就是只读的(因为使用const定义,并且导出的是常量)。 例如,我们创建一个文件`globalConstants.ts`: ```typescript export const EventConfig = { "app_regist_click": { "event_name": "app_regist_click", "properties": { "business_name": "大盘", "page_name": "#current_page" } }, // ... 其他事件配置 } as const; // 使用as const将整个对象变为只读 ``` 然后在其他文件中导入: ```typescript import { EventConfig } from './globalConstants'; // 使用EventConfig,它是只读的,任何修改都会在编译时报错 ``` 方案2:如果我们希望不导入直接使用,可以将其挂载到全局对象,但这样会污染全局命名空间,不推荐。 方案3:使用单例模式,但这里我们只需要一个常量对象,所以使用方案1即可。 但是,注意:用户要求是“全局”且“静态”。方案1通过导入使用,实际上每个导入的地方都是对同一个常量的引用,且是静态的(不需要实例化)。 另外,在鸿蒙系统中,我们也可以使用`AppStorage`来存储全局数据,但`AppStorage`是可读写的,虽然我们可以设置只读,但这里的数据是固定的,不需要响应式更新,所以使用导出的常量更合适。 因此,我们采用方案1。注意,使用`as const`后,对象的所有属性都成为只读(深度只读)。 定义示例: 由于数据结构较大,我们只写一部分示例,然后扩展即可。 具体步骤: 1. 在项目目录下(例如`common/constants`)创建`globalConstants.ts`文件。 2. 在文件中定义并导出常量。 代码实现: 文件路径:`common/constants/globalConstants.ts` ```typescript // 定义事件配置常量 export const EventConfig = { "app_regist_click": { "event_name": "app_regist_click", "properties": { "business_name": "大盘", "page_name": "#current_page" } }, "change_password_submit": { "event_name": "change_password_submit", "properties": { "business_name": "大盘" } }, "transfer_function_click": { "event_name": "transfer_function_click", "properties": { "business_name": "转账" } }, "app_topTab_click": { "event_name": "app_topTab_click", "properties": { "business_name": "大盘", "page_name": "#current_page", "click_name": "#current_page" } }, "app_function_click": { "event_name": "app_function_click", "properties": { "business_name": "大盘", "page_name": "#current_page" } } } as const; ``` 在其他文件中使用: ```typescript import { EventConfig } from '../common/constants/globalConstants'; // 举例:访问app_regist_click的事件名 let eventName = EventConfig.app_regist_click.event_name; // 此时,如果尝试修改,例如: // EventConfig.app_regist_click.event_name = "new_name"; // 编译时会报错,运行时也会报错(在严格模式下) ``` 这样,我们就实现了在鸿蒙系统中将给定数据结构定义为全局只读静态变量。 注意:`as const`是TypeScript 3.4引入的语法,称为const断言。它告诉TypeScript将对象的所有属性设置为只读,并且将字面量的类型推断为字面量类型而不是拓宽后的类型。 如果项目中没有使用TypeScript,而是使用JavaScript,那么我们可以这样写: ```javascript // 在globalConstants.js中 export const EventConfig = Object.freeze({ // ... 同样的数据结构 }); ``` `Object.freeze`是JavaScript中用于冻结对象的方法,使得对象不可修改(浅冻结,对于嵌套对象需要递归冻结)。但是,对于深冻结,我们需要自己实现递归冻结或者使用第三方库。不过,在鸿蒙开发中,我们通常使用TypeScript。 因此,在TypeScript中,使用`as const`已经足够,因为它会在编译时防止修改,并且如果尝试修改,在严格模式下运行时会抛出错误。 总结:我们使用TypeScript的`as const`来定义深度只读的常量对象,并通过模块导入导出来实现全局访问。 §§相关问题§§ 1. 如何在鸿蒙系统中定义全局可读写的静态变量? 2. TypeScript中的const断言和Object.freeze有什么区别? 3. 鸿蒙系统中还有哪些管理全局数据的方式? 4. 如何确保嵌套对象的不可变性? 5. 在鸿蒙JS UI框架中如何实现全局数据的响应式更新? </think>在鸿蒙系统中,可以通过以下方式将给定的数据结构定义为全局只读静态变量: ### 推荐方案:使用常量对象 + Object.freeze() ```typescript // 在全局常量文件中定义 (如globalConstants.ets) export const EventConfig = Object.freeze({ "app_regist_click": Object.freeze({ "event_name": "app_regist_click", "properties": Object.freeze({ "business_name": "大盘", "page_name": "#current_page" }) }), "change_password_submit": Object.freeze({ "event_name": "change_password_submit", "properties": Object.freeze({ "business_name": "大盘" }) }), "transfer_function_click": Object.freeze({ "event_name": "transfer_function_click", "properties": Object.freeze({ "business_name": "转账" }) }), "app_topTab_click": Object.freeze({ "event_name": "app_topTab_click", "properties": Object.freeze({ "business_name": "大盘", "page_name": "#current_page", "click_name": "#current_page" }) }), "app_function_click": Object.freeze({ "event_name": "app_function_click", "properties": Object.freeze({ "business_name": "大盘", "page_name": "#current_page" }) }) }); ``` ### 使用示例: ```typescript import { EventConfig } from '../common/globalConstants'; // 读取配置 const eventName = EventConfig.app_regist_click.event_name; const businessName = EventConfig.transfer_function_click.properties.business_name; // 以下操作会报错(只读属性不可修改) // EventConfig.app_regist_click = {}; // TypeError // EventConfig.app_regist_click.event_name = "new_name"; // TypeError ``` ### 关键实现说明: 1. **`Object.freeze()` 方法**: - 深度冻结对象及其所有嵌套属性 - 使对象变为不可修改(只读) - 在严格模式下尝试修改会抛出错误 2. **全局访问方式**: - 在单独文件中定义(如 `globalConstants.ets`) - 通过 `export` 导出为模块级常量 - 在需要的地方使用 `import` 导入 3. **只读特性保障**: - 编译时静态检查(TypeScript 类型系统) - 运行时保护(`Object.freeze` 实现) - 嵌套对象也应用 `freeze` 确保深度只读 ### 替代方案:const 声明 + 类型断言 ```typescript export const EventConfig = { // ...完整数据结构 } as const; // TS 只读断言 ``` ### 最佳实践建议: 1. 将常量定义在独立的全局文件中(如 `src/main/ets/common/globalConstants.ets`) 2. 使用多级 `Object.freeze()` 确保深层对象不可变 3. 添加类型注解增强代码可读性: ```typescript interface EventConfig { [key: string]: { event_name: string; properties: Record<string, string>; } } export const EventConfig: Readonly<EventConfig> = Object.freeze({...}); ``` 4. 在应用入口初始化(可选): ```typescript // entry/src/main/ets/entryability/EntryAbility.ts import { EventConfig } from '../common/globalConstants'; export default class EntryAbility extends Ability { onCreate() { AppStorage.SetOrCreate<typeof EventConfig>('EventConfig', EventConfig); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值