- 浏览: 88180 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
com_zyq:
怎么没有其他介绍呀
java开发web类似xp资源管理器上传图片工具 -
ballence:
感谢楼主,教程很好~~
继续努力
ApacheTomcat整合教程. -
cheqicheqi:
因为我使用spring mvc视图层是静态文件,fck的tld ...
Velocity中使用FCKeditor(FCKeditor for java) -
tianshui0:
liuwg 写道配置文件在哪里配置用Velocity就是为了省 ...
Velocity中使用FCKeditor(FCKeditor for java) -
ty0410916:
大哥你写的
FCKeditorWrapper fck = ne ...
Velocity中使用FCKeditor(FCKeditor for java)
properties文件在应用系统很长用,写properties文件和加载properties文件都很简单也是很常用的方法。
持久化键值对Properties类提供了store几个方法,其中只能在第一行加入注释,之前写的注释也会丢失并且不支持中文。
因此改进写一下代码,对注解中文的支持以及持久化过程中不丢失注解,不多说,上代码。
package com.zohan.www.util; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; /** * @ClassName: Properties * @Description: 重写Properties类中的部分方法 在保存过程中不丢失注释 * @author zohan inlw@sina.com * @date 2012-10-24 下午10:31:54 * @version 0.1.1 修改对 键值对中存在等号的 * */ public class Properties extends java.util.Properties { /** 源文件地址 */ private String filePath = null; /** 参考文件地址 */ private String referFile = null; /** * 存放用户放置的 key\value */ private Map<String, String> map = new HashMap<String, String>(); /** * @Fields serialVersionUID :(用一句话描述这个变量表示什么) */ private static final long serialVersionUID = 1L; /** * @throws IOException * @Title: load * @Description: 增加load方法, * @param file * 设定文件 * @return void 返回类型 * @throws */ public void load(File file) throws IOException { if (null != file) this.filePath = file.getPath(); FileInputStream fis = new FileInputStream(file); super.load(fis); fis.close(); } /* * (non-Javadoc) * * @see java.util.Properties#getProperty(java.lang.String) */ @Override public String getProperty(String key) { String value = map.get(key); return null == value ? super.getProperty(key) : value; } /* * (non-Javadoc) * * @see java.util.Properties#setProperty(java.lang.String, java.lang.String) */ @Override public synchronized Object setProperty(String key, String value) { return map.put(key, value); } /* * (non-Javadoc) * * @see java.util.Properties#stringPropertyNames() */ @Override public Set<String> stringPropertyNames() { return super.stringPropertyNames(); } /** * * @Title: store * @Description:把键值对持久化,包括注释 加载的时候请使用public void load(File file) 方法 * @param target * @param comments * @throws Exception * 设定文件 * @return void 返回类型 * @throws */ public void store(String target, String comments) throws Exception { // filePath 不为空且存在 File inFile = null; String temp = System.getProperty("java.io.tmpdir"); temp = temp.endsWith(File.separator) ? temp : temp .concat(File.separator); if (!StringUtils.isEmpty(filePath)) { inFile = new File(filePath); if (inFile.exists()) { referFile = temp.concat(inFile.getName()); } } inFile = new File(filePath); // filePath 为null targetFile作为 参考文件读取 if (StringUtils.isEmpty(filePath) && !inFile.exists()) { throw new Exception("参考文件不能为空"); } // referFile 为空选择target 为参照文件 if (StringUtils.isEmpty(referFile)) { referFile = temp.concat(inFile.getName()); } FileUtils.copyFile(inFile, new File(referFile)); store0(new BufferedWriter(new OutputStreamWriter(new FileOutputStream( target), "utf-8")), comments, true); new File(referFile).delete(); } /** * * @Title: store0 * @Description: 重写父类的写入文件方法,将注释也写入文件 * @param @param bw * @param @param comments * @param @param escUnicode * @param @throws IOException 设定文件 * @return void 返回类型 * @throws */ private void store0(BufferedWriter bw, String comments, boolean escUnicode) throws IOException { if (comments != null) { writeComments(bw, comments); } bw.write("#" + new Date().toString()); bw.newLine(); synchronized (this) { Map<String, String> temp = new HashMap<String, String>(); for (Enumeration e = keys(); e.hasMoreElements();) { String key = (String) e.nextElement(); String val = (String) get(key); temp.put(key, val); } for (String key : map.keySet()) { temp.put(key, map.get(key)); } BufferedReader br = new BufferedReader(new FileReader(referFile)); String line = ""; while ((line = br.readLine()) != null) { if (line.length() == 0) { bw.newLine(); } else if (line.trim().startsWith("#")) { writeCommentsLine(bw, line); } else { // 获取key(^[^=]*(\\=)?[^=]*)= Pattern p = Pattern.compile("(^[^=]*)="); Matcher m = p.matcher(line.replaceAll("\\\\=", "ab")); String key = ""; if (m.find()) { key = m.group(1); key = line.substring(0, key.length()); } key = key.replaceAll("\\\\=", "="); String value = temp.remove(key.trim()); if (StringUtils.isEmpty(value)) { String v = line.replace(key, ""); if (StringUtils.isEmpty(v)) { value = ""; } else { if (v.trim().startsWith("=")) { value = v.substring(1); } else { value = temp.get(key); } } } key = saveConvert(key.trim(), true, escUnicode); /* * No need to escape embedded and trailing spaces for value, * hence pass false to flag. */ value = saveConvert(value.trim(), false, escUnicode); bw.write(key + "=" + value); bw.newLine(); } } br.close(); for (String key : temp.keySet()) { String value = map.get(key); key = saveConvert(key.trim(), true, escUnicode); if (!StringUtils.isEmpty(value)) { value = saveConvert(value.trim(), false, escUnicode); } else { value = ""; } bw.write(key + "=" + value); bw.newLine(); } } bw.flush(); } /* * Converts unicodes to encoded \uxxxx and escapes special characters * with a preceding slash */ private String saveConvert(String theString, boolean escapeSpace, boolean escapeUnicode) { int len = theString.length(); int bufLen = len * 2; if (bufLen < 0) { bufLen = Integer.MAX_VALUE; } StringBuffer outBuffer = new StringBuffer(bufLen); for (int x = 0; x < len; x++) { char aChar = theString.charAt(x); // Handle common case first, selecting largest block that // avoids the specials below if ((aChar > 61) && (aChar < 127)) { if (aChar == '\\') { outBuffer.append('\\'); outBuffer.append('\\'); continue; } outBuffer.append(aChar); continue; } switch (aChar) { case ' ': if (x == 0 || escapeSpace) outBuffer.append('\\'); outBuffer.append(' '); break; case '\t': outBuffer.append('\\'); outBuffer.append('t'); break; case '\n': outBuffer.append('\\'); outBuffer.append('n'); break; case '\r': outBuffer.append('\\'); outBuffer.append('r'); break; case '\f': outBuffer.append('\\'); outBuffer.append('f'); break; case '=': // Fall through case ':': // Fall through case '#': // Fall through case '!': outBuffer.append('\\'); outBuffer.append(aChar); break; default: if (((aChar < 0x0020) || (aChar > 0x007e)) & escapeUnicode) { outBuffer.append('\\'); outBuffer.append('u'); outBuffer.append(toHex((aChar >> 12) & 0xF)); outBuffer.append(toHex((aChar >> 8) & 0xF)); outBuffer.append(toHex((aChar >> 4) & 0xF)); outBuffer.append(toHex(aChar & 0xF)); } else { outBuffer.append(aChar); } } } return outBuffer.toString(); } /** * Convert a nibble to a hex character * * @param nibble * the nibble to convert. */ private static char toHex(int nibble) { return hexDigit[(nibble & 0xF)]; } /** A table of hex digits */ private static final char[] hexDigit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; /** * * @Title: writeCommentsLine * @Description: 无特殊写法 * @param @param bw * @param @param comments * @param @throws IOException 设定文件 * @return void 返回类型 * @throws */ private static void writeCommentsLine(BufferedWriter bw, String comments) throws IOException { bw.write(comments); bw.newLine(); } /** * * @Title: writeComments * @Description:拷贝类的写注解方式 * @param @param bw * @param @param comments * @param @throws IOException 设定文件 * @return void 返回类型 * @throws */ private static void writeComments(BufferedWriter bw, String comments) throws IOException { bw.write("#"); int len = comments.length(); int current = 0; int last = 0; char[] uu = new char[6]; uu[0] = '\\'; uu[1] = 'u'; while (current < len) { char c = comments.charAt(current); if (c > '\u00ff' || c == '\n' || c == '\r') { if (last != current) bw.write(comments.substring(last, current)); if (c > '\u00ff') { uu[2] = toHex((c >> 12) & 0xf); uu[3] = toHex((c >> 8) & 0xf); uu[4] = toHex((c >> 4) & 0xf); uu[5] = toHex(c & 0xf); bw.write(new String(uu)); } else { bw.newLine(); if (c == '\r' && current != len - 1 && comments.charAt(current + 1) == '\n') { current++; } if (current == len - 1 || (comments.charAt(current + 1) != '#' && comments .charAt(current + 1) != '!')) bw.write("#"); } last = current + 1; } current++; } if (last != current) bw.write(comments.substring(last, current)); bw.newLine(); } /** * @throws Exception * @Title: main * @Description: 测试文件 * @param @param args 设定文件 * @return void 返回类型 * @throws */ public static void main(String[] args) throws Exception { Properties pro = new Properties(); File file = new File("e:\\ss.properties"); try { // 采用File参数 pro.load(file); pro.setProperty("zohan", "zohan"); System.out.println(pro.get("zohan")); // 持久化键值对 pro.store("e:\\ss.properties", null); } catch (IOException e) { e.printStackTrace(); } } }
前两天的代码里,有bug,不支持键值对中有等号,今天修复了bug重新发一次
发表评论
-
Sping +hibernate+JTA 注解配置
2014-04-22 10:31 3511随着业务的不断扩展数据库的压力越来越大,为了减少数据 ... -
使用struts 注解解决重复提交问题
2014-04-16 11:47 1534如何解决表单的重复提交问题?目前使用表单提交的方式 ... -
log4j 获取动态参数(转载)
2014-04-09 16:16 994在log中必须先了解log4j自带的两个类MDC和NDC ... -
Log4j写入数据库记录
2014-04-09 15:25 663log4j.rootLogger=DEBUG,db ... -
Struts2 注解中跳转 action
2014-02-28 17:30 0在xml中跳转action我想大家都是会的,那么注解中跳转其 ... -
开源软件镜像站点列表
2014-01-01 21:16 950阿里云开源镜像站:htt ... -
上传图片预览(服务器版)组件
2013-06-22 19:04 2695preview v0.1.0 初始版本 图片上传预 ... -
宝宝日期计算小工具
2013-05-05 07:52 925在计算今天宝宝已经出生了多少天,很烦人。每当有人问起宝宝多 ... -
jsp Tag 编写中基本类型问题
2013-03-30 07:53 816最近在项目中做jsp 标签写function时老是提示找不 ... -
自动升级程序设计
2012-11-19 22:54 1298最近公司接了一个项目 ... -
java 调用cmd/sh文件
2012-10-30 21:21 8905最近在做产品遇到java在windows下面调用bat脚本和在 ... -
hadoop操作HDFS文件权限问题
2012-02-12 12:51 26718描述:在window下使用Ecli ... -
liunx安装jdk和Tomcat
2011-01-01 23:49 11701.下载jdk和tomcat apache-tom ... -
Tomcat内存溢出解决方法
2010-12-31 22:28 1051-Xms256m -Xmx512m -XX:PermSize= ... -
J2EE学习中一些值得研究的开源项目
2009-10-16 09:38 572这篇文章写在我研究J2SE、J2EE近三年后。前3年我研究了J ... -
Velocity中使用FCKeditor(FCKeditor for java)
2009-04-25 07:49 26451.下载fckeditor-java-2.4.1-bin.zi ... -
java开发web类似xp资源管理器上传图片工具
2009-01-11 18:00 2332在客户端实施的类似xp资源管理器上传图片工具 -
ApacheTomcat整合教程.
2009-01-07 14:12 1262如题,网上搜到的本人觉得不错,挺详细的! -
Session机制详解(jsp-servlet 技术)
2008-12-17 13:24 1283虽然session机制在web应用程序中被采用已经很长时间了, ...
相关推荐
1. 加载`db.properties`:使用`java.util.Properties`类读取配置文件,解析成键值对。 2. 创建`SqlSessionFactoryBuilder`:利用配置信息实例化`SqlSessionFactoryBuilder`对象。 3. 构建`SqlSessionFactory`:调用`...
- **Properties**:用于处理键值对的属性文件。 **1.2.11 Annotation** - **注解**:提供元数据的方式,可被编译器或运行时解析。 **1.2.12 JMS** - **消息服务**:Java Messaging Service,用于生产者和消费者...
MyBatis-plus在SQL映射文件的基础上增加了实体类和注解,使得数据库操作更加直观和便捷。在商城系统中,MyBatis-plus可以有效地处理商品、订单、用户等数据的增删改查,提高了开发效率。 Redis是一款高性能的键值...
Spring Data Redis提供了`RedisTemplate`和`StringRedisTemplate`,用于操作Redis中的键值对。前者是通用模板,支持各种数据类型,后者专为字符串操作优化。 5. **缓存管理** Spring Boot可以通过`@Cacheable`、`...
Redis作为一种高性能的键值数据存储系统,常被用作缓存或持久化数据库,以提升应用性能。本教程将深入讲解如何在SpringBoot项目中通过注解方式实现Redis数据库的切换。 首先,我们需要理解SpringBoot与Redis的集成...
配置完成后,Spring Boot会自动创建一个RedisTemplate实例,你可以通过@Autowired注解注入到你的服务类中,如下所示: ```java @Autowired private RedisTemplate, Object> redisTemplate; ``` 为了方便操作,...
Mybatis是一款广泛使用的Java持久层框架,它的主要目标是简化对数据库的操作,提供更加灵活的SQL映射机制。Mybatis起源于Apache组织的ibatis框架,历经发展,在2010年迁移到Google Code并改名为Mybatis,最终在2013...
Hibernate使得Java对象可以直接参与到数据库操作中,极大地提高了开发效率。 5. **依赖管理**: 在实际开发中,这些jar包可能还需要其他依赖,如JTA(Java Transaction API)用于处理分布式事务,或者其他的ORM...
`.properties`采用键值对的形式,而`.yml`以树状结构展示,更易读。在编写配置文件时,需要注意键值间的分隔符和缩进规则。 Spring Boot的视图层技术可以整合JSP或Thymeleaf。Thymeleaf是Spring官方推荐的模板引擎...
1. `properties`:定义了一系列的属性键值对,这些属性可以在配置文件的其他部分被引用。 2. `settings`:用来调整MyBatis的行为,例如是否启用延迟加载(LazyLoading)、日志配置等。 3. `typeAliases`:为Java类...
- **properties**:使用键值对的形式。 - **yml/yaml**:使用层级结构,支持数组和复杂对象。 **5.SpringBoot的核心注解是哪个?它主要由哪几个注解组成的?** - **@SpringBootApplication**:组合注解,包括`@...
MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 4. **Maven**: Maven是Apache软件基金会开发的一个项目管理工具,它...
MyBatis是一个轻量级的Java持久层框架,它的核心目标是简化JDBC的开发流程,实现事务管理和实体类与SQL命令的动态映射。MyBatis起源于Apache的Ibatis项目,在2010年迁移到Google,然后在2013年进一步迁移到Github,...
在Action中,我们可以使用国际化资源文件中的键值对来获取错误消息或其他提示信息,以适应不同地区的用户。 总结起来,SSH2框架在实现增删改查功能时,涉及了Struts2的请求处理、Spring的依赖注入和事务管理、...
其次,MyBatis是一个轻量级的持久层框架,它将SQL语句与Java代码解耦,通过XML或注解的方式配置映射,使得数据库操作更为直观和灵活。在Spring+MyBatis的集成中,Spring管理MyBatis的SqlSessionFactory和SqlSession...
只需在配置文件中定义新的键值对,然后在Java类中使用`@ConfigurationProperties`注解将它们绑定到一个Java Bean。 #### 5. 随机数配置 Spring Boot提供了生成随机数的能力,可以通过配置文件定义随机数的范围和...
在Spring Boot中集成JPA(Java Persistence API)可以方便地进行数据库操作,包括CRUD(创建、读取、更新和删除)等基本操作。本篇文章将深入探讨Spring Boot结合JPA进行数据库操作的相关知识点。 1. **JPA介绍** ...
Redis是一种高性能的键值数据存储系统,常用于缓存、消息队列和数据持久化等场景。Spring Boot提供了便捷的方式与Redis进行交互,通过集成Spring Data Redis模块,我们可以轻松地在Java应用程序中操作Redis。 首先...
5. **RedisUtil工具类**: 封装通用的Redis操作,如设置、获取、删除键值对等,便于代码复用和管理。 **SpringBoot整合MyBatis** 1. **添加依赖**: 在`pom.xml`文件中添加MyBatis和MyBatis-Spring-Boot-Starter依赖...
3. 创建 mapper 接口和对应的 XML 映射文件,实现 SQL 查询和操作。 4. 使用 `@Mapper` 注解标记 mapper 接口,Spring Boot 会自动扫描并注入。 5. 在主应用类或配置类中启用 Mybatis 配置,使用 `@EnableMybatis` ...