Java控制台的输入输出
如%8.4d, %8#d, %.d, %.4d. %8.d 等都是错误的,报非法格式转换。
x 及 o 格式: x 以无符号十六进制形式输出整数,o 以无符号八进制形式输出整数,先略举几种用法:
例子
printf(Integer.toBinaryString(-1)+" %#o %#x",-1,-1)//分别输出二进制、八进制、十六进制:
2.0 printf 输出格式化 [目录] Java 在控制台上打印输出一般不会有格式化的要求。例如我们可以使用 System.out.print(x) 将数值 x 输出到控制台上。这条命令将
以 x 对应的数据类型所允许的最大非 0 数字位数打印输出 x。
double x = 10000.0/3.0;
格式转换符将指示被格式化的数值类型。将这句"文言文"换成"白话文"的意思就是:格式转换符所起的作用就是为了说明数值格式化后的输 出类型是什么类型的。
表 3-5 列出了所有转换符:
转换符 d
类型 十进制整数
举例(输出) 159
转换符 s
类型 字符串
举例(输出) Hello
x
十六进制整数
9f 或 0x9f
}catch(FileNotFoundException e){ System.out.println(e);
} } private static void parseline(String line){
Scanner lineScanner = new Scanner(line);
eDelimiter(","); String name = lineScanner.next(); int age = lineScanner.nextInt(); String idate = lineScanner.next(); boolean iscertified = lineScanner.nextBoolean(); System.out.println("姓名:"+name+",年龄:"+age+",入司时间:"+idate+",验证标记:"+iscertified); } } 输出: 姓名:老赵,年龄:28,入司时间:feb-01,验证标记:true 姓名:小竹,年龄:22,入司时间:dec-03,验证标记:false 姓名:阿波,年龄:21,入司时间:dec-03,验证标记:false 姓名:凯子,年龄:25,入司时间:dec-03,验证标记:true
Scanner useDelimiter(Pattern pattern); //将扫描器的分隔模式设置为指定模式 Scanner useDelimiter(String pattern); //将此扫描器的分隔模式设置为从指定 String 构造的模式。 注意:其中 useDelimiter(String pattern)中的参数 pattern 是一个正规表达式。 下面看实例: Scanner in = new Scanner(System.in,"UTF-8"); eDelimiter("\""); System.out.println("what is your name?"); String firstname = in.next();//读取输入的下一个单词(以空格作为分隔符) System.out.println("Your firstName is "+ firstname); 输出: what is your name? Jan mi ba"can ken; Your firstName is Jan mi ba 上例以双引号作为单词分隔符修改默认以空格为分隔符的做法在现实中非常实用。 最后一个例子,读取并分析文本文件:D:\test.txt,文本文件的内容如下: 老赵,28,feb-01,true 小竹,22,dec-03,false 阿波,21,dec-03,false 凯子,25,dec-03,true 程序: import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.Scanner; public class ReadFile {
c
o
八进制整数
0237 或 237
b
f
定点浮点数
19.5
h
字符 布尔 散列码
H true 42628b2
e
指数浮点数
1.59e+01
tx
日期时间
(x 为表 3-7 的字符)
g
通用浮点数
--
%
百分号
%
a
十六进制浮点数
0x1.fccdp3
n
与平台有关的行分隔符
--
注:1.0 在 window 下行分隔符为"\r\n",在 linux 下行分隔符为"\n"。
输出及说明 11111111111111111111111111111111 037777777777 0xffffffff
例子
printf(Integer.toBinaryString(8<<2+1)+" %#o %#x",8<<2+1,8<<2+1)//分别输出:
宽度 m: m 指域宽,即对应的输出项在输出设备上所占的字符数。 精度 n: n 用于说明输出的实型数的小数位数。未指定精度 n 时,隐含的精度为 n=6 位。
d 格式: 用来输出十进制整数。d
按整型数据的实际长度输出
%md
m 为指定的输出字段的宽度。如果数据的位数小于 m,则左端补以空格,若大于 m,则按实际位数输出
public static void main(String[] args) { if(args.length != 1){ System.err.println("Usage:java readFile file location"); System.exit(0); } readFile(args[0]);
0
转换符为数值时,(不包括符号位)前面补 0(我称呼为 0 补位符)
-
左对齐(不能与 0 同时出现)
(
如数值为负数,则将负数取绝对值用括号括起来;正数不变
,
添加分组分隔符(千分位符)
#(f 格式)
包含小数点
#(x 或 o 格式)
添加前缀 0x 或 0
$
指定将被格式化的参数索引,例如%1$d,%1$x 将以十进制和十六进制格式打印第一个参数
<
格式化前面替换的数值,例如%d%<x 将以十进制和十六进制格式打印同一个参数
图 3-6 给出了格式说明符的语法图。
提示:参数索引值从 1 开始,而不是从 0 开始,%1$...对第 1 个参数格式化。这就避免了与 0 标志混淆。标志是闭回笼所以可以有多个标
志。参数索引和符号$在同一个回笼中所以两者必须同时出现或不出现,符号.和精度也是。 现在大致的对上面的语法图及各种转换符、标志做一个解析:
Java 控制台的输入输出
文档编辑:古寒笑 日期:2010-11-18
1.0 Scanner 对象操作 2.0 printf 输出格式化
目录
1.0 Scanner 对象操作 [目录] 在 JDK5.0 以后, 通过控制台进行输入有了更简单的方法。 首先我们需要构造一个 Scanner 对象,它附属于"标准输入流"System.in。 Scanner in = new Scanner(System.in); 常用构造方法: Scanner(File source): 构造一个新的 Scanner,它生成的值是从指定文件扫描的。 Scanner(InputStream source): 构造一个新的 Scanner,它生成的值是从指定的输入流扫描的。 Scanner(String source): 构造一个新的 Scanner,它生成的值是从指定字符串扫描的。 现在,就可以使用 Scanner 类的各种方法实现输入操作了。例如,nextLine 方法将输入一行: Scanner in = new Scanner(System.in,"UTF-8"); System.out.println("what is your name?"); String name = in.nextLine();//读取输入的下一行内容 System.out.println("Your name is "+name); 输出: what is your name? Jan mi Your name is Jan mi 在这里,使用 nextLine 方法是因为在输入行中有可能包含空格。要想读取一个单词(默认是以空白符作为分隔符),就调用 Scanner in = new Scanner(System.in,"UTF-8"); System.out.println("what is your name?"); String firstname = in.next();//读取输入的下一个单词(以空格作为分隔符) System.out.println("Your firstName is "+ firstname); 输出: what is your name? Jan mi Your firstName is Jan 要想读取并转换下一个表示整数或浮点数的字符序列,就调用 int nextInt( ) double nextDouble( ) 注意:上述方法执行时都会造成堵塞,等待用户在命令行输入数据回车确认。 要想检测输入中是否还有其他单词,就调用 boolean hasNext( ) 要想检测是否还有表示整数或浮点数的下一个字符序列,就调用 boolean hasNextInt( ) boolean hasNextDouble( ) 要想修改默认以空格作为分割符来区分不同的单词,就可以使用