学习IO的一些理解
IO 是 Input(输入)和 Output(输出)的简称。在计算机中,输入就是从硬盘中读取数据,送到内存中,就是 read ;输出就是将内存中的数据写到硬盘中,就是 write 。
在Java中,数据的输入与输出操作,一般以“流”的方式进行。Java中的 java.io 包中为我们提供了各种流的接口,并且进行了分类:按照数据流的流向不同,分为了输入流与输出流;按照操作数据单位的不同,分为了字节流和字符流;按照流的功能分为节点流和处理流。
输入流是指从外部往内存中存数据,就是 Input;输出流是指从内存往外部读取数据,就是 Output。
字节流就是指在输入或输出读取数据时,一次只读取一个字节的数据,字符流指读取数据时,一次读取一个字符。字节流可以读取任何形式的数据,如文本文件、图片、视频等,而字符流只能读取纯文本形式的数据。
下面是Java输入输出流中常用的一些类
分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
---|---|---|---|---|
抽象父类 | InputStream | OutputStream | Reader | Writer |
访问文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
访问数组 | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
访问管道 | PipedInputStream | PipedOutputStream | PipedReader | PipedWriter |
访问字符串 | StringReader | StringWriter | ||
缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
转换流 | InputStreamReader | OutputStreamWriter | ||
对象流 | ObjectInputStream | ObjectOutputStream | ||
装饰流 | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter |
打印流 | PrintStream | PrintWriter | ||
数据过滤流 | DataInputStream | DataOutputStream |
由图可知,带有 Stream 的都是字节流,带有 Reader 和 Writer 则是字符流。因此我们可以进行一定的猜测,以后我们遇到的带有 Stream 的流,都可以认定为字节流,而带有 Reader 或者 Writer 的都可以认为是字符流。
在经过一段时间的学习后,我现在能够进行一些基础的IO操作,例如将一个文件中的内容拷贝到另一个文件中,并将其打印出来。
代码
字节流
Reader_WriterTest.java
package com.why.filetest;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Reader_WriterTest {
public void test() {
FileReader fr = null;
FileWriter fw = null;
try {
// 需要在后面的括号中填入需要文件的路径
File file1 = new File("C:\\Users\\why\\code\\Demo\\src\\com\\why\\filetest\\hello.txt");
File file2 = new File("C:\\Users\\why\\code\\Demo\\src\\com\\why\\filetest\\copyhello.txt");
// 创建输入输出流对象
fr = new FileReader(file1);
fw = new FileWriter(file2);
// 创建一个字符型的数组用于读取带到的存储数据
char[] arr = new char[(int)file1.length()];
// 记录字符的个数
int len;
while ((len = fr.read(arr)) != -1) {
fw.write(arr, 0, len);
System.out.println(arr);
}
}
catch (IOException e) {
e.printStackTrace(); // 简单说明异常
}
// 关闭流
finally {
if(fw != null) {
try {
fw.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
if(fr != null) {
try {
fr.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
字符流
StreamTest.java
package com.why.filetest;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class StreamTest {
public void test() {
File file = new File("C:\\Users\\why\\code\\Demo\\src\\com\\why\\filetest\\copyhello.txt");
FileInputStream fis = null;
try {
// 创建输入流对象
fis = new FileInputStream(file);
byte[] arr = new byte[(int)file.length()];
int len;
while ((len = fis.read(arr)) != -1) {
// 文件中存储的是字符型数据,因此需要进行转换才能正常输出
String str = new String(arr, 0, len);
System.out.println(str);
}
}
catch (IOException e) {
e.printStackTrace();
}
// 关闭流
finally {
if(fis != null) {
try {
fis.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
IOTest.java
package com.why.filetest;
import java.io.*;
public class IOTest {
public static void main(String[] args) {
Reader_WriterTest t1 = new Reader_WriterTest();
StreamTest t2 = new StreamTest();
t1.test();
// 运行了Reader_WriterTest后,查看复制是否成功
t2.test();
}
}
运行结果
注意 : 在使用完流之后一定要关闭流!!!