(一)字符串类(String类、StringBuffer类和StringBuilder类)
一、String类
1、String类构造方法
String(byte[ ] bytes, String charsetName):使用指定编码集解码一个字节数组,构造一个新的字符串。
String(String original):初始化一个新创建的String对象。
String(char[ ] value):构造一个新的String对象,使其表示字符串数组所包含的字符序列。
2、常用方法
getBytes()
使用平台的默认字符集将此 String
编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
getBytes(Charset
使用给定的 charset 将此 String
编码到 byte 序列,并将结果存储到新的 byte 数组。
indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引。
lastIndexOf(String
返回指定子字符串在此字符串中最右边出现处的索引。
split(String regex):指定正则表达式来拆分字符串,返回一个字符串数组。
substring(int beginIndex):从指定位置开始,截取一个新的字符串。
toLowerCase()
使用默认语言环境的规则将此 String
中的所有字符都转换为小写。
toUpperCase():
使用默认语言环境的规则将此 String
中的所有字符都转换为大写。
matches(String字符串是否匹配给定的正则表达式。
String对象是不可变的。相当于字符串常量,定义分配空间赋值之后无法改变。
String s1 = "hello"; s1= "world";
注意:s1是String对象的引用,不是对象本身。这里的变量是String对象的引用。
char data[] = {'a', 'b', 'c'};
String str = new String(data); //这里str才是对象本身,不是引用。注意String的构造方法,参数是一个字符数组。
注意:String类重写了equals()方法,比较的是内容不是引用的地址。与Object类区分开
1、对于String类的方法
可以思考对数组的操作,可以进行哪些操作,需要哪些方法。最基本的四个方法:增删改查,分解split(String s),连接concat(String s)
getBytes()方法:使用平台的默认字符集将此 String
编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
subString(int begin,int end)方法:返回一个新的字符串
静态方法:valueOf(int i)返回i的字符串形式,其他数据类型与之类似
二、StringBuffer类
StringBuffer是线程安全的可变字符序列。因此,对字符串进行修改时,需要使用StringBuffer类和StringBuilder类。
注意:与String不同,StringBuffer和StringBuilder对象能够被多次修改,并且不产生新的对象。
1、StringBuffer类的方法(其他方法与String类似)
序号 | 方法描述 |
1 | public StringBuffer append(StringBuffer s) 将指定的字符串追加到此字符序列。 注意返回的也是StringBuffer类型,添加其他类型数据,系统会隐式调用String.valueOf(char[])方法或者引用类型的toString()方法转化为字符串,在添加。 |
2 | public StringBuffer reverse() 将此字符序列用其反转形式取代。 |
3 | public delete(int start, int end) 移除此序列的指定的子字符串中的字符。 |
4 | public insert(int offset, String s ) 将 字符串s插入此序列的指定位置。 |
5 | replace(int start, int end, String str) 使用给定 |
(三)StringBuilder类
StringBuilder 类在 Java 5 中被提出,同时,StringBuilder类不是线程安全的。StringBuilder类比StringBuffer类速度快,在单线程下,建议使用StringBuilder类。
(四)基本数据包装类
所有的包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类 Number 的子类。
Character 类在对象中包装一个基本类型 char 的值
在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型的情形。为了解决这个问题,Java 语言为每一个内置数据类型提供了对应的包装类。
编译器特别支持的包装称为装箱,所以当内置数据类型被当作对象使用的时候,编译器会把内置类型装箱为包装类。相似的,编译器也可以把一个对象拆箱为内置类型。
例如:Integer x = 5;当 x 被赋为整型值时,由于x是一个对象,所以编译器要对x进行装箱。(内部编译器调用的是Integer类的Integer.valueOf(5)方法,完成装箱,拆箱调用的是Integer.intValue()方法)
(五)Math类(在图形和游戏中会常用到Math类的方法)
Math
类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
注意:方法的参数和返回值类型一般是double类型。
其中一个方法要注意:可以用来产生随机数
public static double random()
返回带正号的 double
值,该值大于等于 0.0
且小于 1.0
。
(六)File类(重点)
读写一个文件:
1、首先获取这个文件,获取该文件的路径加文件名:String path = getPath()+File.separator+getName()
2、利用File类,通过File类的构造方法获得文件对象,构造方法:File(String directoryPath, String filename)或者File(File dirObj, String filename)
3、利用节点流来读写文件的内容,FileInputStream(File file)或者FileInputStream(String filename)
1. new File ("hello.txt");
2.
3. new FileInputStream(file);
4.
5. new InputStreamReader(in,"utf-8");
6.
7. new BufferedReader(inReader);
8.
1. InputStreamReader isr = new InputStreamReader(new FileInputStream("ming.txt"));
2.
3. while((ch = isr.read())!=-1)
4. {
5.
6. char)ch);
7.
8. }
File类直接处理文件和文件系统,File对象用来处理或获取与磁盘文件相关的信息。
1、区分开File类和FileInputStream类
FileInputStream类关注的是文件内容,而File类关注的是文件在磁盘上的存储。
File不属于文件流,只能代表一个文件或是目录的路径名而已。
注意:如果处理文件或者目录名,就应该使用File对象,而不是字符串。例如,File类的equals方法知道一些文件系统对大小写是敏感的,目录尾的“/”字符无关紧要。
File类是文件和路径的抽象表示形式。这里可以表示一个目录路径名(文件夹的名字),也可以表示一个文件对象。
其中文件夹就是一个目录名称。
isFile()方法:测试此抽象路径名表示的文件是否是一个标准文件。
isDirectory()方法:测试此抽象路径名表示的文件是否是一个目录。
通过调用该对象上的 list() 方法,来提取它包含的文件和文件夹的列表,这里返回的是字符串
listFiles():返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。返回的是File[]数组
1、File类的构造方法
下面的构造函数可以用来生成File 对象:
File(String directoryPath)
File(String directoryPath, String filename)
File(File dirObj, String filename)
这里,directoryPath是文件的路径名,filename 是文件名,dirObj 一个指定目录的File 对象。下面的例子创建了三个文件:f1,f2,和f3。第一个File对象是由仅有一个目录路径参数的构造函数生成的。第二个对象有两个参数——路径和文件名。第三个File对象的参数包括指向f1文件的路径及文件名。f3和f2指向相同的文件。
File f1 = new File("/");
File f2 = new File("/","autoexec.bat");
File f3 = new File(f1,"autoexec.bat");
public File(String pathname):pathname为路径创建File对象。
注意:这里的构造方法是在内存中构造一个File对象,而不是在硬盘上创建一个指定路径的文件。
public File(String parent ,String child): 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File
实例。
2、File类有一个静态属性:static String separator 存储了当前系统的路径分隔符。就是正斜杠( / ),为了跨平台使用。
注意:windows下是反斜杠 linux下是正斜杠,但是在java编程中,反斜杠表示转义字符。在编程时,windows和linux都使用正斜杠即可。若使用反斜杠,则需转义即:\\
3、时间返回类型是long类型,存储的是从1970 年 1 月 1 日 00:00:00 GMT 到现在的毫秒数,这样是为了提高存储效率。long类型占8字节,一个字节8位。
4、exists()方法:测试此抽象路径名表示的文件或目录是否存在。
getParentFile()方法:此抽象路径名指定父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null
mkdirs()方法:创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
mkdir()方法:创建此抽象路径名指定的目录。
createNewFile()方法:当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
注意:文件的创建过程:首先创建文件所在的目录:利用mkdirs()方法创建目录,然后再创建该文件:利用createNewFile()方法。其中File的构造方法:只是在内存中创建一个File对象,不是在硬盘上创建。
5、对于FileReader类和FileInputStream类区别
两个类的构造函数的形式和参数都是相同的,参数为File对象或者表示路径的String。
如果处理纯文本文件,建议使用FileReader,因为更方便,也更适合阅读;但是要注意编码问题!
其他情况(处理非纯文本文件),FileInputStream是唯一的选择;FileInputStream是在Socket通讯时会用到很多,如将文件流以Stream的方式传向服务器!
6、IO的规范用法
①
File file = new File ("hello.txt");
FileInputStream in=new FileInputStream(file);
②
File file = new File ("hello.txt");
FileInputStream in=new FileInputStream(file);
InputStreamReader inReader=new InputStreamReader(in,"utf-8");
BufferedReader bufReader=new BufferedReader(inReader);
③
File file = new File ("hello.txt");
FileReader fileReader=new FileReader(file);
BufferedReader bufReader=new BufferedReader(fileReader);
7、FileReader类
FileReader fr = new FileReader("ming.txt");
char[] buffer = new char[1024];
int ch = 0;
while((ch = fr.read())!=-1 )
{
System.out.print((char)ch);
}
8、InputStreamReader类
InputStreamReader isr = new InputStreamReader(new FileInputStream("ming.txt"));
while((ch = isr.read())!=-1)
{
System.out.print((char)ch);
}
9、BufferedReader类
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("ming.txt")));
String data = null;
while((data = br.readLine())!=null)
{
System.out.println(data);
}
实例:
public static void main(String[] args) {
// TODO Auto-generated method stub
String separator = File.separator;
String filename = "myfile.txt";
//String directory = "dir1/dir2"; //采用这两者目录写法都可以
String directory = "dir1"+File.separator+"dir2";
File f = new File(directory,filename);
if(f.exists()){ //判断硬盘上该目录下是否存在该文件
System.out.println("文件名:"+f.getAbsolutePath());
System.out.println("文件大小:"+f.length());
}else{
f.getParentFile().mkdirs(); //创建指定目录,注意:项目加上包名,则是目录是最上层包名的父目录
try {
f.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
5、递归列出文件目录结构
public static void tree(File f,int level){
String preStr = "";
for(int i=0; i<level; i++){
preStr +=" ";
}
File[] childs = f.listFiles(); //注意:这里的listFiles()方法表示的是当前目录中包含的文件名和目录名,不包含子目录。
for(int i=0; i<childs.length; i++){
System.out.println(preStr+childs[i].getName());
if(childs[i].isDirectory()){
tree(childs[i] , level + 1);
}
}
}
(七)java.lang.Enum枚举类型(1.5之后才有)
1、只能够取特定值中的一个
2、使用enum关键字,定义一个枚举类型(java.lang.Enum)。这是定义的一种类型。
实例:
public class TestEnum {
public static void main(String[] args) {
// TODO Auto-generated method stub
Mycolor m = Mycolor.red;
switch(m) {
case red:
System.out.println("red");
break;
case yellow:
System.out.println("yellow");
break;
default:
System.out.println("blue");
}
}
public enum Mycolor { red, yellow, blue} //定义枚举类型
}