前言
最近有一位朋友学习了I/O
流,他提出了这样一个问题:现在有一个简单的haha.txt
文件,利用IO流
将haha.txt
中的所有文本复制到第二个txt
文件:haha2.txt
中,问有多少种方式?
I/O流
是Java
中一个比较重要的模块,但是jdk
中与IO流
有关的类比较繁多,大伙记忆起来也比较繁琐,推荐大家多敲代码,在敲代码的过程中,对记忆这些类会轻松许多。
借那位朋友的问题,我们来复习一下IO流
中四种最基本的流。
四种最基本的IO流
第一种方式:
利用 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.*;
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(); } }
|
上述代码需要注意的有两点:
-
haha.txt
和 haha2.txt
必须放在程序当前目录下,如果不在当前目录,需提供全局路径;
-
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.*;
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
—>>
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.*;
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.*;
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流
实现上述效果的类还有许多,这四种方式是最基本也是最原始的方式。