编写文件时发现的一个比较特别的错误,与\r\n有关
写这篇博客的意图
在记录下这个错误的过程中,顺便熟悉一下MarkDown语法,方便以后的学习,参考内容如下
- 百度中的MarkDown语法1 ;
错误的起源
学习java语言的过程中,碰到了难题,java IO,所以看完了java IO之后呢,就来做做题练习一下,然后在做第二题的过程碰到了这个错误
完整的题目
从键盘输入文件的内容和要保存的文件名称,然后根据输入的名称创建文件,并将内容保存到文件中。
我的错误代码
import java.util.Scanner;
import java.io.*;
public class exercise12_2 {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
OutputStream out=null;
scan.useDelimiter("\n");
String str=scan.next();
File file=new File("d:"+File.separator+str);
str=scan.next();
byte b[]=str.getBytes();
try {
out=new FileOutputStream(file);
out.write(b);
out.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
输入的内容和报错的内容
我是用的是Eclipse,此处顺便提供几个快捷键:
- 程序编写完成之后,按下F11可以直接运行;
- 调试的时候,按下F5和F6可以单步往下运行
- F5是会进入当前语句的调用部分,可以看到深层的运行过程
- F6则是简单的运行这一语句后进入下一条语句
寻找错误原因
首先我们来查看报错的地点和原因,可知报错的位置是:
out=new FileOutputStream(file);
我们知道,如果文件不存在那么应该是会自动创建文件的,所以绝对不是没有创建文件。那么这里的报错应该是:创建文件失败!
那么为什么会创建失败呢?
经过一番调试,在程序中加断点,查看变量内容之后,发现了这样现象:
会发现,str是文件名,然后str的值后面多出了\r,所以,这样的文件名不可能正确的创建文件。
那么\r又是哪里来的呢?
经过百度一番查找,终于找到了热心网友的解释:
换行符就是另起一新行,光标在新行的开头;
回车符就是光标回到一旧行的开头;(即光标目前所在的行为旧行)
——————————————————————
所以我们平时编写文件的回车符(即:回车键 )应该确切来说叫做回车式的换行符。
即,我们的换行符通过键盘上的回车键来实现。
也即键盘上的回车键是用来进行实现换行符的。
也即键盘上的回车键不是用来进行实现回车符的。
——————————————————————
换行符’\n’ ASCII值为10,换行(newline begin)
回车符’\r’ ASCII值为13,回车(return oldline begin)
也可以表示为 ‘\x0a’ 和 ‘\x0d’ (16进制表示)
——————————————————————
在windows系统下,回车式的换行符号是"\r\n";
但是在Linux等系统下是没有"\r"符号的。
注意:在我的代码中,有这样一条语句:
scan.useDelimiter("\n");
这就是报错的罪魁祸首,因为我们按回车是\r\n,所以就导致了,输入了回车键之后,只把\n作为了分隔符,然后\r遗留在了str中,所以文件名就错了,无法创建文件。
修改错误
知道了错误原因,于是乎修改上面的语句为
scan.useDelimiter("\r\n");
然后重新运行程序
塔塔,大功告成!
功能快捷键
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G