- 浏览: 7339608 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
Spring 不但提供了一个功能全面的应用开发框架,本身还拥有众多可以在程序编写时直接使用的工具类,您不但可以在 Spring 应用中使用这些工具类,也可以在其它的应用中使用,这些工具类中的大部分是可以在脱离 Spring 框架时使用的。了解 Spring 中有哪些好用的工具类并在程序编写时适当使用,将有助于提高开发效率、增强代码质量。
在这个分为两部分的文章中,我们将从众多的 Spring 工具类中遴选出那些好用的工具类介绍给大家。第 1 部分将介绍与文件资源操作和 Web 相关的工具类文件资源操作
文件资源的操作是应用程序中常见的功能,如当上传一个文件后将其保存在特定目录下,从指定地址加载一个配置文件等等。我们一般使用 JDK 的 I/O 处理类完成这些操作,但对于一般的应用程序来说,JDK 的这些操作类所提供的方法过于底层,直接使用它们进行文件操作不但程序编写复杂而且容易产生错误。相比于 JDK 的 File,Spring 的 Resource 接口(资源概念的描述接口)抽象层面更高且涵盖面更广,Spring 提供了许多方便易用的资源操作工具类,它们大大降低资源操作的复杂度,同时具有更强的普适性。这些工具类不依赖于 Spring 容器,这意味着您可以在程序中象一般普通类一样使用它们。
Spring 定义了一个 org.springframework.core.io.Resource 接口,Resource 接口是为了统一各种类型不同的资源而定义的,Spring 提供了若干 Resource 接口的实现类,这些实现类可以轻松地加载不同类型的底层资源,并提供了获取文件名、URL 地址以及资源内容的操作方法。
访问文件资源
假设有一个文件地位于 Web 应用的类路径下,您可以通过以下方式对这个文件资源进行访问:
- 通过 FileSystemResource 以文件系统绝对路径的方式进行访问;
- 通过 ClassPathResource 以类路径的方式进行访问;
- 通过 ServletContextResource 以相对于Web应用根目录的方式进行访问。
相比于通过 JDK 的 File 类访问文件资源的方式,Spring 的 Resource 实现类无疑提供了更加灵活的操作方式,您可以根据情况选择适合的 Resource 实现类访问资源。下面,我们分别通过 FileSystemResource 和 ClassPathResource 访问同一个文件资源:
package com.baobaotao.io; import java.io.IOException; import java.io.InputStream; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; public class FileSourceExample { public static void main(String[] args) { try { String filePath = "D:/masterSpring/chapter23/webapp/WEB-INF/classes/conf/file1.txt"; // ① 使用系统文件路径方式加载文件 Resource res1 = new FileSystemResource(filePath); // ② 使用类路径方式加载文件 Resource res2 = new ClassPathResource("conf/file1.txt"); InputStream ins1 = res1.getInputStream(); InputStream ins2 = res2.getInputStream(); System.out.println("res1:"+res1.getFilename()); System.out.println("res2:"+res2.getFilename()); } catch (IOException e) { e.printStackTrace(); } } } |
在获取资源后,您就可以通过 Resource 接口定义的多个方法访问文件的数据和其它的信息:如您可以通过 getFileName() 获取文件名,通过 getFile() 获取资源对应的 File 对象,通过 getInputStream() 直接获取文件的输入流。此外,您还可以通过 createRelative(String relativePath) 在资源相对地址上创建新的资源。
在 Web 应用中,您还可以通过 ServletContextResource 以相对于 Web 应用根目录的方式访问文件资源,如下所示:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <jsp:directive.page import=" org.springframework.web.context.support.ServletContextResource"/> <jsp:directive.page import="org.springframework.core.io.Resource"/> <% // ① 注意文件资源地址以相对于 Web 应用根路径的方式表示 Resource res3 = new ServletContextResource(application, "/WEB-INF/classes/conf/file1.txt"); out.print(res3.getFilename()); %> |
对于位于远程服务器(Web 服务器或 FTP 服务器)的文件资源,您则可以方便地通过 UrlResource 进行访问。
为了方便访问不同类型的资源,您必须使用相应的 Resource 实现类,是否可以在不显式使用 Resource 实现类的情况下,仅根据带特殊前缀的资源地址直接加载文件资源呢?Spring 提供了一个 ResourceUtils 工具类,它支持“classpath:”和“file:”的地址前缀,它能够从指定的地址加载文件资源,请看下面的例子:
package com.baobaotao.io; import java.io.File; import org.springframework.util.ResourceUtils; public class ResourceUtilsExample { public static void main(String[] args) throws Throwable{ File clsFile = ResourceUtils.getFile("classpath:conf/file1.txt"); System.out.println(clsFile.isFile()); String httpFilePath = "file:D:/masterSpring/chapter23/src/conf/file1.txt"; File httpFile = ResourceUtils.getFile(httpFilePath); System.out.println(httpFile.isFile()); } } |
ResourceUtils 的 getFile(String resourceLocation) 方法支持带特殊前缀的资源地址,这样,我们就可以在不和 Resource 实现类打交道的情况下使用 Spring 文件资源加载的功能了。
本地化文件资源
本地化文件资源是一组通过本地化标识名进行特殊命名的文件,Spring 提供的 LocalizedResourceHelper 允许通过文件资源基名和本地化实体获取匹配的本地化文件资源并以 Resource 对象返回。假设在类路径的 i18n 目录下,拥有一组基名为 message 的本地化文件资源,我们通过以下实例演示获取对应中国大陆和美国的本地化文件资源:
package com.baobaotao.io; import java.util.Locale; import org.springframework.core.io.Resource; import org.springframework.core.io.support.LocalizedResourceHelper; public class LocaleResourceTest { public static void main(String[] args) { LocalizedResourceHelper lrHalper = new LocalizedResourceHelper(); // ① 获取对应美国的本地化文件资源 Resource msg_us = lrHalper.findLocalizedResource("i18n/message", ".properties", Locale.US); // ② 获取对应中国大陆的本地化文件资源 Resource msg_cn = lrHalper.findLocalizedResource("i18n/message", ".properties", Locale.CHINA); System.out.println("fileName(us):"+msg_us.getFilename()); System.out.println("fileName(cn):"+msg_cn.getFilename()); } } |
虽然 JDK 的 java.util.ResourceBundle 类也可以通过相似的方式获取本地化文件资源,但是其返回的是 ResourceBundle 类型的对象。如果您决定统一使用 Spring 的 Resource 接表征文件资源,那么 LocalizedResourceHelper 就是获取文件资源的非常适合的帮助类了。
在使用各种 Resource 接口的实现类加载文件资源后,经常需要对文件资源进行读取、拷贝、转存等不同类型的操作。您可以通过 Resource 接口所提供了方法完成这些功能,不过在大多数情况下,通过 Spring 为 Resource 所配备的工具类完成文件资源的操作将更加方便。
文件内容拷贝
第一个我们要认识的是 FileCopyUtils,它提供了许多一步式的静态操作方法,能够将文件内容拷贝到一个目标 byte[]、String 甚至一个输出流或输出文件中。下面的实例展示了 FileCopyUtils 具体使用方法:
package com.baobaotao.io; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileReader; import java.io.OutputStream; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.util.FileCopyUtils; public class FileCopyUtilsExample { public static void main(String[] args) throws Throwable { Resource res = new ClassPathResource("conf/file1.txt"); // ① 将文件内容拷贝到一个 byte[] 中 byte[] fileData = FileCopyUtils.copyToByteArray(res.getFile()); // ② 将文件内容拷贝到一个 String 中 String fileStr = FileCopyUtils.copyToString(new FileReader(res.getFile())); // ③ 将文件内容拷贝到另一个目标文件 FileCopyUtils.copy(res.getFile(), new File(res.getFile().getParent()+ "/file2.txt")); // ④ 将文件内容拷贝到一个输出流中 OutputStream os = new ByteArrayOutputStream(); FileCopyUtils.copy(res.getInputStream(), os); } } |
往往我们都通过直接操作 InputStream 读取文件的内容,但是流操作的代码是比较底层的,代码的面向对象性并不强。通过 FileCopyUtils 读取和拷贝文件内容易于操作且相当直观。如在 ① 处,我们通过 FileCopyUtils 的 copyToByteArray(File in) 方法就可以直接将文件内容读到一个 byte[] 中;另一个可用的方法是 copyToByteArray(InputStream in),它将输入流读取到一个 byte[] 中。
如果是文本文件,您可能希望将文件内容读取到 String 中,此时您可以使用 copyToString(Reader in) 方法,如 ② 所示。使用 FileReader 对 File 进行封装,或使用 InputStreamReader 对 InputStream 进行封装就可以了。
FileCopyUtils 还提供了多个将文件内容拷贝到各种目标对象中的方法,这些方法包括:
static void copy(byte[] in, File out) |
将 byte[] 拷贝到一个文件中 |
static void copy(byte[] in, OutputStream out) |
将 byte[] 拷贝到一个输出流中 |
static int copy(File in, File out) |
将文件拷贝到另一个文件中 |
static int copy(InputStream in, OutputStream out) |
将输入流拷贝到输出流中 |
static int copy(Reader in, Writer out) |
将 Reader 读取的内容拷贝到 Writer 指向目标输出中 |
static void copy(String in, Writer out) |
将字符串拷贝到一个 Writer 指向的目标中 |
在实例中,我们虽然使用 Resource 加载文件资源,但 FileCopyUtils 本身和 Resource 没有任何关系,您完全可以在基于 JDK I/O API 的程序中使用这个工具类。
属性文件操作
我们知道可以通过 java.util.Properties的load(InputStream inStream) 方法从一个输入流中加载属性资源。Spring 提供的 PropertiesLoaderUtils 允许您直接通过基于类路径的文件地址加载属性资源,请看下面的例子:
package com.baobaotao.io; import java.util.Properties; import org.springframework.core.io.support.PropertiesLoaderUtils; public class PropertiesLoaderUtilsExample { public static void main(String[] args) throws Throwable { // ① jdbc.properties 是位于类路径下的文件 Properties props = PropertiesLoaderUtils.loadAllProperties("jdbc.properties"); System.out.println(props.getProperty("jdbc.driverClassName")); } } |
一般情况下,应用程序的属性文件都放置在类路径下,所以 PropertiesLoaderUtils 比之于 Properties#load(InputStream inStream) 方法显然具有更强的实用性。此外,PropertiesLoaderUtils 还可以直接从 Resource 对象中加载属性资源:
static Properties loadProperties(Resource resource) |
从 Resource 中加载属性 |
static void fillProperties(Properties props, Resource resource) |
将 Resource 中的属性数据添加到一个已经存在的 Properties 对象中 |
特殊编码的资源
当您使用 Resource 实现类加载文件资源时,它默认采用操作系统的编码格式。如果文件资源采用了特殊的编码格式(如 UTF-8),则在读取资源内容时必须事先通过 EncodedResource 指定编码格式,否则将会产生中文乱码的问题。
package com.baobaotao.io; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.core.io.support.EncodedResource; import org.springframework.util.FileCopyUtils; public class EncodedResourceExample { public static void main(String[] args) throws Throwable { Resource res = new ClassPathResource("conf/file1.txt"); // ① 指定文件资源对应的编码格式(UTF-8) EncodedResource encRes = new EncodedResource(res,"UTF-8"); // ② 这样才能正确读取文件的内容,而不会出现乱码 String content = FileCopyUtils.copyToString(encRes.getReader()); System.out.println(content); } } |
EncodedResource 拥有一个 getResource() 方法获取 Resource,但该方法返回的是通过构造函数传入的原 Resource 对象,所以必须通过 EncodedResource#getReader() 获取应用编码后的 Reader 对象,然后再通过该 Reader 读取文件的内容。
发表评论
-
【转】在项目中使用多个数据源-多sessionFactory方案
2013-05-10 16:30 3131适用范围:适合SSH架构访问多个数据库, ... -
【转】使用spring的动态路由实现数据库负载均衡
2013-03-17 22:57 3308使用spring的动态路由实现数据库负载均衡 系统中 ... -
【转】spring 数据库读写分离
2013-03-17 22:56 2804什么是数据库的读写分离 数据库的读写分离简单的说是把对数据 ... -
[转]Spring+iBatis+JOTM实现JTA事务
2013-03-17 22:51 3059Spring+iBatis+JOTM实现JTA事务 ... -
Spring 和Axis2整合相关那些事
2012-12-29 12:58 10421Axis2优劣: 现在用axis2开发一个webse ... -
【转】JAVA并发容器代码随读
2012-12-06 15:29 2954转载自 http://rdc.taobao.c ... -
Spring3.04和Junit4
2011-11-27 18:15 4396在Spring3.x以上必须采用 ... -
Spring加载属性文件的扩展
2011-08-22 12:21 3026在项目中一个属性文件配置信息,提供给数据连接信息 ... -
Brap和Spring整合(简单权限验证)
2011-07-26 10:31 1390在使用Spring的发 ... -
Quartz的任务的临时启动和暂停和恢复
2011-07-16 10:18 40227在项目中需要手动启停某些服务,那么需要有一个控 ... -
Quartz中定时调度EJB3.0服务
2011-07-13 22:25 2937在quartz2.0中只支持EJb2.0的服务 ... -
Quartz中定时调度EJB2.0服务
2011-07-13 22:12 2181在Quartz2.0中提供支持EJB2.0 ... -
Quartz的简单使用
2011-07-13 22:05 9956最近工作需要学习quartz,那么必须首先了解三个概念:调度器 ... -
Brap 远程访问调用 和Spring整合(二)
2010-12-08 14:52 2006Brap和 Spring 整合使用如 ... -
闲着没事Hessian开发WebService的总结(二)
2010-12-07 20:30 4034在Spring和Hessian整合中,以前 ... -
Spring JMX的学习总结(三) 基于注释的JMX的使用
2010-12-03 17:26 3362具体实现JMX的注释的类: package c ... -
Spring JMX的总结学习(二) 注解实现MBean
2010-12-03 17:24 6282本文采用Spring JMX ... -
Spring JMX的总结学习(一)基于标准接口的JMX
2010-12-03 17:21 3780在Spring中采用JMX标准形式的,开发相关的Spr ... -
Spring JMS的开发应用--自定义消息转换器的使用(四)
2010-12-03 01:37 2511在Spring JMS、中可以通过实现Me ... -
Spring JBOSSMQ JMS的开发应用(三)
2010-11-30 20:11 2345如果用过JMS的话,会发现它类似写JD ...
相关推荐
Spring不但提供了一个功能全面的应用开发框架,本身还拥有众多可以在程序编写时直接使用的工具类,您不但可以在Spring应用中使用这些工具类,也可以在其它的应用中使用,这些工具类中的大部分是可以在脱离Spring框架...
这个知识盘点涵盖了J2EE生态中的核心组件和技术,包括EJB(Enterprise JavaBeans)、Spring、Struts2、Hibernate、JavaScript以及JPA(Java Persistence API)。以下是对这些技术的详细解释: 1. EJB(Enterprise ...
SSM仓库库存管理系统是一个基于Java开发的Web应用,利用了Spring、Spring MVC和MyBatis三个框架的集成,也就是我们常说的Spring、SpringMVC和MyBatis的整合,简称SSM框架。这个系统主要用于实现对仓库库存的高效管理...
虽然具体信息不多,但可以预期在项目源码中可能会看到与Java软件开发相关的工具或组件。 【压缩包子文件的文件名称列表解析】 1. "说明.txt" - 这个文件通常包含了项目的简要介绍、安装指南、使用方法等关键信息,...
这个【ssm项目源码】企业固定资产管理系统,不仅展示了SSM框架的综合应用,还为企业提供了一个实用的资产管理工具,有助于规范资产管理流程,提升企业的运营效率。通过对源码的学习和研究,开发者可以深入了解Java...
**MyBatis框架**:MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。在本系统中,MyBatis作为数据库访问层,通过XML或注解方式配置SQL语句,实现了数据库操作与业务逻辑的解耦,简化了数据...
3. **MyBatis**:MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。它将SQL语句与Java代码分离,使得开发者可以更好地关注...
7. **javaWeb物资管理系统项目源码**:这个文件包含了项目的全部源代码,包括实体类、DAO接口、Mapper XML文件、Service接口及实现、Controller类等,开发者可以通过阅读源码学习SSM框架的使用以及物资管理系统的...
MyBatis是一个优秀的持久层框架,它简化了数据库操作,将SQL与Java代码结合起来。通过XML或注解方式配置,MyBatis可以将Java对象映射到数据库表记录,实现数据的增删改查。这种映射机制使得开发人员可以更专注于SQL...
总结,"Java项目超市购物管理系统"通过SSM框架的高效整合,实现了超市业务流程的全面自动化管理,为用户提供便捷的操作体验,同时为管理者提供了详尽的数据分析工具,是学习Java Web开发及实践SSM框架的绝佳案例。...
- **MyBatis:** 是一个优秀的持久层框架,提供了一种灵活的方式来操作数据库并实现数据的持久化。 **2. SSM框架的优势:** - **Spring框架:** - **依赖注入:** 减少了类间的耦合,使得开发更为简洁。 - **...
一款优秀的进销存管理系统能够帮助企业管理日常的进货、销售、库存等业务流程,提高运营效率,减少错误和遗漏。本文将深入探讨一个由个人独立完成的公司进销存管理系统的设计思路、主要功能以及实现技术。 首先,进...
Web版可能基于前后端分离的架构,前端可能使用React、Vue等主流框架,后端可能采用Spring Boot、Django等服务器端技术,数据库可能选择MySQL、Oracle或MongoDB等。 4. **数据还原与可用性** 描述中的"还原DB"意味...
SpringBoot是Spring框架的一个子项目,它简化了初始化和配置Spring应用的过程,降低了入门门槛。通过内置的Tomcat服务器和自动配置特性,SpringBoot可以快速地搭建独立运行的Web应用。在本项目中,SpringBoot负责...
首先,Java作为一种跨平台的编程语言,具有优秀的可移植性、稳定性和安全性,是开发此类系统理想的工具。其面向对象的特性使得代码结构清晰,便于维护和扩展。超市管理系统通常包括库存管理、销售管理、会员管理、...
在这个资产管理系统项目中,Eclipse起到了核心的开发平台作用,它的优秀性能和强大的工具集为项目的实现提供了便利。 该资产管理系统的核心功能包括: 1. **资产登记**:系统允许用户录入新购置的固定资产信息,...
图书管理系统是用于组织、存储和检索图书馆藏书信息的重要工具,它涵盖了图书的采购、编目、借阅、归还、馆际互借、遗失处理等各个环节。在这个信息化时代,图书管理系统的应用大大提高了图书馆的工作效率和服务质量...
此外,Spring框架和Hibernate ORM工具的引入可以简化开发流程,提高开发效率。 在实际运行中,商品进销存管理系统需要具备以下功能: 1. 商品管理:包括商品的添加、删除、修改和查询。 2. 库存管理:实时监控库存...