复制文件基本的步骤
- 封装数据源(从数据源中读取数据)
- 封装目的地(将读出的数据写入到目的文件中)
- 关闭资源
注意:
在复制文件的时候,源文件必须存在,目标文件不存在时,会默认创建
方式1:采用FileOutputStream和FileInputStream的read()方法:一次读一个字节
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class IOdemo {
public static void main(String[] args) throws IOException{
// IO操作文件的9中方式
//字节流的4中方式
//FileOutputStream(字节输出流),FileInputStream(字节输入流)
//1.采用一次读取一个字节的方式:
//创建输入流对象,读取数据
FileInputStream fis=new FileInputStream("IOdemo1.txt");
//让fis对象指向了要复制的文本文件,此文件表示相对于当前目录的文本文件,也可以写成或绝对路径
//创建输出流对象写数据
FileOutputStream fos=new FileOutputStream("des1.txt");
//让fos对象指向目标文件
//读数据
// int read()方法返回的是读取的数据的ASCLL码表示,末尾没有数据了就返回-1,并且该方法一次读取一个字节
int by=0;
while((by=fis.read())!=-1) {
fos.write(by);//写入数据
}
//关闭资源
fos.close();
fis.close();
}
}
- 运行结果:
运行前只有源文件IOdemo1.txt
程序运行后:(复制的文件显示了出来)
下图分别是两个文件中的内容
方式二:采用FileOutputStream和FileInputStream的read()方法:一次读一个字节数组
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class IOdemo2 {
public static void main(String[] args) throws IOException{
//创建输入流对象读取数据
FileInputStream fis=new FileInputStream("IOdemo1.txt");
//创建输出流对象写数据
FileOutputStream fos =new FileOutputStream("des2.txt");
//读数据
//使用int read(byte[] b) 方法一次读取一个字节数组
//此方法返回值是读了多少个字节,当没有数据时返回-1
byte[] bys=new byte[1024];//此处大小一般写1024的整数倍,1024字节就是1KB
int len=0;
while((len=fis.read(bys))!=-1) {
//写数据
fos.write(bys,0,len);//void write(byte[] b, int off, int len)
//此处采用一次写一个字符数组的一部分的write方法(off起始位置len个数)
}
//关闭资源
fos.close();
fis.close();
}
}
字节缓冲输出流和字节缓冲输入流
- 采用BufferedOutputStream和BufferedInputStream的两种方法:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class IOdemo3 {
public static void main(String[] args) throws IOException {
/*
//方式一:
//创建字节缓冲输入流对象读取数据
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("IOdemo1.txt"));
//创建字节缓冲输处流对象写数据
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("des3,txt"));
//字节缓冲流的构造方法里面传的参数是一个字节刘对象和缓冲数组的大小,当我们不写的时候使用默认的大小
//BufferedInputStream(InputStream in, int size)
//以一次读取一个字节的方式读取数据
int by=0;
while((by=bis.read())!=-1) {
bos.write(by);//写入数据
//bos.flush();//当数据量特别大的时候,我们需要刷新缓冲区
}
//关闭资源
bos.close();
bis.close();
*/
//方式二:
//创建字节缓冲输入流对象读取数据
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("IOdemo1.txt"));
//创建字节缓冲输处流对象写数据
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("des4,txt"));
//以一次读取一个字节数组的方式读取数据
byte [] bys=new byte[1024];
int len=0;
while((len=bis.read(bys))!=-1) {
bos.write(bys,0,len);
}
//关闭资源
bos.close();
bis.close();
}
}
字符流的5种方式
- 转换字符流OutputStreamWriter和InputStreamReader的两种方式:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class IOdemo4 {
public static void main(String[] args) throws IOException{
//转换字符流OutputStreamWriter和InputStreamReader的两种方式
//方式一:
//创建字符转换输入流读取数据
InputStreamReader isr=new InputStreamReader(new FileInputStream("IOdemo1.txt"));
//装换流的构造方法传入两个参数,字节流对象和编码方式,不写。默认本地编码
//创建字符转换输出流写数据
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("des5.txt"));
//以一次读取一个字符的方式读取数据
int ch=0;
while((ch=isr.read())!=-1) {
osw.write(ch);
}
//关闭资源
osw.close();
isr.close();
/*
//方式二
//创建字符转换输入流读取数据
InputStreamReader isr=new InputStreamReader(new FileInputStream("IOdemo1.txt"));
//装换流的构造方法传入两个参数,字节流对象和编码方式,不写。默认本地编码
//创建字符转换输出流写数据
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("des6.txt"));
//以一次读取一个字符数组的方式读取数据
char [] chs=new char[1024];
int len=0;
while((len=isr.read(chs))!=-1) {
osw.write(chs,0,len);
}
//关闭资源
osw.close();
isr.close();
*/
}
}
- 字符流FileWriter和FileReader的两种方式:
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class IOdemo5 {
public static void main(String[] args) throws IOException{
//字符流FileWriter和FileReader的两种方式
/*
//创建字符输入读取数据
FileReader fr=new FileReader("IOdemo1.txt");
//创建字符流输出流写数据
FileWriter fw=new FileWriter("des7.txt");
//方式一:一次读取读取一个字符
int ch=0;
while((ch=fr.read())!=-1) {
fw.write(ch); //写数据
}
fw.close();
fr.close();
*/
//创建字符输入读取数据
FileReader fr=new FileReader("IOdemo1.txt");
//创建字符流输出流写数据
FileWriter fw=new FileWriter("des8.txt");
//方式一:一次读取读取一个字符数组
char [] chs=new char[1024];
int len=0;
while((len=fr.read(chs))!=-1) {
fw.write(chs,0,len);
}
fw.close();
fr.close();
}
}
- 缓冲字符流BufferedWriter和BufferedReader的方式:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class IOdemo6 {
public static void main(String[] args) throws IOException{
//缓冲字符流BufferedWriter和BufferedReader的方式
//缓冲字符流自带缓冲区
//该类有newLine()方法,根据不同的系统写入不同的换行符(windows为\r\n linux为 mac为\r)
//readLine()方法一次一次读取一行,如果已到达流末尾,
//则返回 null 通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行
//创建缓冲字符输入流读取数据
BufferedReader br=new BufferedReader(new FileReader("IOdemo1.txt"));
//创建缓冲字符输出流写数据
BufferedWriter bw=new BufferedWriter(new FileWriter("des9.txt"));
//读数据,一次读取一行
String line=null;
while((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();//readLine()读的时候不读换行符,所以我们要写如换行符
//bw.flush();//刷新缓冲区
}
bw.close();
br.close();
}
}
运行结果:
(个人学习总结,仅供参考,有错误请指正)