StringBuilder和输入输出
构建字符串(StringBuilder的应用)
- 有些时候,需要由较短的字符串构建字符串,例如:按键或来自文件的单词,采用字符串连接的方式达到此目的效率比较低.每次连接字符串,都会构建一个新的String对象,既耗时,又浪费空间.使用
StringBuilder类就可以避免这个问题的发生. - 如果需要用许多小段的字符串构建一个字符串,那么应该按照下列步骤进行.首先,构建一个空的字符串构建器:
StringBuilder builder = new StringBuilder();,当每次需要添加一部分内容时,就调用append方法 
builder.append(ch); //append a single character
builder.append(str); //append a string
- 在需要构建字符串时就调用
toString方法,将可以得到一个String对象,其中包含了构建器中的字符序列.String completeString = builder.toString();. - 下面的API包含了
StringBuilder类的重要方法StringBuilder():构建一个空的字符串构造器.int length():返回构建器或缓冲器中的字符串个数.StringBuilder append(String str):追加一个字符串并返回this.StringBuilder append(char c):追加一个字符并返回this.StringBuilder appendCodePoint(int cp):追加一个代码点,并将其转换一个或两个代码单元并返回this.void setCharAt(int i,char c):将第i个字符设置为c.StringBuilder insert(int offset,String str):将字符串插入到此字符序列中.StringBuilder delete(int startIndex,int endIndex):删除此序列的子字符串中的字符.String toString():返回一个构建器或缓冲器内容相同的字符串.
 
输入输出
读取输入
- 打印输出到"标准输出流"(即控制窗口),使用
System.out.println即可,那么要想通过控制台输入,首先需要构造一个Scanner对象,并与"标准输入流"System.in关联. 
Scanner in = new Scanner(System.in);
- 使用Scanner类的各种方法实现输入操作,例如:nextLine方法将输入一行.
 
System.out.print("What is your name?");
String name = in.nextLine();
- 在这里,使用nextLine方法是因为在输入行中有可能包含空格,要想读取一个单词,以空格作为分隔符,就调用:
String firstname = in.next(); - 要想读取一个整数,调用nextInt方法
 
System.out.print("How old are you?");
int age = in.nextInt();
- 与此类似,要想读取一个浮点数,就调用nextDouble方法.
 - 案例:询问姓名和年龄,然后打印信息
 
public class scan_demo {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //get first input
        System.out.println("what is your name?");
        String name = scanner.nextLine();
        //get second input
        System.out.println("How old are you?");
        int age = scanner.nextInt();
        //display ouput on console
        System.out.println("Hello,"+name+",Next year,you'll be "+(age+1));
    }
}
- 因为输入是可见的,所以Scanner类不适用于从控制台读取密码,因此使用Console类实现,输入的不可见性.
 
public class console_demo {
    public static void main(String[] args){
        Console cnsl = System.console();
        if (cnsl != null) {
            String alpha = cnsl.readLine("Name: ");
            System.out.println("Name is: " + alpha);
            char[] pwd = cnsl.readPassword("Password: ");
            System.out.println("Password is: " + pwd);
        }
    }
}
使用cmd命令行运行,因为高级IDE无法调用系统控制台窗口.
采用Console对象处理输入不如采用Scanner方便,每次只能读取一行输入,而没有能够读取一个单词或一个数值的方法.
- Scanner类常见的方法总结
Scanner(InputStream in):用给定的输入流创建一个Scanner对象.String nextLine():读取输入的下一行内容.int nextInt():读取一个数字.String next():读取输入的下一个单词(以空格为分隔符).double nextDouble():读取并转换下一个表示整数或浮点数的字符序列.boolean hashNext():检测输入中是否还有其他的单词.boolean hashNextDouble():检测是否还有表示整数或浮点数的下一个字符序列.
 
格式化输出
- 可以使用
System.out.print(x)将数值x输出到控制台.这条命令将以x对应的数据类型所允许的最大非0数字将x输出.例如 
double x = 10000.0/3.0;
System.out.print(x); //3333.333333333333
如果希望显示美元,美分等符号,则有可能出现问题.
- 因此引入了格式化输出,
System.out.printf().例如:调用System.out.printf(%8.2f),使用8个字符的宽度和小数点后的精度打印x. - 在printf中,可以有多个参数,例如:
System.out.printf("Hello %s,Next year,you'll be %d", name , age); - 每一个%字符开始的都是格式说明符,格式说明符尾部的转换符将指示格式化的数据类型.
- d:十进制整数
 - x:十六进制整数
 - o:八进制整数
 - f:定点浮点数
 - e:指数浮点数
 - g:通用浮点数
 - a:十六进制浮点数
 - s:字符串
 - c:字符
 - b:布尔
 - h:散列码
 - tx或Tx:日期时间(已过期)
 - %:百分号
 - n:行分隔符
 
 - 用于printf的标志
- +:打印整数和负数的符号
 - 空格:在数的前面添加空格
 - 0:数字前面补0
 - -:左对齐
 - (:将负数括在括号内.
 - #:包含小数点(对于f格式)
 - #:添加前缀0x或0(对于x或0格式)
 - $:给定被格式化的参数索引.
 
 - 可以使用静态的String.format方法创建一个格式化的字符串,而不打印:
String message = String.format("Hello %s,Next year,you'll be %d",name ,age);. 
文件的输入与输出
- 要想对一个文件进行读取,就需要用File对象构造一个Scanner对象,例如: 
Scanner in = new Scanner(Paths.get("myfile.txt"),"UTF-8");,如果文件名中包含反斜杠符号,就要在每个反斜杠之前额外再加一个反斜杠. 
注意:这里有一个异常需要抛出,这时在main方法中用throw标记
public static void main(String[] args) throw IOException
{
    Scanner in = new Scanner(Path.get("myfile.txt"),"UTF-8");
}
- 常用方法
Scanner(File f):构造一个给定文件读取数据的ScannerScanner(String data):构造一个从给定字符串中读取的ScannerPrintWriter(String fileName):构造一个将数据写入文件的PrintWriter.static Path get(String.pathname):根据给定路径创建一个Path.(Paths类中的方法)
 
    纸上得来终觉浅,绝知此事要躬行.

                
            
        
浙公网安备 33010602011771号