NEWS LETTER

JAVA流输入与输出

Scroll down

代码功能

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

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();
// }
}
}

推荐文章
站内
推荐 (5.0%)
6分钟

Hexo博客NJK主题的相关文章智能推荐插件hexo-article-recommender进阶配置(DIY)

DIY客制化文章底部“文章推荐模块”,本篇文章介绍Nunjucks(NJK)模板的hexo主题(如NexT主题)如何实现。hexo-article-recomm

1
i囡漫笔
随心漫笔写文章
站内
推荐 (5.0%)
6分钟

Hexo博客EJS主题的相关文章智能推荐插件hexo-article-recommender进阶配置(DIY)

DIY客制化文章底部“文章推荐模块”,本篇文章介绍EJS模板的hexo主题如何实现。hexo-article-recommender为Hexo博客提供本地化智能

2
i囡漫笔
随心漫笔写文章
站内
推荐 (5.0%)
6分钟

Hexo博客文章底部添加推荐相关文章:使用hexo-article-recommender插件实现

hexo-article-recommender为Hexo博客提供本地化智能文章推荐:融合语义、标题、标签、分类与发布时间五维特征,支持三种策略切换,自动生成带

3
i囡漫笔
随心漫笔写文章
站内
推荐 (4.1%)
16分钟

Java 字符串—JAVA语言基础

字符串是Java程序中经常处理的对象,如果字符串运用得不好,将影响到程序运行的效率。
(本文章参考《Java从入门到精通 第5版 明日科技》。故不采用

4
本站作者
原创文章

--- over ---

其他文章
目录导航 置顶
  1. 1. 代码功能
  2. 2. 1、从键盘获取字符
  3. 3. 2.新建文本文件或打开文本文件
    1. 3.1. 首先定义文件及路径
    2. 3.2. 检测文件是否存在
  4. 4. 3.输出属性
  5. 5. 4.输入文字
  6. 6. 5.输出文本内容
  7. 7. 6.改进
    1. 7.1. 修改输出文本的方法
    2. 7.2. 修改输入文本的方法
  8. 8. 7.总结
请输入关键词进行搜索