一、IO概念
IO就是输入(in)输出(out)。作为我们人来说,看书是输入,把知识记在到我们脑子里;写字是输出,把脑子里的内容写到本子上。然后我们把程序当做人的大脑,输入就是内容读到程序里面,输出就是把内容写到另一个地方。在输入输出的过程中,需要借用相应的工具,比如看需要眼睛,程序则需要输入类;写需要手,程序则需要输出类。
二、字节流(InputStream/OutpuStream)和字符流(Reader/Writer)
字节流就是按字节读取和输出。字符流则是按字符读取和输出。一般来说,字节流比较全面,可以读取文本文件和非文本文件;字符流用来读取文本文件。
三、代码
1.字节流复制文件
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 输入+输出
* Stream字节流可以读取文本和非文本文件 比较全面
*/
public class IoStreamTest3 {
public static void main(String[] args) throws IOException {
//文件
String path = "D:\\";
File fileIn = new File(path + "in2.png");
String fileName = fileIn.getName();
String type = fileName.substring(fileName.lastIndexOf("."));//文件后缀名
File fileOut = new File(path + "out2" + type);
//流
FileInputStream fis = new FileInputStream(fileIn);
FileOutputStream fos = new FileOutputStream(fileOut);
//读取
byte[] buffer = new byte[1024];//缓冲区
int length = fis.read(buffer);
while (length != -1) {
//写入
fos.write(buffer, 0, length);//写入有效内容
length = fis.read(buffer);
}
//关闭
fos.close();
fis.close();
System.out.println("finish");
}
}
2.字符流复制文件
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* Reader Writer 字符流进行IO
*/
public class IoReaderTest {
public static void main(String[] args) throws IOException {
//文件
File fileIn = new File("D:\\in1.txt");
File fileOut = new File("D:\\out1.txt");
//流
FileReader fr = new FileReader(fileIn);
FileWriter fw = new FileWriter(fileOut);
//读取
char[] buffer = new char[1024];//缓冲区 用来提升效率
int length = fr.read(buffer);
while (length != -1) {
//写入
fw.write(buffer, 0, length);
length = fr.read(buffer);
}
//关闭
fw.close();
fr.close();
System.out.println("finish");
//如果乱码,可以查看下两个文件的编码是否不一致
}
}
3.字符流指定编码
import java.io.*;
/**
* Buffered字符流进行IO
*/
public class IoBufferedTest {
public static void main(String[] args) throws IOException {
//文件
String path = "D:\\";
String number = "4";
File fileIn = new File(path + "in" + number + ".txt");
String fileName = fileIn.getName();
String type = fileName.substring(fileName.lastIndexOf("."));
File fileOut = new File(path + "out" + number + type);
//流
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fileIn), "utf-8"));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileOut), "utf-8"));
//读取
char[] buffer = new char[1024];
int length = br.read(buffer);
while (length != -1) {
System.out.println(length);
bw.write(buffer, 0, length);
length = br.read(buffer);
}
//关闭
bw.close();
br.close();
System.out.println("finish");
}
}
四、代码步骤
1.先确定要操作的文件,源文件(输入来源,从这个文件读取内容)和目标文件(把内容输出到该文件)
2.创建对应的流工具
3.从源文件获取输入内容,输出到目标文件
4.关闭流,注意要先关闭输出流再关闭输入流
依据这样的思路,可以自己写一个BufferedInputStream和BufferedOutputStream进行文件复制。