构建字符串(StringBuilder的应用)

  • 有些时候,需要由较短的字符串构建字符串,例如:按键或来自文件的单词,采用字符串连接的方式达到此目的效率比较低.每次连接字符串,都会构建一个新的String对象,既耗时,又浪费空间.使用StringBuilder类就可以避免这个问题的发生.
  • 如果需要用许多小段的字符串构建一个字符串,那么应该按照下列步骤进行.首先,构建一个空的字符串构建器:StringBuilder builder = new StringBuilder();,当每次需要添加一部分内容时,就调用append方法
  1. builder.append(ch); //append a single character
  2. builder.append(str); //append a string
  • 在需要构建字符串时就调用toString方法,将可以得到一个String对象,其中包含了构建器中的字符序列.String completeString = builder.toString();.
  • 下面的API包含了StringBuilder类的重要方法
    1. StringBuilder():构建一个空的字符串构造器.
    2. int length():返回构建器或缓冲器中的字符串个数.
    3. StringBuilder append(String str):追加一个字符串并返回this.
    4. StringBuilder append(char c):追加一个字符并返回this.
    5. StringBuilder appendCodePoint(int cp):追加一个代码点,并将其转换一个或两个代码单元并返回this.
    6. void setCharAt(int i,char c):将第i个字符设置为c.
    7. StringBuilder insert(int offset,String str):将字符串插入到此字符序列中.
    8. StringBuilder delete(int startIndex,int endIndex):删除此序列的子字符串中的字符.
    9. String toString():返回一个构建器或缓冲器内容相同的字符串.

输入输出

读取输入

  • 打印输出到"标准输出流"(即控制窗口),使用System.out.println即可,那么要想通过控制台输入,首先需要构造一个Scanner对象,并与"标准输入流"System.in关联.
  1. Scanner in = new Scanner(System.in);
  • 使用Scanner类的各种方法实现输入操作,例如:nextLine方法将输入一行.
  1. System.out.print("What is your name?");
  2. String name = in.nextLine();
  • 在这里,使用nextLine方法是因为在输入行中有可能包含空格,要想读取一个单词,以空格作为分隔符,就调用:String firstname = in.next();
  • 要想读取一个整数,调用nextInt方法
  1. System.out.print("How old are you?");
  2. int age = in.nextInt();
  • 与此类似,要想读取一个浮点数,就调用nextDouble方法.
  • 案例:询问姓名和年龄,然后打印信息
  1. public class scan_demo {
  2. public static void main(String[] args) {
  3. Scanner scanner = new Scanner(System.in);
  4. //get first input
  5. System.out.println("what is your name?");
  6. String name = scanner.nextLine();
  7. //get second input
  8. System.out.println("How old are you?");
  9. int age = scanner.nextInt();
  10. //display ouput on console
  11. System.out.println("Hello,"+name+",Next year,you'll be "+(age+1));
  12. }
  13. }
  • 因为输入是可见的,所以Scanner类不适用于从控制台读取密码,因此使用Console类实现,输入的不可见性.
  1. public class console_demo {
  2. public static void main(String[] args){
  3. Console cnsl = System.console();
  4. if (cnsl != null) {
  5. String alpha = cnsl.readLine("Name: ");
  6. System.out.println("Name is: " + alpha);
  7. char[] pwd = cnsl.readPassword("Password: ");
  8. System.out.println("Password is: " + pwd);
  9. }
  10. }
  11. }

使用cmd命令行运行,因为高级IDE无法调用系统控制台窗口.

采用Console对象处理输入不如采用Scanner方便,每次只能读取一行输入,而没有能够读取一个单词或一个数值的方法.

  • Scanner类常见的方法总结

    1. Scanner(InputStream in):用给定的输入流创建一个Scanner对象.
    2. String nextLine():读取输入的下一行内容.
    3. int nextInt():读取一个数字.
    4. String next():读取输入的下一个单词(以空格为分隔符).
    5. double nextDouble():读取并转换下一个表示整数或浮点数的字符序列.
    6. boolean hashNext():检测输入中是否还有其他的单词.
    7. boolean hashNextDouble():检测是否还有表示整数或浮点数的下一个字符序列.

格式化输出

  • 可以使用System.out.print(x)将数值x输出到控制台.这条命令将以x对应的数据类型所允许的最大非0数字将x输出.例如
  1. double x = 10000.0/3.0;
  2. 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标记

  1. public static void main(String[] args) throw IOException
  2. {
  3. Scanner in = new Scanner(Path.get("myfile.txt"),"UTF-8");
  4. }
  • 常用方法

    • Scanner(File f):构造一个给定文件读取数据的Scanner
    • Scanner(String data):构造一个从给定字符串中读取的Scanner
    • PrintWriter(String fileName):构造一个将数据写入文件的PrintWriter.
    • static Path get(String.pathname):根据给定路径创建一个Path.(Paths类中的方法)

StringBuilder和输入输出的更多相关文章

  1. java中的数据类型,运算符,字符串,输入输出,控制流,大数值,数组; 《java核心技术卷i》 第三章:java基本程序结构;

    <java核心技术卷i> 第三章:java基本程序结构: 每次看书,去总结的时候,总会发现一些新的东西,这次对于java的数组有了更深的了解: java中的数据类型,运算符,字符串,输入输 ...

  2. JavaIO流(输入输出操作)

    Java中执行输出和输入操作,需要通过IO流.例如最常见的System.out.println()就是一个输出流.IO流的类比较多,但核心体系就是由File. InputStream .OutputS ...

  3. Day 16:输入输出字符流、缓冲输入字符流

    输入输出字节流输出字符时的常见问题 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStre ...

  4. 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率

    之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...

  5. [译]DbContext API中使用SqlQuery和ExecuteSqlCommand获取存储过程的输入输出参数

    水平有限,欢迎指正.原文:http://blogs.msdn.com/b/diego/archive/2012/01/10/how-to-execute-stored-procedures-sqlqu ...

  6. ECS Linux 服务器解除ssh登陆后被锁定或暂停输入输出的终端

    在使用SSH终端(如Xshell)登陆时,若不慎点击 Ctrl + S  按键,会导致终端很像被锁定,输入和输出都无响应. 这是由于操作系统的终端收到指令 Ctrl + S 后,会暂停终端输入输出的刷 ...

  7. 计算机程序的思维逻辑 (30) - 剖析StringBuilder

    上节介绍了String,提到如果字符串修改操作比较频繁,应该采用StringBuilder和StringBuffer类,这两个类的方法基本是完全一样的,它们的实现代码也几乎一样,唯一的不同就在于,St ...

  8. StringBuilder的使用

    今天用到了StringBuilder来拼接查询语句,发现这个真好用,决定做个小结. 百度一个StringBuilder的定义:String 对象是不可改变的.每次使用 System.String 类中 ...

  9. linux中输入输出和重定向问题

    输入输出解释 当我们执行shell的时候,每个进程都和三个打开的文件有关系,并使用文件描述符来引用这些文件.但这些文件不容易记忆,所以shell给了相应的文件名: 0:输入文件-标准输入(它的命令是输 ...

随机推荐

  1. Thymeleaf的th

    th:action 定义后台控制器路径,类似<form>标签的action属性. <form id="login-form" th:action="@{ ...

  2. 如何从零开发一个NuGet软件包?

    作者:依乐祝 首发地址:https://www.cnblogs.com/yilezhu/p/14175019.html 我想目前每个.net开发人员都应该知道nuget.org和NuGet软件包吧.但 ...

  3. 微博爬虫,python微博用户主页小姐姐图片内容采集爬虫

    python爬虫,微博爬虫,需要知晓微博用户id号,能够通过抓取微博用户主页内容来获取用户发表的内容,时间,点赞数,转发数等数据,当然以上都是本渣渣结合网上代码抄抄改改获取的! 要抓取的微博地址:ht ...

  4. C#中未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序

    解决方法 方法一 "设置应用程序池默认属性"/"常规"/"启用32位应用程序",设置为 true. 方法二 生成->配置管理器-> ...

  5. [.NET] WCFDataService项目host到IIS上碰到的一个问题:数据库未能打开

    今天在尝试重现OP一个问题的,遇到了一个新的问题. 项目坏境: WCF Data Service 5.6 Entity Framewrok 5(不用6的原因时要重新配置WCF项目) SQL Serve ...

  6. 1.自定义view入门

    1.继承自view 系统提供的view 如 TextView .ImageView 都是继承自view的: 2.自定义一个TextView 通过自定义一个TextView 来熟悉继承自view 的自定 ...

  7. SQLServer多事务——事务嵌套

    在ERP中,偶尔会有存储过程里面继续调用存储过程的情况 其中更有一些特殊的存储过程分别都使用了存储过程,大致可以分为下面几种情况: 1.平行事务,在多个事务中,任意一个成功则提交数据库,失败则各自RO ...

  8. [LeetCode]60. Permutation Sequence求全排列第k个

    /* n个数有n!个排列,第k个排列,是以第(k-1)/(n-1)!个数开头的集合中第(k-1)%(n-1)!个数 */ public String getPermutation(int n, int ...

  9. Java学习日报7.9

    今日内容 阅读了构建之法第一章 工程师的宗旨:我构建,故我在. 哲学家的宗旨:我思,故我在. 科学家的宗旨:我发现故我在. 明天继续研究构建之法这本书!

  10. C语言实现的多线程定时器

    目录 1. 大致功能介绍 2. API库介绍 3. 一个例子 4. 库文件源码 注意事项 1. 大致功能介绍 实现任务列表,定时器会间隔一段时间遍历列表发现要执行的任务 任务列表中的所有任务并行执行 ...