JAVA小技巧总结

内容多半是大学的笔记,比较零散。整理一下:

1.JAVA的字符串反转

及java中的reverse的方法。

public class Test {
    public static void main(String args[]){
        String str = "abcdefg中文";
        char[] value = str.toCharArray();
        int n = str.length() - 1;
        for (int j = n >> 1; j >= 0; --j) {
            char temp = value[j];
            char temp2 = value[n - j];
            value[j] = temp2;
            value[n - j] = temp;
        }
        System.out.println(value);
    }
}

更多的方法可以参考这里:

http://www.360doc.com/content/07/0914/11/15458_743051.shtml

2 java的日期格式化

public static void main(String args[]){
   Date now=new Date();
   SimpleDateFormat f=new SimpleDateFormat("今天是" + "yyyy年MM月dd日 E kk点mm分");
   System.out.println(f.format(now));

   f=new SimpleDateFormat("a hh点mm分ss秒");
   System.out.println(f.format(now));
}
输出内容如下:
今天是2013年01月15日 星期二 21点53分
下午 09点53分25秒
     public static void main(String[] args){
        String strDate="2005年04月22日";
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy年MM月dd日");
        try{
            Date date=simpleDateFormat.parse(strDate);
            System.out.println(date);
        }
        catch(ParseException px)
        {
            px.printStackTrace();
        }
    }
输出的结果如下:
Fri Apr 22 00:00:00 CST 2005
     public static void main(String[] args){
         long now=System.currentTimeMillis();
         System.out.println("毫秒数:"+now);
         Date dNow=new Date(now);
         System.out.println("日期类型:"+dNow);
    }
输出的结果如下:
毫秒数:1358258406482
日期类型:Tue Jan 15 22:00:06 CST 2013
     public static void main(String[] args){
         SimpleDateFormat dateformat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
         System.out.println("今天  :"+dateformat.format(new Date()));
         Calendar c=Calendar.getInstance();
         c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
         Date d1=new Date(c.getTimeInMillis());
         System.out.println("星期一:"+dateformat.format(d1));
         c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
         Date d2=new Date(c.getTimeInMillis());
         System.out.println("星期日:"+dateformat.format(d2));
     }
输出结果为:
今天  :2013-01-15 22:04:50 星期二
星期一:2013-01-14 22:04:50 星期一
星期日:2013-01-13 22:04:50 星期日
更多内容参考:

http://android.blog.51cto.com/268543/50000

  • 常见日期格式化转换符

    转换符

    说  明

    示  例

    %te

     一个月中的某一天(131

     2

    %tb

     指定语言环境的月份简称

     Feb(英文)、二月(中文)

    %tB

     指定语言环境的月份全称

     February(英文)、二月(中文)

    %tA

     指定语言环境的星期几全称

     Monday(英文)、星期一(中文)

    %ta

     指定语言环境的星期几简称

     Mon(英文)、星期一(中文)

    %tc

     包括全部日期和时间信息

     星期四 十一月 26 10:26:30 CST 2009

    %tY

     4位年份

     2009

    %tj

     一年中的第几天(001366

     085

    %tm

     月份

     03

    %td

     一个月中的第几天(0131

     08

    %ty

     2位年份

     09


    时间格式化转换符

    转换符

    说  明

    示  例

    %tH

     2位数字的24小时制的小时(0023

     14

    %tI

     2位数字的12小时制的小时(0112

     05

    %tk

     2位数字的24小时制的小时(123

     5

    %tl

     2位数字的12小时制的小时(112

     10

    %tM

     2位数字的分钟(0059

     05

    %tS

     2位数字的秒数(0060

     12

    %tL

     3位数字的毫秒数(000999

     920

    %tN

     9位数字的微秒数(000000000999999999

     062000000000

    %tp

     指定语言环境下上午或下午标记

     下午(中文)、pm(英文)

    %tz

     相对于GMT RFC 82格式的数字时区偏移量

     +0800

    %tZ

     时区缩写形式的字符串

     CST

    %ts

     1970-01-01 00:00:00至现在经过的秒数

     1206426646

    %tQ

     1970-01-01 00:00:00至现在经过的毫秒数

     1206426737453


    常见的日期时间组合转换符

    转换符

    说  明

    示  例

    %tF

     “--日”格式(4位年份)

     2009-01-26

    %tD

     “//年”格式(2位年份)

     03/25/09

    %tr

     “时:分:秒 PMAM)”格式(12小时制)

     03:22:06 下午

    %tT

     “时:分:秒”格式(24小时制)

     15:23:50

    %tR

     “时:分”格式(24小时制)

     15:23

     public static void main(String[] args){
         Date date = new Date();
         String time = String.format("%tc", date);
         String form = String.format("%tF", date);

         System.out.println("全部的时间信息是:"+time);
         System.out.println("年-月-日的日期格式:"+form);
     }

输出的结果为:

全部的时间信息是:星期二 一月 15 22:10:05 CST 2013
年-月-日的日期格式:2013-01-15

/**

* 2013.01.18 补充

*/

Java   输入输出流

字节输入流

BufferedInputStream    从一个InputStream 中读取一个缓冲区,然后返回整个缓冲区的内容,使小量读写更有效。
ByteArrayInputStream   从一个字节数组中顺序读入多个字节
CheckedInputStream     这个 java.util.zip 包中的类计算从 InputStream 中读入内容的校验合
DataInputStream        从一个 InputStream 中读取 java 基本类型的二进制表达形式
FileInputStream        从文件中顺序读入多个字节
FilterInputStream      字节输入流的过滤器类的超类
GZIPInputStream        这个 java.io.zip 包中的类从 InputStream 中读入以 GZIP 形式压缩的内容
InflaterInputStream    GZIPInputStream 和 ZipInputStream 的超类
InputStream            所有字节输入流的超类
ObjectInputStream      从一个字节流读入二进制形式的 Java 对象和基本值,这个类用来反序列化对象。
PipedInputStream       读取写入到它所连接的 PipedOutputStream中的多个字节,在多线程程序中使用
PushbackInputStream    将一个固定大小的“回推缓冲区”添加到输入流中,从而这些字节内容可以是"读不出"的,在某些解析程序中有用。
SequenceInputStream    从两个或两个以上的输入流中顺序读入多个字节的内容,这些输入流就好像单独的一个输入流一样。
ZipInputStream         用来解压 ZIP 文件中的多个项目
字符输入流
BufferedReader      从 Reader 中读取多个字符到一个缓冲区,然后返回整个缓冲区内容。使小量读写更加有效。
CharArrayReader     从一个 Char 数组中顺序读入多个字符
FileReader          从文件中顺序读入多个字符,是 InputStreamReader 的子类,能从一个自动创建的FileInputStream 中读取数据。
FilterReader        字符输入流过滤器类的超类
InputStreamReader   从一个字节输入流读入字符,使用默认的编码方式或指定的编码方式将字节转化成字符
LineNumberReader    读取多行文本,并记录已经读取多少内容。
PipedReader         读取它所连接的 PipedOutputStream 中的多个字符。在多线程程序中使用。
PushbackReader      将固定大小的“回推缓冲区”添加到 Reader 中,从而这些内容可以是 “读不出”的,这在某些解析程序中很有用。
Reader              所有字符输入流的超类
StringReader        从一个字符串中顺序读入字符
字节输出流
BufferedOutputStream    将字节按缓冲区输出,当缓冲区满时才将其中字节写往 OutputStream
ByteArrayOutputStream   往字节数组中写入字节
CheckedOutputStream     这个 java.util.zip 包中的类,计算写OutputStream 中数据的校验合
DataOutputStream        以 java 基本类型的二进制形式向 OutputStream 写入
DeflaterOutputStream    GZIPOutputStream 和 ZipOutputStream 的超类
FileOutputStream        向文件中顺序写入字节
FilterOutputStream      字节输出流过滤器类的超类
GZIPOutputStream        这个 java.util.zip 包中的类,使用 GZIP 格式压缩写入其中的内容然后输出
ObjectOutputStream      向一个 OutputStream 写入二进制形式的 java 对象和基本类型,这个类用来序列化对象。
PipedOutputStream       将字节写入与他连接的  PipedInputStream 中,在多线程程序中使用
PrintStream             写入文本形式的 java 对象和基本类型,不推荐使用 PrintStream ,使用 PrintWriter 代替ZipOutputStream这个  java.util.zip 包中的类压缩 ZIP 文件中的数据


字符输出流

BufferedWriter    为提高效率将字符按缓冲区输出,仅当缓冲区满时才将字符写往输出流。
CharArrayWriter   向字符数组中写入字符
FileWriter        向文件中顺序写入字符,它是 OutputStreamWriter 的一个子类,能自动创建一个FileOutputStream.
FilterWriter      字符输出流过率器类的超类
OutputStreamWriter将字符写入字节输出流,使用默认编码方式或指定编码方式将字符转化成字节。
PipedWriter       将字符写入他连接的 PipedReader 中,在多线程程序中用到
StringWriter      将字符顺序写入一个内部创建的 StringBuffer 中
PrintWriter       在Writer 中写入文本形式的 Java 对象和基本类型
Writer            字符输出流的超类
参考文档:

http://lokvin.iteye.com/blog/95419

4 java中的路径

A绝对路径,主页上的文件或目录在硬盘上的真正的路径

B相对路径,相对于某个基准目录的路径,包含web相对路径,例如在servlet中,"/"表示WEB应用的根目录,和物理路径的相对表示,例如"./"代表当前目录,"../"代表上级目录

CJSP/SERVLET中的相对路径及绝对路径,服务器端的相对地址指相对于WEb应用的地址,这个地址是服务器端解析的,这时候的相对地址是指相对于web应用的。客户端的地址都是相对于服务器的根目录的,而不是web应用的根目录。

Djsp中获取当前应用的绝对和相对路径

根目录所对应的绝对路径:request.getRequestURI()

文件的绝对路径 :application.getRealPath(request.getRequestURI());

当前web应用的绝对路径 :application.getRealPath("/");

取得请求文件的上层目录:new File(application.getRealPath(request.getRequestURI())).getParent()

Eservlet中获取当前应用的绝对和相对路径


根目录所对应的绝对路径:request.getServletPath();

文件的绝对路径 :request.getSession().getServletContext().getRealPath(request.getRequestURI())

当前web应用的绝对路径 :servletConfig.getServletContext().getRealPath("/"); 

(ServletContext对象获得几种方式:

javax.servlet.http.HttpSession.getServletContext()

javax.servlet.jsp.PageContext.getServletContext()

javax.servlet.ServletConfig.getServletContext()

)

F 单独的java类获取绝对路径

默认情况下new File("/")代表的目录为:System.getProperty("user.dir")。

以下程序获取执行类的当前路径:

public class Test {

     public static void main(String[] args){
           
         System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));
         System.out.println(Test.class.getClassLoader().getResource(""));
         System.out.println(ClassLoader.getSystemResource(""));
         System.out.println(Test.class.getResource(""));
         System.out.println(Test.class.getResource("/")); //Class文件所在路径
         System.out.println(new File("/").getAbsolutePath());
         System.out.println(System.getProperty("user.dir"));
     }
}

G 服务器中java类获取当前路径



(1).Weblogic

WebApplication的系统文件根目录是你的weblogic安装所在根目录。例如:如果你的weblogic安装在c:\bea \weblogic700.....那么,你的文件根路径就是c:\.所以,有两种方式能够让你访问你的服务器端的文件:a.使用绝对路径:比如将你的参数文件放在c:\yourconfig\yourconf.properties,直接使用 new FileInputStream("yourconfig/yourconf.properties");

b.使用相对路径:相对路径的根目录就是你的 webapplication的根路径,即WEB-INF的上一级目录,将你的参数文件放在yourwebapp\yourconfig \yourconf.properties,这样使用:new FileInputStream("./yourconfig/yourconf.properties");这两种方式均可,自己选择。

(2).Tomcat

在类中输出System.getProperty("user.dir");显示的是%Tomcat_Home%/bin

(3).Resin

不是你的JSP放的相对路径,是JSP引擎执行这个JSP编译成SERVLET的路径为根.比如用新建文件法测试File f = new File("a.htm");这个a.htm在resin的安装目录下

(4).如何读相对路径哪?

在Java文件中getResource或getResourceAsStream均可

例:getClass().getResourceAsStream(filePath);//filePath可以是" /filename",这里的/代表web发布根路径下WEB-INF/classes默认使用该方法的路径是:WEB-INF/classes。已经在 Tomcat中测试。


参考文档:


http://www.programfan.com/article/3286.html

5 java不同平台下的文件路径

一 相对路径的获得

说明:相对路径(即不写明时候到底相对谁)均可通过以下方式获得(不论是一般的java项目还是web项目)

String relativelyPath=System.getProperty("user.dir");

上述相对路径中,java项目中的文件是相对于项目的根目录

web项目中的文件路径视不同的web服务器不同而不同(tomcat是相对于 tomcat安装目录\bin)

二 类加载目录的获得(即当运行时某一类时获得其装载目录)

1.1)通用的方法一(不论是一般的java项目还是web项目,先定位到能看到包路径的第一级目录)

InputStream is=TestAction.class.getClassLoader().getResourceAsStream("test.txt");

(test.txt文件的路径为  项目名\src\test.txt;类TestAction所在包的第一级目录位于src目录下)

上式中将TestAction,test.txt替换成对应成相应的类名和文件名字即可

1.2)通用方法二  (此方法和1.1中的方法类似,不同的是此方法必须以'/'开头)

InputStream is=Test1.class.getResourceAsStream("/test.txt");

(test.txt文件的路径为  项目名\src\test.txt,类Test1所在包的第一级目录位于src目录下)

三 web项目根目录的获得(发布之后)

1 从servlet出发

可建立一个servlet在其的init方法中写入如下语句

ServletContext s1=this.getServletContext();

String temp=s1.getRealPath("/"); (关键)

结果形如:D:\工具\Tomcat-6.0\webapps\002_ext\  (002_ext为项目名字)

如果是调用了s1.getRealPath("")则输出D:\工具\Tomcat-6.0\webapps\002_ext(少了一个"\")

2 从httpServletRequest出发

String cp11111=request.getSession().getServletContext().getRealPath("/");

结果形如:D:\工具\Tomcat-6.0\webapps\002_ext\

四  classpath的获取(在Eclipse中为获得src或者classes目录的路径)

方法一  Thread.currentThread().getContextClassLoader().getResource("").getPath()

eg: String t=Thread.currentThread().getContextClassLoader().getResource("").getPath();

     System.out.println("t---"+t);

输出:t---/E:/order/002_ext/WebRoot/WEB-INF/classes/

方法二      JdomParse.class.getClassLoader().getResource("").getPath()   (JdomParse为src某一个包中的类,下同)

eg:String p1=JdomParse.class.getClassLoader().getResource("").getPath();

    System.out.println("JdomParse.class.getClassLoader().getResource--"+p1);

输出: JdomParse.class.getClassLoader().getResource--/E:/order/002_ext/WebRoot/WEB-INF/classes/

另外,如果想把文件放在某一包中,则可以 通过以下方式获得到文件(先定位到该包的最后一级目录)

eg  String p2=JdomParse.class.getResource("").getPath();

     System.out.println("JdomParse.class.getResource---"+p2);

输出: JdomParse.class.getResource---/E:/order/002_ext/WebRoot/WEB-INF/classes/jdom/ (JdomParse为src目录下jdom包中的类)

四   属性文件的读取:

方法 一

InputStream in = lnew BufferedInputStream(

new  FileInputStream(name));        

Properties p = new  Properties();  p.load(in); 

注意路径的问题,做执行之后就可以调用p.getProperty("name")得到对应属性的值

方法二

Locale locale = Locale.getDefault(); 

ResourceBundle localResource = ResourceBundle.getBundle("test/propertiesTest", locale); 

String value = localResource.getString("test"); 

System.out.println("ResourceBundle: " + value);

工程src目录下propertiesTest.properties(名字后缀必须为properties)文件内容如下:

               test=hello word

参考文档:

http://www.cnblogs.com/lvpei/archive/2010/07/14/1777013.html

6 java网络编程

网络的协议有TCP/IP 传输控制协议及互谅网协议, UDP 用户数据协议

连接协议分为面向连接协议及非连接协议

socket是程序与网络就间的一种接口,大部分网络应用程序都是点对点的,所谓点是服务器端和客户端所执行的程序,socket是用来接收和传送分组的一个端点。

socket编程要用到java.net包,最常用的是net包下的6个类:InetAddress(互联网协议 (IP) 地址)类,Socket(套接字)类,ServerSocket(套接字服务器)类,DatagramSocket(发送和接收数据报包的套接字)类,DatagramPacket(数据报包)类,MulticastSocket(多播数据报套接字类用于发送和接收 IP 多播包)类,其中InetAddress、Socket、ServerSocket类是属于TCP面向连接协议,DatagramSocket、DatagramPacket和MulticastSocket类则属于UDP非连接协议的传送类。

更多的内容参考这里:

http://cuishen.iteye.com/blog/242842

7 java打开网页链接


public class Test {
    public  static  void main(String args[]){
        String cmdStr = "explorer http://www.baidu.com/";
        try {
            Runtime.getRuntime().exec(cmdStr);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



public  static  void main(String args[]){
        java.net.URI uri= null;
        try {
            uri = new java.net.URI("http://www.baidu.com");
            java.awt.Desktop.getDesktop().browse(uri);
        } catch (URISyntaxException e) {
            e.printStackTrace();  
        } catch (IOException e) {
            e.printStackTrace();  
        }
    }


8 java中的resultset

通用格式为:Statement stmt=con.createStatement(int type,int concurrency);我们在访问数据库的时候,在读取返回结果的时候,可能要前后移动指针,比如我们先计算有多少条信息,这是我们就需要把指针移到最后来计算,然后再把指针移到最前面,逐条读取,有时我们只需要逐条读取就可以了。还有就是有只我们只需要读取数据,为了不破坏数据,我们可采用只读模式,有时我们需要望数据库里添加记录,这是我们就要采用可更新数据库的模式。下面我们就对其参数进行说明: 

参数 int type 

ResultSet.TYPE_FORWORD_ONLY 结果集的游标只能向下滚动。 

ResultSet.TYPE_SCROLL_INSENSITIVE 结果集的游标可以上下移动,当数据库变化时,当前结果集不变。 

ResultSet.TYPE_SCROLL_SENSITIVE 返回可滚动的结果集,当数据库变化时,当前结果集同步改变。 

参数 int concurrency 

ResultSet.CONCUR_READ_ONLY 不能用结果集更新数据库中的表。 

ResultSet.CONCUR_UPDATETABLE 能用结果集更新数据库中的表。 

查询语句 

ResultSet re=stmt.executeUpdate(SQL语句);用来更新数据库信息或插入数据 

ResultSet re=stmt.executeQuery(SQL语句);用来查询数据库信息 


当我们使用ResultSet re=stmt.executeQuery(SQL语句)查询后,我们可以使用下列方法获得信息:

public boolean previous() 将游标向上移动,该方法返回boolean型数据,当移到结果集第一行之前时,返回false。

public void beforeFirst 将游标移动到结果集的初始位置,即在第一行之前。

public void afterLast() 将游标移到结果集最后一行之后。

public void first() 将游标移到结果集的第一行。

public void last() 将游标移到结果集的最后一行。

public boolean isAfterLast() 判断游标是否在最后一行之后。

public boolean isBeforeFirst() 判断游标是否在第一行之前。

public boolean ifFirst() 判断游标是否指向结果集的第一行。

public boolean isLast() 判断游标是否指向结果集的最后一行。

public int getRow() 得到当前游标所指向行的行号,行号从1开始,如果结果集没有行,返回0。

public boolean absolute(int row) 将游标移到参数row指定的行号。如果row取负值,就是倒数的行数,absolute(-1)表示移到最后一行,absolute(-2)表示移到倒数第2行。当移动到第一行前面或最后一行的后面时,该方法返回false

/**
2013.07.12更新

*/

9 outputstream转成inputstream

使用场合: 操作excel或pdf等文件时需要先写到输出流, 然后又要用到ftp上传该excel或pdf文件需要用到输入流作为参数,这时候我们就可以直接把该文件的输出流转为输入流直接上传到ftp服务器上

ByteArrayOutputStream os = new ByteArrayOutputStream();
InputStream is = new ByteArrayInputStream(os.toByteArray());

参考文档:http://www.blogjava.net/jgao/archive/2007/06/18/125012.html

10除去字符串中的html格式

private String detachTheFormat(String wikiContent) {
  if (wikiContent == null || "".equals(wikiContent.trim())) {
    return "";
  }
  String newWikiContent = wikiContent.replaceAll("\\&[a-zA-Z]{1,10};", "") // 去除类似<> 的字串
  .replaceAll("<[a-zA-Z]+[1-9]?[^><]*>", "") // 去除开始标签及没有结束标签的标签
  .replaceAll("</[a-zA-Z]+[1-9]?>", ""); // 去除结束标签 }
  return newWikiContent;
}

11ArrayList和Vector的区别,HashMap和Hashtable的区别

arraylist和vector

1、同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的

2、数据增长:当需要增长时,Vector默认增长为原来一倍,而ArrayList却是原来的一半 

hashmap和hashtable

1、历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现<o:p></o:p>

2、同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 <o:p></o:p>

3、值:只有HashMap可以让你将空值作为一个表的条目的key或value <o:p></o:p>

参考文档:http://surpass-li.iteye.com/blog/68405



总结一下,以上内容多为大学的时的笔记,内容比较杂。不定期的会整理增加些内容。



你可能感兴趣的:(JAVA小技巧总结)