0%

JAVA流输入与输出

代码功能

首先我们思考代码功能,不难发现我们需要在代码中添加以下功能

1.从键盘上获取字符

2.新建文本文件或打开文本文件

3.将键盘上获取的字符传入文本中

3.显示文本文件内容及文件的路径、修改时间、大小、长度、可读性和可修改性等属性

1、从键盘获取字符

这个不用多说直接标准输入格式

1
2
Scanner scanner=new Scanner(System.in);
String temp=scanner.nextLine();

注意scanner.next()和scanner.nextLine();区别,

next会自动nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。

next()会自动消去有效字符前的空格,只返回输入的字符,不能得到带空格的字符串。

图片截图来自:(CSDN)[https://blog.csdn.net/zxfly6/article/details/80514903]

2.新建文本文件或打开文本文件

我们首先打开一个文件路径,然后检测该文件路径下有无文件,如果没有则创建

首先定义文件及路径

笔者使用String作为存放路径的类型

1
2
String dirname="D:\\test.txt";
File f1 = new File(dirname);

检测文件是否存在

使用f1.exists()以及if判断文件是否存在

如果不存在则使用f1.createNewFile()进行创建

1
2
3
4
if(!f1.exists()){
System.out.println("文件不存在,将创建文件");
f1.createNewFile();
}

3.输出属性

利用流在屏幕上显示文本文件内容及文件的路径、修改时间、大小、长度、可读性和可修改性等属性。

1
2
3
4
5
System.out.println("文件路径:"+f1.getAbsolutePath());
System.out.println("修改时间:"+f1.lastModified());
System.out.println("文件长度:"+f1.length());
System.out.println("文件可读:"+f1.canRead());
System.out.println("文件可写:"+f1.canWrite());

输出结果如下

运行结果

f1.lastModified()表达的修改时间为时间戳,表示文件最后一次被修改的时间的 long 值,用该时间与历元(1970 年 1 月 1 日,00:00:00 GMT)的时间差来计算此值(以毫秒为单位)

我们可以使用以下代码进行优化

1
2
3
Long lastModified = file.lastModified();
Date date = new Date(lastModified);
System.out.println(date);

4.输入文字

1
2
3
4
5
6
7
System.out.print("请输入你要写入D:\\test.txt的文字:");
Scanner scanner=new Scanner(System.in);
String temp=scanner.nextLine();
FileWriter writer = new FileWriter(dirname);
writer.write(temp);
writer.flush();
writer.close();

5.输出文本内容

我们可以使用管道流的方式进行输出

1
2
3
4
5
6
BufferedInputStream br = new BufferedInputStream(new FileInputStream(dirname));
int c;
while ((c = br.read()) != -1) {
System.out.print((char) c);
}
br.close();

6.改进

我们发现我们输入的文本会被覆盖,比如第一次我们输入123后第二次输入456,打开文本我们发现我们只有第二次记录即文件里面只剩下456而不是接上123;

并且,我们的输入是使用FileWriter,而输出文本使用的是BufferedInputStreamFileWriter类是OutputStreamWriter类的简化写法,不需要包装FileOutputStream字节流,那么输出应该也要统一以保持代码美观可读。

修改输出文本的方法

我们应该使用FileReader类,FileReader类是InputStreamReader类的简化写法,是InputStreamReader类的子类,所有方法(read()等)都从父类InputStreamReader中继承而来;

InputStreamReader 和FileReader的区别及InputStream和Reader的区别可以参考InputStreamReader 和FileReader的区别及InputStream和Reader的区别

InputStreamReader 是用来读取原始字节流,可指定编码格式,而FileReader是读取字符流,使用系统默认的编码格式,当读取中文文件是易出现乱码问题

笔者思考着能不能将文本文件直接打印到控制台

1
2
FileReader reader=new FileReader(dirname);
//System.out.print(reader.read());

结果发现不能直接打印出来,打印出来的数据是第一个字母的ascii码;

所以我们应该使用循环将所有数据打印出来,其中需要一个ascii的转换

1
2
3
4
5
6
7
8
9
10
FileReader reader=new FileReader(dirname);
//System.out.print(reader.read()); 不能直接打印出来,打印出来的数据是第一个字母的ascii码

int ch=0;
while((ch=reader.read())!=-1) //记住即可,read方法如果没有可读取的了,则返回-1,所以就是一直读取,并将
//读取的内容存入ch,一直到结尾
{
System.out.print((char)ch);//打印读取的结果,由于ch是int类型,将其强制转换为String类型
}
reader.close();

其中ch就是一个转换,将reader.read()赋给ch再和-1比较。FileReader类中对read ()方法进行了重载,返回值均为int型,有参的方法,返回值即读取到的字符数

  1. 首先执行 reader.read() 方法,从字符输入流中读取一个字符,并将其赋值给变量 ch
  2. 然后将读取的字符和字符常量 -1 进行比较,如果相等,则说明已经读取到了文件末尾,循环结束;否则,继续执行循环体内的代码。
  3. 在循环体内,可以对读取的字符进行任意处理,例如输出到控制台、写入到另一个文件等。

特性:

1
2
3
System.out.println(reader.read());  //不能直接打印出来,打印出来的数据是第一个字母的ascii码
System.out.println(reader.read());
System.out.println(reader.read());

输出

image-20230619000649197

也就是说类似与put操作,会弹出首字符的ASCII码

修改输入文本的方法

其实在使用FileWriter时:

1.如果指定的文件不存在,那么会自动创建该文件。
2.如果指定的文件已经存在,那么将会覆盖写入。
3.如果不希望覆盖写入,而是希望进行追加,那么要用另一种重载形式的构造方法。

  • public FileWriter(String fileName,boolean append):
    第二个参数如果是true值,那么将会追加写入。
1
2
public FileWriter(String fileName,boolean append):
//第二个参数如果是true值,那么将会追加写入。

所以我们可以改为

1
FileWriter writer = new FileWriter(dirname,true);

检查结果如下

image-20230619001511836

7.总结

先建立File f1 = new File(dirname);初始化文件

其次通过特性File类的方法比如f1.getAbsolutePath()打印出属性

使用FileWriter进行流输入操作

使用FileReader进行流输出操作

注意:使用流操作时应该使用catch 块包围,这里因为只提供学习方法的原因忽略了catch 块包围

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.io.*;
import java.util.Date;
import java.util.Scanner;

public class Main {
public static void main(String[] args) throws IOException {
String dirname="D:\\test.txt";
File f1 = new File(dirname);


if(!f1.exists()){
System.out.println("文件不存在,将创建文件");
f1.createNewFile();
// FileOutputStream out = new FileOutputStream(dirname);
}
System.out.println("文件路径:"+f1.getAbsolutePath());
// System.out.println("修改时间:"+f1.lastModified());
long time=f1.lastModified();
Date date=new Date(time);
System.out.println("修改时间:"+date);
System.out.println("文件长度:"+f1.length());
System.out.println("文件可读:"+f1.canRead());
System.out.println("文件可写:"+f1.canWrite());
FileWriter writer = new FileWriter(dirname,true);
System.out.print("请输入你要写入D:\\test.txt的文字:");
Scanner scanner=new Scanner(System.in);
String temp=scanner.nextLine();
writer.write(temp);
writer.flush();
writer.close();
FileReader reader=new FileReader(dirname);
// System.out.println(reader.read()); //不能直接打印出来,打印出来的数据是第一个字母的ascii码
// System.out.println(reader.read());
// System.out.println(reader.read());

int ch=0;
while((ch=reader.read())!=-1) //记住即可,read方法如果没有可读取的了,则返回-1,所以就是一直读取,并将
//读取的内容存入ch,一直到结尾
{
System.out.print((char)ch);//打印读取的结果,由于ch是int类型,将其强制转换为String类型
}
reader.close();
// try {
// BufferedInputStream br = new BufferedInputStream(new FileInputStream(dirname));
// int c;
// while ((c = br.read()) != -1) {
// System.out.print((char) c);
// }
// br.close();
// } catch (Exception e) {
// e.printStackTrace();
// }
}
}

技术分享,如果您觉得内容不错的话不妨进行打赏,您的支持将鼓励我继续创作!


如果你对本文有看法或更好的见解可以点击下方按钮进行评论
*注:本站为非交互网站
此按钮将会转跳至评论站点 i-nmb.chat 进行评论
  • 本文作者: i囡漫笔
  • 本文链接: https://i-nmb.cn/JAVA-io.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道