由System.out.println()和System.out.print("\n")是否相等引发的思考

作者读《Spring实战》时发现Junit测试方法失败,问题出在比较控制台输出与期望内容是否相等。经探究,因不同系统对换行和回车处理不同,Unix系统每行结尾是“\n”,Windows是“\r\n”,Mac是“\r”。书里代码在Linux编辑编译,拿到Windows需修改才能正常测试。

在读spring实战这本书时发现里面有很多Junit测试方法是测试失败的,这些方法都有一个共性就是比较控制台输出内容是否和期望的内容相等,大致代码如下:

//期望内容:"Playing Sgt. Pepper's Lonely Hearts Club Band by The Beatles\n"
//往控制台输出的方法
System.out.println("Playing Sgt. Pepper's Lonely Hearts Club Band by The Beatles");

这里既然是测试失败那肯定就是不相等了,字符串内容是一样的,那问题会出在哪呢?这么经典的书不会有这么明显的错误吧,是最后那个"\n"的问题吗?可是印象中System.out.println()不就是往控制台输出之后换行吗?System.out.println()和System.out.print("\n")效果应该是一样的呀,要是不一样又不一样在哪呢?带着这个疑问百度了一番,终于度娘给出了解答:
众所周知:\r是回车符,\n是换行符
计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。
后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。Unix 系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“<回车><换行>”,即“ \r\n”;Mac系统里,每行结尾是“<回车>”。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。
所以说:
Windows下System.out.println()等于System.out.print("\r\n")
Unix 下System.out.println()等于System.out.print("\n")
Mac下System.out.println()等于System.out.print("\r")
书里代码应该是在Linux系统下编辑编译的,拿到Windows下只需要改成

//期望内容:"Playing Sgt. Pepper's Lonely Hearts Club Band by The Beatles\r\n"
//往控制台输出的方法
System.out.println("Playing Sgt. Pepper's Lonely Hearts Club Band by The Beatles");

就可正常测试成功了。

public class TesttStringMethod { public static void main(String[] args) { System.out.println("将字符串与数值进行连接"); String str = "fifty five is " + 5 + 5; System.out.println(str); System.out.println("连接数值与字符串"); String str1 = 5 + 5 + " is ten"; System.out.println(str1); System.out.println("将数值转换为字符串"); double a = 3.14; String str2 = " "+ a; System.out.println(str2); System.out.println("将数值型字符串转换为数字"); String str3 = "3.14"; double d = 【代码2】; System.out.println(d); System.out.println("求字符串的长度"); String str4 = "hello\nworld"; String str5 = "你好,中国"; System.out.println("字符串str4的长度是:"+【代码3】); System.out.println("字符串str5的长度是:"+【代码4】); System.out.println("截取子串"); String str6 = "I like java programming"; //获取第一个字符‘j’的位置 int position1 = 【代码5】; //从第一个‘j’字符处截取后面所有的子串 String s1 = 【代码6】; //获取第一个"java"字符串的位置 int position2 = 【代码7】; //截取"java"子串 String s2 = 【代码8】 //获取最后一个字符‘p’的位置 int position3 = 【代码9】 //从最后一个‘p’字符处截取后面所有的子串 String s3 = 【代码10】 System.out.println("s1=" + s1); System.out.println("s2=" + s2); System.out.println("s3=" + s3); System.out.println("替换字符串"); String path = "c:\\myfile\\2016\\result.txt"; int index = path.lastIndexOf("\\"); //获得文件名 String fileName = 【代码11】 //将".txt"替换为".java" String newName = 【代码12】 System.out.println(path); System.out.println(fileName); System.out.println(newName); System.out.println("分隔字符串"); String answer = "A;CD;ABC;D;B"; //将字符串以";"进行分隔 String[] s4 = 【代码13】 for(String s:s4) { System.out.print(s+"\t"); } System.out.println("\n字符串包含"); String name = "Tom.Jack.Rose"; System.out.println("name是否以Tom开头:"+【代码14】); System.out.println("name是否以Jack结尾:"+【代码15】); System.out.println("name是包含Rose:"+【代码16】); System.out.println("用户名验证"); String uname = " Tom "; System.out.println(uname); //去掉字符串的收尾空格 String s5 = 【代码17】 System.out.println(s5); //将字符串转化为小写 String s6 = 【代码18】; System.out.println(s6); System.out.println("判断s6字符串与tom是否相等:"+【代码19】); } } 补全代码
06-05
一、实验目的 掌握Java程序中顺序、选择、循环结构的使用方法。 二、实验设备 Eclipse 三、实验内容与步骤 请使用顺序、选择循环语句编写并编译如下程序: 1、package chapter1; import java.io.*; public class ArithmeticOperation { ​ ​public static void main(String args[]){ ​​int x = 1; ​​int y = 2; ​​double d_x = 3.1415926; ​​double d_y = 2.41; ​​System.out.println(x + "+" + y +"=" + (x+y)); ​​System.out.println(x + "-" + y +"=" + (x-y)); ​​System.out.println(x + "*" + y +"=" + (x*y)); ​​System.out.println(x + "/" + y +"=" + (x/y)); ​​System.out.println(x + "%" + y +"=" + (x%y)); ​​System.out.println(d_x + "+" + d_y +"=" + (d_x+d_y)); ​​System.out.println(d_x + "-" + d_y +"=" + (d_x-d_y)); ​​System.out.println(d_x + "*" + d_y +"=" + (d_x*d_y)); ​​System.out.println(d_x + "/" + d_y +"=" + (d_x/d_y)); ​​System.out.println(d_x + "%" + d_y +"=" + (d_x%d_y)); ​} } 2、package chapter1; import java.io.*; public class RelationOperation2 { ​ ​public static void main(String args[]){ ​​int x = 1; ​​int y = 2; ​​double d_x = 3.1415926; ​​double d_y = 2.41; ​​System.out.println(x + ">" + y +"=" + (x>y)); ​​System.out.println(x + "<" + y +"=" + (x<y)); ​​System.out.println(x + "==" + y +"=" + (x==y)); ​​System.out.println(x + "!=" + y +"=" + (x!=y)); ​​System.out.println(x + ">=" + y +"=" + (x>=y)); ​​System.out.println(x + "<=" + y +"=" + (x<=y)); ​​System.out.println(d_x + ">" + d_y +"=" + (d_x>d_y)); ​​System.out.println(d_x + "<" + d_y +"=" + (d_x<d_y)); ​} } 3、package chapter1; import java.awt.*; public class LogicalDefinition { ​ ​public static void main(String args[]){ boolean true = false; ​​​​boolean b1 = true; boolean b2 = false; ​​int x1 = 3, y1 = 5; ​​int x2 = 3, y2 = 5; boolean b3 = x1 > y1 && x1++ == y1--; boolean b4 = x2 > y2 && x2++ == y2--; ​​System.out.println("各种逻辑运算符运算过程如下:"); ​​System.out.println(b1 + "&" + b2 +"=" + (b1 & b2)); ​​System.out.println(b1 + "|" + b2 +"=" + (b1 | b2)); ​​System.out.println(b1 + "^" + b2 +"=" + (b1 ^ b2)); ​​System.out.println("!" + b2 + "="+ (!b2)); ​​System.out.println(b1 + "&&" + b2 +"=" + (b1 && b2)); System.out.println(b1 + "||" + b2 +"=" + (b1 || b2)); System.out.println( "x=" + x1 +",y=" + y1); ​​System.out.println("(x>y&&x++==y--)" + b3 + ";x=" + x1 + ",y=" + y1); ​​System.out.println("(x>y&x++==y--)" + b4 + ";x=" + x2 + ",y=" + y2); ​} } 4、package chapter1; import java.io.*; public class Max3abc { ​ ​public static void main(String args[]){ ​​int a = 5, b = 15, c = 25; ​​System.out.println("从小到大的顺序是:"); if (a < b) if (b < c) System.out.println(a+ " " + b +" " + c); else if (a < c) System.out.println(a+ " " + c +" " + b); else System.out.println(c + " " + a +" " + b); else if (a < c) System.out.println(b+ " " + a +" " + c); else if (c < b) System.out.println(c+ " " + b +" " + a); else System.out.println(b+ " " + c +" " + a); ​} } 5、 本人在银行帐号上存入1000000元,利率是5.3%,计算并显示10年间每年结算是帐号上的存款总额。使用的公式如下: a=p(1+r)n 其中: p是开始存款的资金 r是每年的利率(0.053,代表5.3%) n是年数 a是第n年底结算的存款总额 package chapter1; import java.io.*; public class Interest { public static void main (String args[]){ double amount; double principal = 1000000.0; double rate =0.05; System.out.printf("%s%20s\n", "Year", "Amount on deposit"); for (int year = 1; year <= 10; year++) { amount = principal * Math.pow(1.0 + rate, year); System.out.printf ("%4%,20.2f\n", year, amount); } } } 6、输出九九乘法表 package chapter1; import java.io.*; public class Mul99 { public static void main (String args[]){ int i,j,n=9; System.out.print("​*|");​ for (i=1;i<=n;i++) System.out.print("​"+i); System.out.print("\n-------|"); for(i=1;i<=n;i++) System.out.print("----"); System.out.println(); for (i=1;i<= n;i++) { System.out.print("​"+i+" |"); for (j=1;j<=i;j++) System.out.print(""+i*j); System.out.println(); } } } 7、package chapter1; import java.io.*; public class loop_continue_test{ public static void main(String args[]){ long sum = 1; loop: for (int i=1; i<=20; i++){ sum = 1; for (int j=2;j<=i;j++){ if (i >10 && i % 2 == 1) continue loop; sum = sum*j; } System.out.println(i +"!"+ "is "+ sum); } } } 8、package chapter1; import java.io.*; public class loop_break_test { public static void main(String args[]){ long sum =1; long limit = 20; loop: for (int i= 1; i<=20; i++) { sum =1; for (int j=2;j<=i;j++) { if (i>10 && i%2==1) break loop; sum = sum *j; } System.out.println(i + "!" + "is "+ sum); } } }
07-08
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值