共计 3753 个字符,预计需要花费 10 分钟才能阅读完成。
在 Java 中,有两种根本的数据流类型:字节流和字符流。字节流解决原始二进制数据,而字符流解决 Unicode 字符。本章节咱们将学习字节流与字符流的基本概念以及如何应用它们进行文件的输入输出操作。
4.2.1 字节流
字节流解决原始二进制数据,分为输出字节流(InputStream)和输入字节流(OutputStream)。它们都是抽象类,不能间接实例化,但有很多实现类可用。以下是一些罕用的字节流类:
FileInputStream
: 从文件中读取字节FileOutputStream
: 向文件中写入字节ByteArrayInputStream
: 从字节数组中读取字节ByteArrayOutputStream
: 向字节数组中写入字节BufferedInputStream
: 缓冲输出字节流BufferedOutputStream
: 缓冲输入字节流
4.2.1.1 应用 FileInputStream 和 FileOutputStream
咱们先来看一个应用 FileInputStream
和FileOutputStream
进行文件复制的例子:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Main {public static void main(String[] args) {
try {FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.txt");
int data;
while ((data = fis.read()) != -1) {fos.write(data);
}
fis.close();
fos.close();} catch (IOException e) {e.printStackTrace();
}
}
}
这段代码首先创立了一个 FileInputStream
对象来读取名为 input.txt
的文件,并创立一个 FileOutputStream
对象来将数据写入名为 output.txt
的文件。而后,通过循环调用 read()
办法从 FileInputStream
中读取一个字节,而后用 write()
办法将它写入 FileOutputStream
。当read()
办法返回 -1
时,示意曾经达到文件开端,循环完结。最初,不要遗记敞开输入输出流。
4.2.1.2 应用 BufferedInputStream 和 BufferedOutputStream
为了进步读写效率,咱们能够应用 BufferedInputStream
和BufferedOutputStream
。它们对字节流进行缓冲,以缩小对底层数据源或指标的理论读写次数。上面是应用缓冲字节流进行文件复制的例子:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Main {public static void main(String[] args) {
try {FileInputStream fis = new FileInputStream("input.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream("output.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
int data;
while ((data = bis.read()) != -1) {bos.write(data);
}
bis.close();
bos.close();} catch (IOException e) {e.printStackTrace();
}
}
}
4.2.2 字符流
字符流解决 Unicode 字符,分为输出字符流(Reader)和输入字符流(Writer)。它们同样是抽象类,以下是一些罕用的字符流类:
FileReader
: 从文件中读取字符FileWriter
: 向文件中写入字符CharArrayReader
: 从字符数组中读取字符CharArrayWriter
: 向字符数组中写入字符BufferedReader
: 缓冲输出字符流BufferedWriter
: 缓冲输入字符流
4.2.2.1 应用 FileReader 和 FileWriter
咱们来看一个应用 FileReader
和FileWriter
进行文件复制的例子:
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Main {public static void main(String[] args) {
try {FileReader fr = new FileReader("input.txt");
FileWriter fw = new FileWriter("output.txt");
int data;
while ((data = fr.read()) != -1) {fw.write(data);
}
fr.close ();
fw.close();} catch (IOException e) {e.printStackTrace();
}
}
}
这段代码与之前的字节流示例相似,但这里应用的是 FileReader
和FileWriter
,它们解决字符而非字节。这样做的益处是,咱们能够在读取和写入文本文件时正确处理 Unicode 字符。
4.2.2.2 应用 BufferedReader 和 BufferedWriter
同样,咱们能够应用 BufferedReader
和BufferedWriter
进步字符流的读写效率。上面是一个应用缓冲字符流进行文件复制的例子:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Main {public static void main(String[] args) {
try {FileReader fr = new FileReader("input.txt");
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter("output.txt");
BufferedWriter bw = new BufferedWriter(fw);
int data;
while ((data = br.read()) != -1) {bw.write(data);
}
br.close();
bw.close();} catch (IOException e) {e.printStackTrace();
}
}
}
小结
咱们学习了字节流与字符流的基本概念以及如何应用它们进行文件的输入输出操作。字节流解决原始二进制数据,字符流解决 Unicode 字符。在理论编程中,能够依据数据类型抉择适合的流进行操作。同时,应用缓冲流能够进步读写效率。
请务必在操作实现后敞开流,以防止资源透露。从 Java 7 开始,能够应用 try-with-resources 语句主动敞开资源。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Main {public static void main(String[] args) {try (BufferedReader br = new BufferedReader(new FileReader("input.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
int data;
while ((data = br.read()) != -1) {bw.write(data);
}
} catch (IOException e) {e.printStackTrace();
}
}
}
以上代码应用了 try-with-resources 语句,无需手动敞开资源。当 try 语句块完结时,资源会主动敞开。
举荐浏览:
https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA
https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g