string类的常用方法与java的nio

来源:互联网 发布:linux log4j 日志输出 编辑:程序博客网 时间:2024/04/29 19:35
 string类的常用方法
这些是最常用的:
char charAt (int index) 返回index所指定的字符
String concat(String str) 将两字符串连接
boolean endsWith(String str) 测试字符串是否以str结尾
boolean equals(Object obj) 比较两对象
char[] getBytes 将字符串转换成字符数组返回
char[] getBytes(String str) 将指定的字符串转成制服数组返回
boolean startsWith(String str) 测试字符串是否以str开始
int length() 返回字符串的长度
String replace(char old ,char new) 将old用new替代
char[] toCharArray 将字符串转换成字符数组
String toLowerCase() 将字符串内的字符改写成小写
String toUpperCase() 将字符串内的字符改写成大写
String valueOf(Boolean b) 将布尔方法b的内容用字符串表示
String valueOf(char ch) 将字符ch的内容用字符串表示
String valueOf(int index) 将数字index的内容用字符串表示
String valueOf(long l) 将长整数字l的内容用字符串表示
String substring(int1,int2) 取出字符串内第int1位置到int2的字符串

=============
以下解释的十分清楚了,还有例子
1、length() 字符串的长度
例:char chars[]={'a','b'.'c'};
String s=new String(chars);
int len=s.length();
2、charAt() 截取一个字符
例:char ch;
ch="abc".charAt(1); 返回'b'
3、 getChars() 截取多个字符
void getChars(int sourceStart,int sourceEnd,char target[],int targetStart)
sourceStart指定了子串开始字符的下标,sourceEnd指定了子串结束后的下一个字符的下标。因此, 子串包含从sourceStart到sourceEnd-1的字符。接收字符的数组由target指定,target中开始复制子串的下标值是targetStart。
例:String s="this is a demo of the getChars method.";
char buf[]=new char[20];
s.getChars(10,14,buf,0);
4、getBytes()
替代getChars()的一种方法是将字符存储在字节数组中,该方法即getBytes()。

5、toCharArray()
6、equals()和equalsIgnoreCase() 比较两个字符串
7、regionMatches() 用于比较一个字符串中特定区域与另一特定区域,它有一个重载的形式允许在比较中忽略大小写。
boolean regionMatches(int startIndex,String str2,int str2StartIndex,int numChars)
boolean regionMatches(boolean ignoreCase,int startIndex,String str2,int str2StartIndex,int numChars)
8、startsWith()和endsWith()
startsWith()方法决定是否以特定字符串开始,endWith()方法决定是否以特定字符串结束
9、equals()和==
equals()方法比较字符串对象中的字符,==运算符比较两个对象是否引用同一实例。
例:String s1="Hello";
String s2=new String(s1);
s1.eauals(s2); //true
s1==s2;//false
10、compareTo()和compareToIgnoreCase() 比较字符串
11、indexOf()和lastIndexOf()
indexOf() 查找字符或者子串第一次出现的地方。
lastIndexOf() 查找字符或者子串是后一次出现的地方。
12、substring()
它有两种形式,第一种是:String substring(int startIndex)
第二种是:String substring(int startIndex,int endIndex)
13、concat() 连接两个字符串
14 、replace() 替换
它有两种形式,第一种形式用一个字符在调用字符串中所有出现某个字符的地方进行替换,形式如下:
String replace(char original,char replacement)
例如:String s="Hello".replace('l','w');
第二种形式是用一个字符序列替换另一个字符序列,形式如下:
String replace(CharSequence original,CharSequence replacement)
15、trim() 去掉起始和结尾的空格
16、valueOf() 转换为字符串
17、toLowerCase() 转换为小写
18、toUpperCase() 转换为大写
19、StringBuffer构造函数
StringBuffer定义了三个构造函数:
StringBuffer()
StringBuffer(int size)
StringBuffer(String str)
StringBuffer(CharSequence chars)
(1)、length()和capacity()
一个StringBuffer当前长度可通过length()方法得到,而整个可分配空间通过capacity()方法得到。
(2)、ensureCapacity() 设置缓冲区的大小
void ensureCapacity(int capacity)
(3)、setLength() 设置缓冲区的长度
void setLength(int len)
(4)、charAt()和setCharAt()
char charAt(int where)
void setCharAt(int where,char ch)
(5)、getChars()
void getChars(int sourceStart,int sourceEnd,char target[],int targetStart)
(6)、append() 可把任何类型数据的字符串表示连接到调用的StringBuffer对象的末尾。
例:int a=42;
StringBuffer sb=new StringBuffer(40);
String s=sb.append("a=").append(a).append("!").toString();
(7)、insert() 插入字符串
StringBuffer insert(int index,String str)
StringBuffer insert(int index,char ch)
StringBuffer insert(int index,Object obj)
index指定将字符串插入到StringBuffer对象中的位置的下标。
(8)、reverse() 颠倒StringBuffer对象中的字符
StringBuffer reverse()
(9)、delete()和deleteCharAt() 删除字符
StringBuffer delete(int startIndex,int endIndex)
StringBuffer deleteCharAt(int loc)
(10)、replace() 替换
StringBuffer replace(int startIndex,int endIndex,String str)
(11)、substring() 截取子串
String substring(int startIndex)

String substring(int startIndex,int endIndex)



**********************************************************************


Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,如果没有内容进来,read()也是傻傻的等,这会影响我们程序继续做其他事情,那么改进做法就是开设线程,让线程去等待,但是这样做也是相当耗费资源的。

Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/O读写,不堵塞了。

Java NIO出现不只是一个技术性能的提高,你会发现网络上到处在介绍它,因为它具有里程碑意义,从JDK1.4开始,Java开始提高性能相关的功能,从而使得Java在底层或者并行分布式计算等操作上已经可以和C或Perl等语言并驾齐驱。

如果你至今还是在怀疑Java的性能,说明你的思想和观念已经完全落伍了,Java一两年就应该用新的名词来定义。从JDK1.5开始又要提供关于线程、并发等新性能的支持,Java应用在游戏等适时领域方面的机会已经成熟,Java在稳定自己中间件地位后,开始蚕食传统C的领域。

本文主要简单介绍NIO的基本原理,在下一篇文章中,将结合Reactor模式和著名线程大师Doug Lea的一篇文章深入讨论。

NIO主要原理和适用。

NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有事件发生时,他会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后,我们从这个Channel中读取数据,放心,包准能够读到,接着我们可以处理这些数据。

Selector内部原理实际是在做一个对所注册的channel的轮询访问,不断的轮询(目前就这一个算法),一旦轮询到一个channel有所注册的事情发生,比如数据来了,他就会站起来报告,交出一把钥匙,让我们通过这把钥匙来读取这个channel的内容。

了解了这个基本原理,我们结合代码看看使用,在使用上,也在分两个方向,一个是线程处理,一个是用非线程,后者比较简单,看下面代码:

[java] view plaincopy
  1. package test.java.nio;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.InetAddress;  
  5. import java.net.InetSocketAddress;  
  6. import java.net.ServerSocket;  
  7. import java.nio.ByteBuffer;  
  8. import java.nio.channels.SelectionKey;  
  9. import java.nio.channels.Selector;  
  10. import java.nio.channels.ServerSocketChannel;  
  11. import java.nio.channels.SocketChannel;  
  12. import java.util.Iterator;  
  13. import java.util.Set;  
  14.   
  15. public class MultiPortEcho {  
  16.   
  17.     private int ports[];  
  18.     private ByteBuffer echoBuffer = ByteBuffer.allocate(1024);  
  19.   
  20.     public MultiPortEcho(int ports[]) throws IOException {  
  21.         this.ports = ports;  
  22.   
  23.         go();  
  24.     }  
  25.   
  26.     private void go() throws IOException {  
  27.         // 创建一个选择器,需要探知的socketchannel都注册给它  
  28.         Selector selector = Selector.open();  
  29.   
  30.         // Open a listener on each port, and register each one  
  31.         // with the selector  
  32.         ////建立Channel 并绑定到9000端口  
  33.         for (int i = 0; i < ports.length; ++i) {  
  34.             ServerSocketChannel ssc = ServerSocketChannel.open();  
  35.             //使设定non-blocking的方式。  
  36.             ssc.configureBlocking(false);  
  37.             ServerSocket ss = ssc.socket();  
  38.             //InetSocketAddress address = new InetSocketAddress(ports[i]);  
  39.             InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(),9000);  
  40.             ss.bind(address);  
  41.   
  42.             //向Selector注册Channel及我们有兴趣的事件  
  43.             SelectionKey key = ssc.register(selector, SelectionKey.OP_ACCEPT);  
  44.   
  45.             System.out.println("Going to listen on " + ports[i]);  
  46.         }  
  47.   
  48.         while (true) {//不断的轮询  
  49.             //Selector通过select方法通知我们我们感兴趣的事件发生了  
  50.             int num = selector.select();  
  51.   
  52.             Set selectedKeys = selector.selectedKeys();  
  53.             Iterator it = selectedKeys.iterator();  
  54.   
  55.             while (it.hasNext()) {//如果有我们注册的事情发生了,它的传回值就会大于0  
  56.                 SelectionKey key = (SelectionKey) it.next();  
  57.                 //对 SelectionKey 调用 readyOps() 方法,并检查发生了什么类型的事件  
  58.                 if ((key.readyOps() & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) {  
  59.                     // Accept the new connection  
  60.                     //我们从这些key中的channel()方法中取得我们刚刚注册的channel  
  61.                     ServerSocketChannel ssc = (ServerSocketChannel) key.channel();  
  62.                     SocketChannel sc = ssc.accept();  
  63.                       
  64.   
  65.                     // Add the new connection to the selector  
  66.                     //将获得新连接的 SocketChannel 配置为非阻塞的。而且由于接受这个连接的目的是为了读取来自套接字的数据,所以我们还必须将 SocketChannel 注册到 Selector  
  67.                     sc.configureBlocking(false);  
  68.                     SelectionKey newKey = sc.register(selector,SelectionKey.OP_READ);//注意我们使用 register() 的 OP_READ 参数,将 SocketChannel 注册用于 读取 而不是 接受 新连接  
  69.                     //在处理 SelectionKey 之后,我们几乎可以返回主循环了。但是我们必须首先将处理过的 SelectionKey 从选定的键集合中删除。  
  70.                     //如果我们没有删除处理过的键,那么它仍然会在主集合中以一个激活的键出现,这会导致我们尝试再次处理它。  
  71.                     //我们调用迭代器的 remove() 方法来删除处理过的 SelectionKey  
  72.                     it.remove();  
  73.   
  74.                     System.out.println("Got connection from " + sc);  
  75.                 } else if ((key.readyOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) {  
  76.                     // Read the data  
  77.                     SocketChannel sc = (SocketChannel) key.channel();  
  78.   
  79.                     // Echo data  
  80.                     int bytesEchoed = 0;  
  81.                     while (true) {  
  82.                         echoBuffer.clear();  
  83.   
  84.                         int r = sc.read(echoBuffer);  
  85.   
  86.                         if (r <= 0) {  
  87.                             break;  
  88.                         }  
  89.   
  90.                         echoBuffer.flip();  
  91.   
  92.                         sc.write(echoBuffer);  
  93.                         bytesEchoed += r;  
  94.                     }  
  95.   
  96.                     System.out.println("Echoed " + bytesEchoed + " from " + sc);  
  97.   
  98.                     it.remove();  
  99.                 }  
  100.   
  101.             }  
  102.   
  103.             // System.out.println( "going to clear" );  
  104.             // selectedKeys.clear();  
  105.             // System.out.println( "cleared" );  
  106.         }  
  107.     }  
  108.   
  109.     static public void main(String args[]) throws Exception {  
  110.         if (args.length <= 0) {  
  111.             System.err  
  112.                     .println("Usage: java MultiPortEcho port [port port ...]");  
  113.             System.exit(1);  
  114.         }  
  115.   
  116.         int ports[] = new int[args.length];  
  117.   
  118.         for (int i = 0; i < args.length; ++i) {  
  119.             ports[i] = Integer.parseInt(args[i]);  
  120.         }  
  121.   
  122.         new MultiPortEcho(ports);  
  123.     }  
  124. }  

这是一个守候在端口9000的noblock server例子,如果我们编制一个客户端程序,就可以对它进行互动操作,或者使用telnet 主机名 90000 可以链接上。

通过仔细阅读这个例程,相信你已经大致了解NIO的原理和使用方法,下一篇,我们将使用多线程来处理这些数据,再搭建一个自己的Reactor模式。


0 0
原创粉丝点击