黑马程序员-----IO流

 ------- android培训java培训、期待与您交流! ----------

IO流: 用来对本地文件或网络中的资源进行读与写数据的技术
 ·  I: Input 输入(从文件中读取数据)
O: Output 输出(把数据写到文件中)

IO流的分类:
流的方向划分:输入流,输出流
  流中的数据划分:字节流,字符流

IO流的划分
  字节流:
  字节输入流: InputStream, 字节输入流的所有类的超类,  抽象类
|- FileInputStream : 操作文件的字节输入流
|- FilterInputStream
|- BufferedInputStream : 高效的字节输入流

字节输出流: OutputStream, 字节输出流的所有类的超类, 抽象类
|- FileOutputStream: 操作文件的字节输出流
|- FilterOutputStream
|- BufferedOutputStream : 高效的字节输出流

  字符流:
  字符输入流: Reader
  |- 转换流  InputStreamReader
   |- FileReader 操作文件的字符输入流便捷类
   |-BufferedReader   高效流
  字符输出流: Writer
  |- 转换流 OutputStreamWriter
   |- FileWriter 操作文件的字符输出流便捷类

|-BufferedWriter     高效流

IO流中操作文件的步骤:
1,数据源
2,目的地
3,读数据
4,写数据
5,关闭流

写数据到文件的步骤:
1,打开文件
2,写数据
3,关闭文件
从文件中读数据的步骤:
1,打开文件
2,读数据
3,关闭文件

 从文件中读取数据的两种方式


方式1: 一次读取一个字节

关键代码:
InputStream is = new FileInputStream("fos.txt");
int ch = -1;
while ( (ch = is.read()) != -1 ){
//写数据
}

方式2: 一个读取一个字节数组
关键代码:
InputStream is = new FileInputStream("fos.txt");
byte[] buffer = new byte[1024];//存储每次从文件中的读取到的新字节
int len = -1;// 记录每次从文件中读取新字节的个数
while ( (len = is.read(buffer)) != -1) {
//写数据
}

转换流

OutputStreamWriter 字符输出流--写数据

InputStreamReader 字符输入流-- 读数据

文件: File
方法:
public boolean mkdir() 创建文件夹
public boolean mkdirs() 创建多层文件夹
public boolean createNewFile() 创建文件
public boolean isFile() 判断是否是文件
public boolean isDirectory() 判断是否为文件夹
public long length() 返回文件的长度
public String getAbsolutePath() 返回文件的绝对路径
public String getName() 返回文件的名称(包含后缀名)
public File[] listFiles() 返回当前目录下所有的File对象
public File[] listFiles( FilenameFilter filter) 返回当前目录下满足条件的File对象

开启流的自动刷新
PrintWriter( OutputStream os, boolean autoFlush)
PrintWriter( Writer w, boolean autoFlush)

开启流的数据自动追加
FileOutputStream( String namePath, boolean append )
FileOutputStream( File file, boolean append )
FileWriter( String namePath, boolean append )
FileWriter( File file, boolean append )

代码


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/*
 * 案例: 复制文件夹(包含子文件夹)
 * 
 * 需求: 将 E:\resource文件夹 复制到 项目根目录的YesDir文件夹中
 * 
 * 分析:
 * 	1,指定数据源   E:\resource
 * 	2,指定目的地    YesDir
 * 	3,复制文件夹
 * 		a, 创建目的地文件夹
 * 		b, 获取到数据源中每一个File对象
 * 		c, 判断当前File是否为 文件夹
 * 			是: 文件夹
 * 				递归,完成子文件夹的复制
 * 			否: 文件
 * 				完成文件复制
 * 		
 */
public class CopyDirectorys {
	public static void main(String[] args) throws IOException {
		//1,指定数据源   E:\resource
		File srcPath = new File("E:\\resource");
		//2,指定目的地    YesDir
		File destPath = new File("YesDir");
		//3,复制文件夹
		copyDirectorys(srcPath, destPath);
	}

	//复制文件夹
	private static void copyDirectorys(File srcPath, File destPath) throws IOException {
		//a, 创建目的地文件夹
		destPath.mkdir();
		//b, 获取到数据源中每一个File对象
		File[] files = srcPath.listFiles();
		for (File file : files) {
			//c, 判断当前File是否为 文件夹
			if (file.isDirectory()) {
				//file = E:\resource\各种专治   ---  数据源
				//dest = YesDir\各种专治  --- 目的地
				//是: 文件夹,  递归,完成子文件夹的复制
				File dest = new File(destPath, file.getName());
				copyDirectorys(file, dest);
				
			} else {
				//file = E:\resource\Demo.java
				//dest = YesDir\Demo.java
				//否: 文件,   完成文件复制
				File dest = new File(destPath, file.getName());
				copyFile(file, dest);
				
			}
		}
	}

	//复制文件
	private static void copyFile(File file, File dest) throws IOException {
		//数据源
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
		//目的地
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest));
		//读数据
		byte[] buffer= new byte[1024];
		int len = -1;
		while ((len = bis.read(buffer)) != -1) {
			//写数据
			bos.write(buffer, 0, len);
		}
		//关闭流
		bos.close();
		bis.close();
	}
}

总结

IO流操作的时候要注意字符编码相同,否则会出现乱码现象

      java中只支持字节流与字符流数据的传输,而我们想 传输 java基本数据类型的数据

      使用数据输入输出流,将基本的字节流进行包装,然后就可以实现传输java基本数据类型的数据了

字符流使用了字节流读到一个或多个字节(一个

中文对应的字节数是两个,在

UTF-8

码表中是

3

个字节)时,先去查指定的编码表

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值