SamZhou-2019.github.io

View on GitHub

八、字符串和文件

字符串

String message = new String("I drink coffee.");//正式初始化方法,注意S大写
String messageNew = "I drink tea";//快速格式化方法
//String(StringA, int1, int2)构造方法:从字符串StringA提取【从int1开始,共int2个字符】的字符串
messageNew = "Coffee对身体不好。";//字符串是一个对象,内容不可改变。尝试重新赋值只会创建一个新的字符串对象,而原有的字符串对象则被垃圾回收机制清理。

System.out.println(messageNew.length());
//在Java中字符串由Unicode储存,中英文字符长度均为1。
//注意⚠这里的length是一个方法,因此结尾有括号。(数组的length是一个变量,因此不需要括号)
System.out.println(messageNew.charAt(8));//提取字符串中的某个元素
//索引为0至长度减1。⚠注意不能用中括号messageNew[8]

字符串的修改

//字符串连接:concat和+加号,可以连用concat和加号
System.out.println(message.concat(messageNew).concat("\nOK, I drink tea."));
System.out.println(messageNew+"\n"+message);

//提取子串
System.out.println(messageNew.substring(6,9));//从a到b不包括b
System.out.println(messageNew.substring(6));//从a到末尾
//.getChars(int1, int2, Char[], int3) 将字符串从int1到【int2-1】的部分
//存放在指定字符数组【Char[]】,从指定位置【int3】开始(无返回值)
//.toCharArray() 将字符串转化为字符数组并返回

//比较字符串内容
System.out.println(message.equals(messageNew));//内容是否相等,返回布尔值
//⚠ message==messageNew比较的是字符串变量存储的地址。
System.out.println(message.compareTo(messageNew));//按照Unicode值比较字符串,返回一个值:=0说明相等,>0说明前者大于后者,<0说明后者大于前者
//.compareToIgnoreCase() 不区分大小写进行比较
//.startsWith(String) 判断是否以特定字符串开始
//.endsWith(String) 判断是否以特定字符串结束
//.contains(String) 判断是否包含特定字符串

//修改字符串
System.out.println(message.toLowerCase());//转换为小写字母
System.out.println(message.toUpperCase());//转换为大写字母
//trim():去掉头尾的空格
System.out.println(message.replace("coffee", "wine"));
//replace(oldChar, newChar):将字符串中的 oldChar 用 newChar 来代替
//oldChar 也可以用正则表达式
//replaceAll 全部替换 replaceFirst 从左到右查找,只替换第一个

//查找字符或子串
//indexOf(char/String,index):从前向后查找
//lastIndexOf(char/String,index):从后向前查找
//这两个方法中index可省略。若指定index,则从index指定的位置开始查找
//如果找不到,则返回 -1
System.out.println(message.indexOf("coffee"));
//String.match(regex) 判断字符串是否与regex正则字符串相符,返回一个布尔值

//将字符和数字转换为字符串
System.out.println("咖啡的价格是¥"+String.valueOf(50));

//根据正则表达式拆分字符串为字符串数组
System.out.println(message.split(" ")[2]+"\n"+message.split(" ")[1]);

字符串缓冲区

StringBuffer buff = new StringBuffer(40);
//构造时默认长度为16(无参构造),可定义长度。此时为空缓冲区
//参数为字符串时,生成字符串+长度16空的缓冲区
buff.append("I love Sundae");//append方法追加内容,可追加基本数据类型,字符串及缓冲区
//可以以基本数据类型作为参数,append方法会自动将参数转化为字符串并追加
buff.append(", a kind of ice cream").append(", very much.");//支持连写
buff.insert(13,"***");//insert方法可以指定字符串追加的位置
buff.reverse();//reverse方法翻转字符串缓冲区的字符串
buff.delete(6,13);//delete方法删除一段字符串,范围是从前一个参数到后一个参数【不包括】
buff.replace(2,6,"!");//replace方法替换一段字符串为指定的另一段字符串,,范围是从前一个参数到后一个参数【不包括】
String str = buff.toString();//转为字符串
System.out.println(str);
System.out.println(buff.charAt(3));//chatAt方法返回字符串缓冲区的【参数指定的位置】的字符

//字符串与数值的转换
Integer.parseInt("123"); //123 String->int
//Double.parseDouble String->Double
String.valueOf(123); //"123" int->String

字符串分析器🎈

StringTokenizer st1 = new StringTokenizer("too simple sometimes naïve");
//第一种构造方法:将字符串按照空白字符进行分割
StringTokenizer st2 = new StringTokenizer("伟大斗争、伟大工程、伟大事业、伟大梦想","、");
//第二种构造方法:将第一个字符串按照【第二个字符串中各符号的任意匹配】进行分割
System.out.println(st1.countTokens());//输出分割后的字符串数量
System.out.println(st1.nextToken());//输出分割后的下一个字符串,同时内置计数器加1,通常用于循环语句
System.out.println(st1.hasMoreTokens());//判断是否还有下一个字符串

正则表达式🎈

表达式 含义
. 任何一个字符
\d 一个数字【相当于[0-9]】
\D 一个非数字字符
\s 一个空格字符【[ \t\n\x0B\f\r]】
\S 一个非空格字符
\w 一个字符【包含数字、大小写字母、下划线,即[a-zA-Z_0-9]】
\W 除\w外的其它字符
[abc] a,b或c
[^abc] 除a,b或c的其它字符
[a-g&&[d-m]] [a-g]和[d-m]的交集[d-g]
[a-z&&[d-m]] [a-z]减去[d-m]的集合
[a-d[g-m]] [a-d]和[g-m]的并集
表达式 含义
\p{Lower} 小写字母:[a-z]
\p{Upper} 大写字母:[A-Z]
\p{ASCII} 所有 ASCII:[\x00-\x7F]
\p{Alpha} 字母
\p{Digit} 数字: [0-9]
\p{Alnum} 字母和数字
\p{Punct} 标点符号:!#$%&”()*+,-./;<=>?@[]\^_~{}|`
\p{Graph} 可见字符:[\p{Alnum}\p{Punct}]
\p{Print} 可打印字符:[\p{Graph}\x20]
\p{Blank} 空格或制表符
\p{Cntrl} 控件字符:[\x00-\x1Fx7F]
\p{XDigit} 十六进制数字: [0-9a-f-F]
\p{Space} 空格字符:[ \t\n\x0B\f\r]
表达式 含义
X 字符x
\\ 反斜杠字符
\0n 八进制值0n的字符 (0 <= n <= 7)
\0nn 八进制值0nn (0 <= n <= 7)
\0mnn 八进制值0mnn(0 <= m <= 3,0 <= n <= 7)
\xhh 十六进制值0xhh的字符
\uhhhh 十六进制值0xhhhh的字符
\xh…h 十六进制值0xh…h 的字符
(Character.MIN_CODE_POINT <= 0xh…h <= Character.MAX_CODE_POINT)
\t 制表符 (\u0009)
\n 换行字符(\u000A)
\r 回车字符 (\u000D)
\f 表单馈送字符 (\u000C)
\a 警铃字符(\u0007)
\e 转义字符 (\u001B)
\cx 对应于 x 的控件字符
表达式 含义
^ 行的开头
$ 行的末尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结束
\Z 最终的终止符(如果有)
\z 输入的末尾
X? X,一次或没有
X* X,多次或没有
X+ X,一次或多次
X{n} X,正好n次
X{n,} X,至少n次
X{n,m} X,至少n次,但不超过m次

文件与输入输出

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;

public class file_test {
    public static void main(String[] avgs) throws IOException {
        File f = new File("test.txt");
        if (!f.exists()) {//判断文件是否存在
            //f.mkdir();//创建文件夹(目录)
            f.createNewFile();//创建文件
            /*File
            exists()    文件或目录是否存在
            canRead()    是否可读
            canWrite()    是否可写
            isDirectory()    是否为目录
            isFile()    是否为文件
            isAbsolute()    本File对象是否采用绝对路径来创建的
            isHidden()    是否为隐藏文件
            getAbsolutePath()    得到绝对路径
            getCanonicalPath()    得到规范的绝对路径
            getName()    得到文件/目录名
            getPath()    得到路径
            getParent()    得到父目录的路径名
            lastModified()    最后修改时间
            delete()    删除
            renameTo(File)    重命名
            deleteOnExit()   JVM关闭时删除文件
            setReadOnly()    设置只读
            setReadable(boolean)    设置是否可读
            setWritable(boolean)    设置是否可写
            setExecutable(boolean)    设置是否可执行
            */
        }
        PrintWriter pw = new PrintWriter("test.txt");
        pw.print("test");//写入数据,可使用print,printf,println
        pw.close();//及时关闭写入对象
        Scanner sn = new Scanner(f);
        String a=sn.nextLine();//读取下一行
        /**Scanner
         * next()    读入字符串
         * hasNext()    boolean,是否有输入
         * nextByte(),nextInt(),nextShort(),
         * nextDouble(),nextFloat(),nextLong()    读入相应类型数据
         * useDelimiter(String)    设置分隔符
         */
        sn.close();//及时关闭读取对象
        System.out.println(a);
    }
}

返回上一页