(一)文件字节输入输出流 (内容:文件输入流,文件输出流,文件拷贝,文件夹拷贝)
1)文件输入流
package b_IOByte;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
/**
* 文件输入流演示
*/
public class Demo1 {
public static void main(String[] args){
//1.建立联系 File对象
File src=new File("G:/iotest/IObyte/a.txt");
//2.选择流
InputStream is=null;//提升作用域
try {
is=new FileInputStream(src);
//3.操作不断读取:缓冲数组
byte[] car=new byte[10];
int len=0;//接收实际读取的大小(车不一定装满)
//循环读取
try {
while(-1!=(len=is.read(car))){ //每次读入10个存储到car中,并返回实际读取的字节个数(注:不够10个的情况)
//输出:将字节数组转成字符串
String info=new String(car,0,len);
System.out.println(info);
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("文件不存在");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("读取文件失败");
}finally{
//4.释放资源
if(null!=is){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("关闭输入流文件失败");
}
}
}
}
}
重点说明:
int read();一次读取一个字节,-1表示文件末尾。
int read(byte[ ] b);一次读取一个指定大小的字节,并放入字节数组中,然后返回值表示实际读取到了多少个字节。
设置多少个字节数组合适呢? 答:不能太多不能太少,太多占空间,太少太频繁。
read()方法,还有一个共性:首次read()从文件开始读取,然后马上指针后移。( read()后移1个字节,read(byte[ ] b)后移指定字节)
2)文件输出流
package b_IOByte;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* 写出文件演示
*/
public class Demo2 {
public static void main(String[] args){
//1.建立联系 File对象 目的地(如果文件不存在,输出流会帮你创建!!)
File dest=new File("G:/iotest/IObyte/a.txt");
//2.选择流
OutputStream os=null;
try {
os=new FileOutputStream(dest,true); //以追加的形式写出文件(每次执行一次程序)
//3.操作
String str="bysext is very good \r\n";
//字符串转字节数组
byte[] data=str.getBytes();
try {
os.write(data,0,data.length);
os.flush();// 强制刷新出去
} catch (IOException e) {
e.printStackTrace();
System.out.println("文件写出失败");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件未找到");
}finally{
//4.释放资源
if(null!=os){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("关闭输出流失败");
}
}
}
}
}
重点说明:
1.OutputStream os=new FileOutputStream(dest,true);
dest:输出流文件路径如果不存在,会自动创建文件
true:以追加方式写入文件,false为覆盖。
2.os.flush();--->务必强制刷新
3)文件拷贝
package b_IOByte;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 文件拷贝
*/
public class Demo3 {
public static void main(String[] args) {
String src="G:/iotest/IOByte/a.txt";
String dest="G:/iotest/IOByte/demo3";
try {
copyFile(src,dest);
} catch (IOException e) {
e.printStackTrace();
System.out.println("文件不存在");
}
}
public static void copyFile(String srcPath,String destPath) throws IOException{
//1.建立联系: 源文件(存在且为文件) + 目的地(可以不存在)
File src=new File(srcPath);
File dest=new File(destPath);
if(!src.isFile()||!src.exists()){
/* System.out.println(" 只能拷贝文件");
return;*/
throw new IOException("只能拷贝文件");
}
//2.选择流
InputStream is=new FileInputStream(src);
OutputStream os=new FileOutputStream(dest);
//3.操作:拷贝=循环+读取+写出
byte[] flush=new byte[1024];
int len=0;
while(-1!=(len=is.read(flush))){
os.write(flush,0,len);
}
os.flush();
//关闭流
os.close();
is.close();
}
}
重点说明:
1.文件拷贝属于输入\输出流的综合练习
2.流的关闭顺序口诀:先打开的后关闭,后打开的先关闭。
4)文件夹拷贝
package b_IOByte;
import java.io.File;
import java.io.FileDescriptor;
import java.io.IOException;
/**
* 文件夹的拷贝
* 1.是文件直接复制粘贴 copyFile
* 2.是文件夹直接创建 mkdir()
* 3.递归查找子孙集
* @author john
*
*/
public class Demo4 {
public static void main(String[] args){
String srcPath="G:/iotest/IOByte/a.txt";
String destPath="G:/iotest/IOByte/demo4";
copyDir(srcPath, destPath);
}
/**
* 拷贝文件夹
* @param src 源路径
* @param dest 目标路径
*/
//这一步目的:复制原文件夹的名称(根目录)到指定位置
public static void copyDir(String srcPath,String destPath){
copyDir(new File(srcPath),new File(destPath));
}
public static void copyDir(File src,File dest){
if(src.isDirectory()){
dest=new File(dest,src.getName()); //到指定目录下创建源文件夹名称及目录
}
copyDirDetail(src,dest);
}
public static void copyDirDetail(File src,File dest){
if(src.isFile()){
try {
Copy.copyFile(src, dest);
} catch (IOException e) {
e.printStackTrace();
}
}else if(src.isDirectory()){
//确保目标文件夹存在
dest.mkdirs();
//获取下一级目录|文件
for(File sub:src.listFiles()){
copyDir(sub,new File(dest,sub.getName()));
}
}
}
}
重点说明:
1.此代码健壮性比较好,在拷贝文件的时候也可以实现。
(二)文件字符输入输出流 (内容:输入流,输出流,纯文本文件拷贝)
说明:遇上面字节流操作方式近似相同
1)输入流
package c_IOChar;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
/**
* 字符输入流
* 纯文本读取
* @author john
*
*/
public class Demo1 {
public static void main(String[] args){
//创建源
File src=new File("G:/iotest/IOChar/b.txt");
//选择流
Reader reader=null;
try {
reader=new FileReader(src);
//读取操作
char[] flush=new char[10];
int len=0;
try {
while(-1!=(len=reader.read(flush))){
//字符数组转字符串
String str=new String(flush,0,len);
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("文件不存在");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("源文件不存在");
}finally{
if(null!=reader){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
2)输出流
package c_IOChar;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
/**
* 文件的写出
* @author john
*
*/
public class Demo2 {
public static void main(String[] args){
//创建源
File dest=new File("G:/iotest/IOChar/bb.txt");
//选择流
Writer wr=null;
try {
//FileWriter默认为覆盖,添加的话用true
wr=new FileWriter(dest);
//写出
String msg="锄禾日当午";
wr.write(msg);
wr.append("我爱你");
wr.flush();
} catch (Exception e) {
}finally{
if(null!=wr){
try {
wr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
3)纯文本拷贝
package c_IOChar;
/**
* 纯文本文件拷贝
* 1.建立联系 File对象 的源头 和 目的地
* 2.选择流 文件输入流Reader(接口) FileReader(实现类)
* 文件输出流Writer(接口) FileWrite(实现类)
*/
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
public class CopyFile {
public static void main(String[] args){
//创建源
File src=new File("G:/iotest/IOChar/b.txt");
File dest=new File("G:/iotest/IOChar/bb.txt");
//选择流
Reader reader=null;
Writer wr=null;
try {
reader=new FileReader(src);
wr=new FileWriter(dest);
} catch (IOException e) {
e.printStackTrace();
}
//读取操作
char[] flush=new char[10];
int len=0;
try {
while(-1!=(len=reader.read(flush))){
wr.write(flush,0,len);
}
wr.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭流
try {
reader.close();
wr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}