`
uule
  • 浏览: 6349989 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

常用的一些工具类

阅读更多

private HttpSession getSession(){
          RequestAttributes ra = RequestContextHolder.getRequestAttributes(); 
          HttpServletRequest request = ((ServletRequestAttributes)ra).getRequest();
          return request.getSession();
    }

 

1、BeanUtils.copyProperties 与PropertyUtils.copyProperties:


BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean 通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。

BeanUtils是这个包里比较常用的一个工具类,这里只介绍它的copyProperties()方法。该方法定义如下:
比方说把b复制到a,用BeanUtils.copyProperties(a,b)

如果你有两个具有很多相同属性的JavaBean,一个很常见的情况就是Struts里的PO对象(持久对象)和对应的ActionForm,例如 Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐 个赋值:

//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
teacher.setName(teacherForm.getName());
teacher.setAge(teacherForm.getAge());
teacher.setGender(teacherForm.getGender());
teacher.setMajor(teacherForm.getMajor());
teacher.setDepartment(teacherForm.getDepartment());

//持久化Teacher对象到数据库
HibernateDAO.save(teacher);

 而使用BeanUtils后,代码就大大改观了,如下所示:

TeacherForm teacherForm=(TeacherForm)form;
Teacher teacher=new Teacher();

BeanUtils.copyProperties(teacher,teacherForm);

HibernateDAO.save(teacher);

 如果Teacher和TeacherForm间存在名称不相同的属性,则BeanUtils不 对这些属性进行处理,需要程序员手动处理。例如 Teacher包含modifyDate(该属性记录最后修改日期,不需要用户在界面中输入)属性而TeacherForm无此属性,那么在上面代码的 copyProperties()后还要加上一句:

teacher.setModifyDate(new Date());

怎么样,很方便吧!除BeanUtils外还有一个名为PropertyUtils的工具类,它也提供copyProperties()方法,作用与 BeanUtils的同名方法十分相似,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换 ,而前者不支持这个功能,但是速度会更快一些。

 

2、StringEscapeUtils 提供了 SQL、 HTML、XML、JavaScript、Java 特殊字符的转义和还原 的方法

 

SQL特殊字符转义
  应该说,您即使没有处理 HTML 或 JavaScript 的特殊字符,也不会带来灾难性的后果,但是如果不在动态构造 SQL 语句时对变量中特殊字符进行处理,将可能导致程序漏洞、数据盗取、数据破坏等严重的安全问题。网络中有大量讲解 SQL 注入的文章,感兴趣的读者可以搜索相关的资料深入研究。

  虽然 SQL 注入的后果很严重,但是只要对动态构造的 SQL 语句的变量进行特殊字符转义处理,就可以避免这一问题的发生了。来看一个存在安全漏洞的经典例子:

SELECT COUNT(userId)
FROM t_user
WHERE userName='”+userName+”' AND password ='”+password+”';


  以上 SQL 语句根据返回的结果数判断用户提供的登录信息是否正确,如果 userName 变量不经过特殊字符转义处理就直接合并到 SQL 语句中,黑客就可以通过将 userName 设置为 “1' or '1'='1”绕过用户名/密码的检查直接进入系统了。
  为了防止他人使用特殊 SQL 字符破坏 SQL 的语句结构或植入恶意操作,必须在变量拼接到 SQL 语句之前对其中的特殊字符进行转义处理。Spring 并没有提供相应的工具类,您可以通过 jakarta commons lang 通用类包中(spring/lib/jakarta-commons/commons-lang.jar )的 StringEscapeUtils 完成这一工作:

sb.append(" and h.eglCode like '%" + StringEscapeUtils.escapeSql(hotel.getEglCode()) + "%'");

 。。。

 

3.StringUtils.isEmpty(Str)

org.apache.commons.lang.StringUtils

 

数组:
4.ArrayUtils.contains(array , value)  //boolean
      //Checks if the value is in the given array.

ArrayUtils.add(array, value)   //返回与array相同的数组类型
    //Copies the given array and adds the given element at the end of the new array.

ArrayUtils.isEquals
    // 只有当两个数组的数据类型,长度,数值顺序都相同的时候,该方法才会返回True
        1 两个数组完全相同
        ArrayUtils.isEquals(new int[] { 1, 2, 3 }, new int[] { 1, 2, 3 });// true
        2 数据类型以及长度相同,但各个Index上的数据不是一一对应
        ArrayUtils.isEquals(new int[] { 1, 3, 2 }, new int[] { 1, 2, 3 });// true
        3 数组的长度不一致
        ArrayUtils.isEquals(new int[] { 1, 2, 3, 3 }, new int[] { 1, 2, 3 });// false
        4 不同的数据类型
        ArrayUtils.isEquals(new int[] { 1, 2, 3 }, new long[] { 1, 2, 3 });// false
        ArrayUtils.isEquals(new Object[] { 1, 2, 3 }, new Object[] { 1, (long) 2, 3 });// false
        5 Null处理,如果输入的两个数组都为null时候则返回true
        ArrayUtils.isEquals(new int[] { 1, 2, 3 }, null);// false
        ArrayUtils.isEquals(null, null);// true

 

3、org.apache.commons.io.FileUtils

public static void cleanDirectory(File directory)
    Clean a directory without deleting it.
    //清空目录

public static void deleteDirectory(File directory)
    Recursively delete a directory.
    //删除目录

public static Collection<File> listFiles(File directory,
                    String[] extensions,
                    boolean recursive)
        //列出目录下指定类型的文件
Finds files within a given directory (and optionally its subdirectories) which match an array of extensions.
Parameters:
    directory - the directory to search in
    extensions - an array of extensions, ex. {"java","xml"}. If this parameter is null, all files are returned.
    recursive - if true all subdirectories are searched as well

public static String readFileToString(File file,
                 Charset encoding)
        //读出文件内容
Reads the contents of a file into a String. The file is always closed.
Parameters:
    file - the file to read, must not be null
    encoding - the encoding to use, null means platform default

 


public static void writeStringToFile(File file,
                 String data,
                 Charset encoding)
        //从内容转成文件
Writes a String to a file creating the file if it does not exist. NOTE: As from v1.3, the parent directories of the file will be created if they do not exist.
Parameters:
    file - the file to write
    data - the content to write to the file
    encoding - the encoding to use, null means platform default

 

public static void writeByteArrayToFile(File file,
                     byte[] data)
Writes a byte array to a file creating the file if it does not exist.
Parameters:
    file - the file to write to
    data - the content to write to the file

//将字节数组转换为文件,可用于文件上传

 

// 写文件
FileUtils.writeByteArrayToFile(new File(newName), file.getBytes());

 


格式转换:
FileUtils.writeStringToFile(javaFile,
            FileUtils.readFileToString(javaFile, System.getProperty("file.encoding")),
            "UTF-8");

File file = new File(path);
        //删除旧的文件,如果有的话
        try {
            if(file.isDirectory()){
                FileUtils.deleteDirectory(file);
            }
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("无法清理旧的文件:("+ path +") "+e.getMessage());
        }

 

 4、org.apache.commons.io.FilenameUtils  (对文件路径的操作)

 

有时候我们要在项目中获取文件名称,文件路径,文件后缀名等文件路径信息,commons-io包中的FilenameUtils类给我们把获取这些信息的方法都封装好了,我们就直接调用就好了。

 

在使用JDK的File类构建目录、文件对象时,通常会碰到以下的问题:
①分隔符的问题:Unix系统和Windos系统的路径分隔符、换行符不同
②路径规范的问题:有些API对于返回的目录路径不带"/",有些则有
③文件名规范的问题:有些文件名中间带有空格,导致程序解析错误

上面的问题虽然不算复杂,却也恼人。有时候甚至会在这些问题上耗费大量的时间。于是Apache commons io包提供了一个FilenameUtils类来专门帮助我们解决这样的问题。

import org.apache.commons.io.FilenameUtils;

public class FilenameUtilsDemoMain {
	
	public static void main(String[] args) {
		// 文件路径
		String path = "D:/SYS_USER_GROUP.SQL";

		// 临时变量
		String tempVar = null;

		// 得到文件名称(不包括文件后缀名)
		tempVar = FilenameUtils.getBaseName(path);
		System.out.println("当前文件名称(不包括文件后缀名):" + tempVar);

		// 得到文件名称(包括文件后缀名)
		tempVar = FilenameUtils.getName(path);
		System.out.println("当前文件名称(包括文件后缀名):" + tempVar);

		// 得到文件根目录
		tempVar = FilenameUtils.getPrefix(path);
		System.out.println("当前文件根的目录:" + tempVar);

		// 得到当前文件的上一级目录
		tempVar = FilenameUtils.getFullPathNoEndSeparator(path);
		System.out.println("当前文件的上一级目录:" + tempVar);

		tempVar = FilenameUtils.getExtension(path);
		System.out.println("文件扩展名为: "+tempVar);
	}
}
 结果:

当前文件名称(不包括文件后缀名):SYS_USER_GROUP
当前文件名称(包括文件后缀名):SYS_USER_GROUP.SQL
当前文件根的目录:D:/
当前文件的上一级目录:D:
文件扩展名为: SQL

 

 5、Arrays.binarySearch()

 public static int binarySearch(Object[] a,Object key)
     使用二分搜索法来搜索指定数组,以获得指定对象。在进行此调用之前,     必须根据元素的自然顺序对数组进行升序排序(通过 sort(Object[]) 方     法     )。如果没有对数组进行排序,则结果是不确定的。(如果数组包     含不可相互比较的元素(例如,字符串和整数),则无法 根据其元素的自     然顺序对数组进行排序,因此结果是不确定的。)如果数组包含多个等于     指定对象的元素,则无法保证找到的是哪一个。

参数:
      a - 要搜索的数组
      key - 要搜索的值

返回:
     如果它包含在数组中,则返回搜索键的索引;否则返回 - 1 。
     插入点 被定义为将键插入数组的那一点:即第一个大于此键的元素索引,
     如果数组中的所有元素都小于指定的键,则为 a.length。注意,这保证了当且仅当此键被找到时,返回的值将 >= 0。

     否则返回 (-(插入点) - 1)这句话要注意:要是查询的的值小于数组里面的最小值那么结果就是-1,
     如果查询的值大于数组里面的最大值。那么结果就是它的索引值

抛出:
    ClassCastException - 如果搜索的键不能与数组的元素进行比较。

if(Arrays.binarySearch(new String[]{"zip"}, ext) >= 0)

 

6、IOUtils.toInputStream(String)
IOUtils.toString(InputStream)
List IOUtils.readLines(InputStream)

 

in.put("md5checksum.txt", IOUtils.toInputStream(detail.toString(), "UTF-8"));

 

 IOUtils.toString(this.getClass().getClassLoader().getResourceAsStream("META-INF/ws/wsdl.template"));

 源码:

/**
     * Convert the specified string to an input stream, encoded as bytes
     * using the default character encoding of the platform.
     *
     * @param input the string to convert
     * @return an input stream
     * @since Commons IO 1.1
     */
    public static InputStream toInputStream(String input) {
        byte[] bytes = input.getBytes();
        return new ByteArrayInputStream(bytes);
    }

public static InputStream toInputStream(String input, String encoding) throws IOException {
        byte[] bytes = encoding != null ? input.getBytes(encoding) : input.getBytes();
        return new ByteArrayInputStream(bytes);
    }

 

/**
     * Writes bytes from a <code>byte[]</code> to an <code>OutputStream</code>.
     * 
     */
    public static void write(byte[] data, OutputStream output)
            throws IOException {
        if (data != null) {
            output.write(data);
        }
    }

 

/**
     * Get the contents of an <code>InputStream</code> as a <code>byte[]</code>.
     */
    public static byte[] toByteArray(InputStream input) throws IOException {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        copy(input, output);
        return output.toByteArray();
    }

public static long copyLarge(InputStream input, OutputStream output)
            throws IOException {
        byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
        long count = 0;
        int n = 0;
        while (-1 != (n = input.read(buffer))) {
            output.write(buffer, 0, n);
            count += n;
        }
        return count;
    }

加载模版,填充参数,生成文件:

String path = descDir + "MsgHeader.xsd";
		
String msg = null;
try {
	msg = IOUtils.toString(this.getClass().getClassLoader().getResourceAsStream("META-INF/ws/MsgHeader.template"));				
	msg = String.format(msg, namespacePrefix, systemVersion, System.currentTimeMillis(), typeDefinition);			
	FileUtils.writeStringToFile(new File(path), msg);

} catch (Exception e) {
	e.printStackTrace();
	logger.error("generateMsgHeaderXsdFile error : " + e.getMessage());
	throw new ConvertsServiceException(e.getMessage());
}

 

 

7、String.format

long timestamp = System.currentTimeMillis();
String.format("%1$tY%1$tm%1$td%1$tH%1$tM%1$tS", timestamp)

 

 //  %1 第一个参数

//   $t  表示是时间

 http://www.cnblogs.com/xytop/archive/2008/08/26/1277125.html

 

 8.Arrays.toString(Object[]  arr)

 String[] cmd = new String[]{"wsimport", "-b", jaxwsC, "-s", src, "-p", pkg, "-verbose", uri, "-Xnocompile"};
logger.debug("cmd : " + Arrays.toString(cmd));

 

 Process process = Runtime.getRuntime().exec(cmd);
InputStream input = process.getInputStream();
reader = new BufferedReader(new InputStreamReader(input));   

 

 9.strObj.indexOf(str)
strObj.indexOf(str, startIndex])
    //starIndex 可选项。该整数值指出在 String 对象内开始查找的索引。如果省略,则从字符串的开始处查找。
   
StringBuilder.Append
    //将信息追加到当前 StringBuilder 的结尾。
StringBuilder.insert(int offset,String str)
    //Inserts the string into this character sequence.
    //将字符串或对象插入指定索引处。    
    //插入offset之前

 

 9、System.arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length);
/**
	 * 连接合并两个数组
	 */
	public static String[] concatenateStringArrays(String[] array1, String[] array2) {
		if (ObjectUtils.isEmpty(array1)) {
			return array2;
		}
		if (ObjectUtils.isEmpty(array2)) {
			return array1;
		}
		String[] newArr = new String[array1.length + array2.length];
		System.arraycopy(array1, 0, newArr, 0, array1.length);
		System.arraycopy(array2, 0, newArr, array1.length, array2.length);
		return newArr;
	}
 
/**
	 * Append the given String to the given String array, returning a new array
	 * 添加元素到数组
	 */
	public static String[] addStringToArray(String[] array, String str) {
		if (ObjectUtils.isEmpty(array)) {
			return new String[] {str};
		}
		String[] newArr = new String[array.length + 1];
		System.arraycopy(array, 0, newArr, 0, array.length);
		newArr[array.length] = str;
		return newArr;
	}
 
10、Object[]  Arrays.copyOf(Object[] original, int newLength)
Parameters: 
original the array to be copied 
newLength the length of the copy to be returned 
Returns: 
	a copy of the original array, truncated or padded with nulls to obtain the specified length 
 
 11、JAVA中把两个数组合为一个的方法:
链接:http://blog.csdn.net/jaycee110905/article/details/9179227
法1:ArrayUtils.addAll(Object[], Object[])方法
apache-commons包中
String[] both = (String[]) ArrayUtils.addAll(first, second);
 法2:System.arraycopy()
static String[] concat(String[] a, String[] b) {  
   String[] c= new String[a.length+b.length];  
   System.arraycopy(a, 0, c, 0, a.length);  
   System.arraycopy(b, 0, c, a.length, b.length);  
   return c;  
}  
 法3:Arrays.copyOf()
public static <T> T[] concat(T[] first, T[] second) {  
  T[] result = Arrays.copyOf(first, first.length + second.length);  
  System.arraycopy(second, 0, result, first.length, second.length);  
  return result;  
}   
 
//合并多个
public static <T> T[] concatAll(T[] first, T[]... rest) {  
  int totalLength = first.length;  
  for (T[] array : rest) {  
    totalLength += array.length;  
  }  
  T[] result = Arrays.copyOf(first, totalLength);  
  int offset = first.length;  
  for (T[] array : rest) {  
    System.arraycopy(array, 0, result, offset, array.length);  
    offset += array.length;  
  }  
  return result;  
}  
 使用如下:
String[] both = concat(first, second);
String[] more = concat(first, second, third, fourth);
法4:使用Array.newInstance来生成数组
private static <T> T[] concat(T[] a, T[] b) {  
    final int alen = a.length;  
    final int blen = b.length;  
    if (alen == 0) {  
        return b;  
    }  
    if (blen == 0) {  
        return a;  
    }  
    final T[] result = (T[]) java.lang.reflect.Array.  
            newInstance(a.getClass().getComponentType(), alen + blen);  
    System.arraycopy(a, 0, result, 0, alen);  
    System.arraycopy(b, 0, result, alen, blen);  
    return result;  
}  
 
 ..
 
 
 
 
。。。
 
 
分享到:
评论

相关推荐

    一些java常用的工具类

    以下是对"一些java常用的工具类"的详细说明。 首先,工具类通常包含静态方法,这些方法不依赖于类的实例,可以直接调用,减少了对象创建的开销。这些类通常以“Utils”或“Helper”结尾,如Apache Commons Lang中的...

    Android开发常用工具类合集

    本资源包括常用工具类,目前收录了数组工具类、异步工具类、base64工具类、bitmap工具类、缓存工具类、时间工具类、http连接、json、IO、Map、MD5、数据库、SD卡、UbbToHtml等工具类合集

    自己整理的C#常用工具类

    在C#编程中,工具类(Utility Class)是一种常见的设计模式,它封装了一些常用的功能,以便在项目中方便地重复使用。这些工具类通常包含静态方法,不涉及实例化,直接通过类名调用,降低了代码冗余,提高了代码复用...

    C++工具类-常用工具类源码

    以上就是`C++工具类-常用工具类源码`中可能包含的一些核心功能。这样的工具类在实际开发中非常实用,可以提高代码的可复用性和项目的开发效率。通过学习和理解这些源码,开发者能够更好地理解和掌握C++的文件操作、...

    C#工具类库类库 包含所有的常用工具类

    标题中的"C#工具类库类库 包含所有的常用工具类"暗示了这是一个集合,包含了多种实用工具类,能够极大地提升开发效率。这些工具类涵盖了从文件操作到网络通信的多个领域。 首先,FTP操作类是用于与FTP服务器进行...

    java常用的工具类整理28个

    以上是Java中28个常用工具类的简要介绍,每个类都有丰富的功能,掌握并灵活运用它们,将极大提升你的Java编程能力。在实际开发中,根据具体需求选择合适的工具类,可以编写出高效、简洁的代码。

    php封装一些常用的工具类

    一个php封装一些常用的工具类,将xml转换为数组,将数组转化成xml,PHP post请求之发送XML数据,PHP post请求之发送Json对象数据,PHP post请求之发送数组,接收xml数据并转化成数组,接收json数据并转化成数组,...

    C#常用工具类代码集合Util第二版本(自己工作总结)

    C#常用工具类代码集合Util第二版本(自己工作总结),包括常用工具类,扩展方法工具类,百度地图C#工具类,Echart工具类,Office工具类,Autofac工具类,Web开发常用工具类,Winform开发常用工具类,是自己工作十年...

    Java开发常用Util工具类

    字符串工具类/数据类型转换类/集合工具类/数组工具类/Properties文件操作类/常用流操作工具类/编码工具类/Json工具类/日期工具类/下载文件工具类/解压ZIP工具类/文件编码转码

    个人总结常用经典Utils工具类

    1、Utils工具类有String工具类、XmlNode节点工具类、BeanFactory相关、Common工具类、Cookie工具类、Date工具类、Http工具类、JDBC工具类、日志Log工具类、Servlet相关等。2、工具类省了重复造轮子的工作,可以直接...

    java常用工具类

    文件工具类,Http请求工具类,图片处理工具类。...mail工具类,Map工具类,MD5编码工具类,数字工具类,随机数工具类,反射工具类,字符串处理工具类,URL工具类,XML工具类,常用的数据验证工具类

    常用工具类常用工具类.zip

    下面我们将深入探讨Java中的工具类及其重要性,以及一些常见的工具类库。 1. **Java.lang**: 这是Java平台中最基础的包,包含了所有Java程序都会用到的基本类,如`String`、`Integer`、`Math`等。`Math`类提供了...

    常用的java工具类

    1.[工具类] 读取、打印输出、保存xml .java 2.[工具类] Java中计算任意两个日期之间的工作天数 .java 3.[工具类] MD5 .java 4.[工具类] 时间工具TimeUtil.java 5.[工具类] 通信服务端...等等20几个常用工具类.

    常用Java工具类

    以下是对标题和描述中提到的一些常用Java工具类的详细解释: 1. **数据库池工具类**:数据库连接池是管理数据库连接的一种机制,它能有效地复用已存在的数据库连接,避免频繁创建和关闭连接导致的性能开销。常见的...

    Java常用工具类

    Java常用工具类是Java开发中不可或缺的一部分,它们提供了一系列便捷的方法,帮助开发者高效地处理各种常见任务。在Java中,最著名的工具类库是`java.util`包,它包含了大量实用类,如集合、日期时间、数学计算、...

    java常用工具类的封装jar

    并且在平时开发中会遇到各种各样通用的一些功能,比如对json的处理,对String对象的处理,对Excel文件的处理,MD5加密处理,Bean对象处理等等,这些常用并通用的方法可以被封装成一个个工具类如StringUtil,...

    C#基础类 常用类 常用方法源码 .NET 工具类 源码

    这个压缩包“C#基础类 常用类 常用方法源码 .NET 工具类 源码”包含了C#编程中的基础类和常用工具类的源代码,对于学习和理解C#的编程实践非常有帮助。下面,我们将详细探讨这些关键知识点。 1. **基础类**:在C#中...

    Android常用工具类

    本篇文章将详细探讨Android开发中的几个常用工具类,包括LOG、Toast、SharedPreferences以及其他的实用工具类。 1. **LOG工具类**: 在Android开发中,日志(LOG)主要用于调试和追踪应用运行时的状态。自定义的...

    一些java常用的工具类整合

    以下是对标题“一些java常用的工具类整合”及描述中提到的知识点的详细解释: 1. **字符编码**: 在Java中,处理字符编码通常涉及到`java.nio.charset`包中的类。例如,`Charset`类可以用于识别和操作字符集,`...

Global site tag (gtag.js) - Google Analytics