代码功能
首先我们思考代码功能,不难发现我们需要在代码中添加以下功能
1.从键盘上获取字符
2.新建文本文件或打开文本文件
3.将键盘上获取的字符传入文本中
3.显示文本文件内容及文件的路径、修改时间、大小、长度、可读性和可修改性等属性
1、从键盘获取字符
这个不用多说直接标准输入格式
1 | Scanner scanner=new Scanner(System.in); |
注意scanner.next()和scanner.nextLine();区别,
next会自动nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。
next()会自动消去有效字符前的空格,只返回输入的字符,不能得到带空格的字符串。
2.新建文本文件或打开文本文件
我们首先打开一个文件路径,然后检测该文件路径下有无文件,如果没有则创建
首先定义文件及路径
笔者使用String作为存放路径的类型
1 | String dirname="D:\\test.txt"; |
检测文件是否存在
使用f1.exists()
以及if
判断文件是否存在
如果不存在则使用f1.createNewFile()
进行创建
1 | if(!f1.exists()){ |
3.输出属性
利用流在屏幕上显示文本文件内容及文件的路径、修改时间、大小、长度、可读性和可修改性等属性。
1 | System.out.println("文件路径:"+f1.getAbsolutePath()); |
输出结果如下
f1.lastModified()
表达的修改时间为时间戳,表示文件最后一次被修改的时间的 long 值,用该时间与历元(1970 年 1 月 1 日,00:00:00 GMT)的时间差来计算此值(以毫秒为单位)
我们可以使用以下代码进行优化
1 | Long lastModified = file.lastModified(); |
4.输入文字
1 | System.out.print("请输入你要写入D:\\test.txt的文字:"); |
5.输出文本内容
我们可以使用管道流的方式进行输出
1 | BufferedInputStream br = new BufferedInputStream(new FileInputStream(dirname)); |
6.改进
我们发现我们输入的文本会被覆盖,比如第一次我们输入123后第二次输入456,打开文本我们发现我们只有第二次记录即文件里面只剩下456而不是接上123;
并且,我们的输入是使用FileWriter
,而输出文本使用的是BufferedInputStream
,FileWriter
类是OutputStreamWriter
类的简化写法,不需要包装FileOutputStream
字节流,那么输出应该也要统一以保持代码美观可读。
修改输出文本的方法
我们应该使用FileReader
类,FileReader
类是InputStreamReader
类的简化写法,是InputStreamReader
类的子类,所有方法(read()等)都从父类InputStreamReader
中继承而来;
InputStreamReader 和FileReader的区别及InputStream和Reader的区别可以参考InputStreamReader 和FileReader的区别及InputStream和Reader的区别
InputStreamReader 是用来读取原始字节流,可指定编码格式,而FileReader是读取字符流,使用系统默认的编码格式,当读取中文文件是易出现乱码问题
笔者思考着能不能将文本文件直接打印到控制台
1 | FileReader reader=new FileReader(dirname); |
结果发现不能直接打印出来,打印出来的数据是第一个字母的ascii码;
所以我们应该使用循环将所有数据打印出来,其中需要一个ascii的转换
1 | FileReader reader=new FileReader(dirname); |
其中ch就是一个转换,将reader.read()
赋给ch再和-1比较。FileReader类中对read ()方法进行了重载,返回值均为int型,有参的方法,返回值即读取到的字符数
- 首先执行
reader.read()
方法,从字符输入流中读取一个字符,并将其赋值给变量ch
。 - 然后将读取的字符和字符常量
-1
进行比较,如果相等,则说明已经读取到了文件末尾,循环结束;否则,继续执行循环体内的代码。 - 在循环体内,可以对读取的字符进行任意处理,例如输出到控制台、写入到另一个文件等。
特性:
1
2
3 System.out.println(reader.read()); //不能直接打印出来,打印出来的数据是第一个字母的ascii码
System.out.println(reader.read());
System.out.println(reader.read());
输出
也就是说类似与put操作,会弹出首字符的ASCII码
修改输入文本的方法
其实在使用FileWriter时:
1.如果指定的文件不存在,那么会自动创建该文件。
2.如果指定的文件已经存在,那么将会覆盖写入。
3.如果不希望覆盖写入,而是希望进行追加,那么要用另一种重载形式的构造方法。
- public FileWriter(String fileName,boolean append):
第二个参数如果是true值,那么将会追加写入。
1 | public FileWriter(String fileName,boolean append): |
所以我们可以改为
1 | FileWriter writer = new FileWriter(dirname,true); |
检查结果如下
7.总结
先建立File f1 = new File(dirname);
初始化文件
其次通过特性File类的方法比如f1.getAbsolutePath()
打印出属性
使用FileWriter
进行流输入操作
使用FileReader
进行流输出操作
注意:使用流操作时应该使用catch 块包围,这里因为只提供学习方法的原因忽略了catch 块包围
完整代码如下:
1 | import java.io.*; |