字节流和字符流常用代码

本文详细介绍了文件字节输入输出流、字符输入输出流的概念与使用方法,包括文件拷贝、文件夹拷贝等操作,重点讲解了读写流程、异常处理及资源释放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(一)文件字节输入输出流    (内容:文件输入流,文件输出流,文件拷贝,文件夹拷贝)

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();
				}
			}
		}
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值