小小白祈祷中...

前言

最近有一位朋友学习了I/O流,他提出了这样一个问题:现在有一个简单的haha.txt文件,利用IO流haha.txt中的所有文本复制到第二个txt文件:haha2.txt中,问有多少种方式?

I/O流Java中一个比较重要的模块,但是jdk中与IO流有关的类比较繁多,大伙记忆起来也比较繁琐,推荐大家多敲代码,在敲代码的过程中,对记忆这些类会轻松许多。

借那位朋友的问题,我们来复习一下IO流中四种最基本的流。

四种最基本的IO流

FileInputStream 和 FileOutputStream

第一种方式:

利用 FileInputStream 和 FileOutputStream —>>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.io.*;

/**
* @author sixibiheye
* @date 2021/9/11
* @apiNote "复制"文本的方式一 FileInputStream && FileOutputStream
*/
public class FileInputStream$FileOutputStream {
public static void main(String[] args) throws IOException {
File input = new File("haha.txt");
File output = new File("haha2.txt");

FileInputStream fileInputStream = new FileInputStream(input);
FileOutputStream fileOutputStream = new FileOutputStream(output);

int c;
while((c = fileInputStream.read()) != -1){
fileOutputStream.write(c);
}

fileInputStream.close();
fileOutputStream.close();
}
}

上述代码需要注意的有两点:

  1. haha.txthaha2.txt 必须放在程序当前目录下,如果不在当前目录,需提供全局路径;

  2. read() 方法会读取某一个字节并返回(返回值为整型),如果返回值为-1,则代表文件读取完毕 。

FileReader 和 FileWriter

第二种方式:

利用 FileReader 和 FileWriter —>>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.io.*;

/**
* @author sixibiheye
* @date 2021/9/11
* @apiNote "复制"文本的方式二 FileReader && FileWriter
*/
public class FileReader$FileWriter {
public static void main(String[] args) throws IOException {
FileReader fileReader = new FileReader("haha.txt");
FileWriter fileWriter = new FileWriter("haha2.txt");
int c;
while((c = fileReader.read()) != -1){
fileWriter.write(c);
System.out.print((char) c);
}
fileReader.close();
fileWriter.close();
}
}

上述代码中添加了一句:“System.out.print((char) c);”,用于在控制台输出haha.txt中的文本内容。

BufferedInputStream 和 BufferedOutputStream

第三种方式:

利用 BufferedInputStream 和 BufferedOutputStream —>>

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
import java.io.*;

/**
* @author sixibiheye
* @date 2021/9/11
* @apiNote "复制"文本的方式三 BufferedInputStream && BufferedOutputStream
*/
public class BufferedInputStream$BufferedOutputStream {
public static void main(String[] args) throws IOException {
File input = new File("haha.txt");
File out = new File("haha2.txt");

BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(input));
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(out));

int c;
while((c = bufferedInputStream.read()) != -1){
bufferedOutputStream.write(c);
System.out.print((char) c);
}

bufferedInputStream.close();
bufferedOutputStream.close();
}
}

上述的缓冲流,把数据从原始流成块读入或把数据积累到一个大数据块后再成批写出,通过减少系统资源的读写次数来加快程序的执行。推荐使用。

BufferedReader 和 BufferedWriter

第四种方式:

利用 BufferedReader 和 BufferedWriter —>>

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
import java.io.*;

/**
* @author sixibiheye
* @date 2021/9/11
* @apiNote "复制"文本的方式四 BufferedReader && BufferedWriter
*/

public class BufferedReader$BufferedWriter {
public static void main(String[] args) throws IOException {
File input = new File("haha.txt");
File output = new File("haha2.txt");

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(input)));
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(output)));

String s;
while((s = bufferedReader.readLine()) != null){
bufferedWriter.write(s);
bufferedWriter.newLine();
}

bufferedReader.close();
bufferedWriter.close();
}
}

上述的 BufferedReader 方式,在读取文本的时候多了一种方法:readLine() 用于读取一行的文本,值得注意的是,readLine() 不会读取每一行的换行符,所以在使用 BufferedWriter 进行写入的时候,JDK提供了一个 newLine() 方法用于产生一个换行符,保证我们读取文本数据的原始性。

同前一种方式,BufferedReader 和 BufferedWriter 操作纯文本的效率上要比第一,二种方式高,推荐使用。

当然,IO流实现上述效果的类还有许多,这四种方式是最基本也是最原始的方式。

本文作者:LuoYing @ 小小白的笔记屋

本文链接:https://luoying.netlify.app/2021/09/15/ijbekjky/

本文标题:你会几种“复制”文本的方式?

本文版权:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!