黑马程序员——Java基础---I/O流(中[字节流])

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
案例引入
批量修改文件名称的案例:
修改20150331/day18目录下的所有avi文件,将所有avi文件移动到
day18下的avi目录下,并判断原文件中的文件名,如果带有”集合框架”字样的,
将”集合框架”四个字去掉;
思路:
1.利用File类renameTo()方法,将文件重命名到不同目录,相当于”剪切”操作;
步骤:
1.封装一个原文件的根目录的File:20150331/day18
2.封装一个目标文件目录:20150331/day18/avi
3.将day18目录下的所有文件及目录取出,并遍历。File–>listFiles()方法;
4.取出每个File对象,要判断是否是文件:
是:判断是否以.avi结尾
是:将此文件重命名到avi目录下,并且将原文件名中”集合框架”字样去掉;
否:继续下一次循环;
否:继续下一次循环;
递归
图解:
这里写图片描述
1.方法可可以调用方法本身,这种调用就是:方法的递归调用;
注意事项:
1.要有出口,否则就是死递归;
2.次数不能太多,否则就内存溢出
3.构造方法不能递归使用:
递归注意实现
要有出口,否则就是死递归
次数不能太多,否则就内存溢出
构造方法不能递归使用
递归求阶乘:
例如:求5的阶乘:5的阶乘表示为:5!
5 * 4 * 3 * 2 * 1
方式一:使用循环:
方式二:使用递归:
思路:将问题分解:
5!
=5 * 4!
= 4 * 3!
=3 * 2!
=2 * 1!
=1 * 1
递归的实现
递归输出指定目录下所有的java文件的绝对路径案例
1.由于我们要列出目录下(包含子目录)的所有java文件,但我们不知道目录到底有多深,
所以,我们使用递归;
步骤:
1.使用File封装初始目录;
2.获取目录下所有的文件及目录;
3.遍历File数组,获取每个File对象;
判断是否是文件:
是:是否以.java结尾,是,输出;
否:是目录。回到步骤2;
递归出所有文件
递归删除带内容的目录:
1.删除目录使用File–>delete()方法,此方法如果删除的是一个目录,
而且此目录下有其它文件或目录,delete()方法将不会执行删除;
2.所以,我们要使用递归遍历每个目录下的所有文件,并将文件删除,然后再将此目录删除
注意:大家做练习时,一定要这个备份目录测试;
字节流的抽象基类:
InputStream ,OutputStream。
字符流的抽象基类:
Reader , Writer。
注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
如:InputStream的子类FileInputStream。
如:Reader的子类FileReader。
FileOutputStream类
构造方法:
FileOutputStream(File file):创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(String filePath):创建一个向具有指定名称的文件中写入数据的输出文件流。
以上两个构造方法都抛出一个异常:
FileNotFoundException:如果文件存在,但它是一个目录,而不是一个常规文件;或者该文件不存在,但无法创建它;抑或因为其他某些原因而无法打开它
写数据的方法:
public void write(int b)
public void write(byte[] b)(重点掌握)
public void write(byte[] b,int off,int len)(重点掌握)
public void close():关闭此输出流并释放与此流有关的所有系统资源。
1.Window下:\r\n
2.Linux下:\r
3.Mac下:\n
追加写入:使用FileOutputStream的另外两个构造方法:
1.FileOutputStream(File file, boolean append) :创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
append - 如果为 true,则将字节写入文件末尾处,而不是写入文件开始处
2.public FileOutputStream(String name,boolean append):创建一个向具有指定 name 的文件中写入数据的输出文件流。
append - 如果为 true,则将字节写入文件末尾处,而不是写入文件开始处
FileOutputStream的异常处理:
异常处理
FileInputStream类
使用java.io.FileInputStream读取数据:
构造方法:
注意:以下两个构造方法要求文件必须存在,否则会抛出:FileNotFoundException
FileInputStream(File file) :通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream(String name) :通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
成员方法:
public int read():一次读取一个字节
public int read(byte[] b):一次读取一个字节数组;
图解:
这里写图片描述
使用字节流复制文本文件:
思路:
1.需要读取数据:FileInputStream
2.需要写出数据:FileOutputStream
3.一次读取一个字节,一次写入一个字节;
关于字节流读写中文:
1.写入时:使用FileOutputStream类的writer(byte[] byteArray):
之前将字符串获取byte数组:”你”.getBytes()使用了平台默认的编码信息;(GBK)
2.读取时:如果需要显示,不能一次读取一个字节。
要一次读取一个自己数组,然后将字节数组转换为String,转换时,可以提供编码信息;
字节流复制图片:(一次一个字节)
import java.io.FileInputStream;
public class Demo {
public static void main(String[] args) {
try {
FileInputStream in = new FileInputStream(“D:\aaa\cxy.bmp”);
FileOutputStream out = new FileOutputStream(“cxy_copy.bmp”);
int n = 0;
while((n = in.read()) != -1){
out.write(n);
}
in.close();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(“复制完毕!”);
}
}
FileInputStream一次读取一个字节数组:
int read(byte[] b):从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
返回值:读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。
带缓冲的字节流:
1.输出流:BufferedOutputStream:
2.输入流:BufferedInputStream:
这两个类本身只提供了”缓冲区”的功能,读取和写入文件仍然使用OutputStream及InputStream
成员方法:
public void flush():刷新缓冲区;
public void close():关闭流之前,会自动调用flush();
读取方式:
1.一次读取一个字节:
2.一次读取一个字节数组:
四个类的效率
复制视频:
1.FileInputStream
FileOutputStream:一次读取一个字节:method1():60489 毫秒
2.FileInputStresam
FileOutputStream:一次读取一个字节数组:method2():122毫秒
3.BufferedInputStream
BufferedOutputStream:一次读取一个字节::method3():1003 毫秒
4.BufferedOutputStream
BufferedInputStream:一次读取一个字节数组::method4():69 毫秒
当使用字节流时,优先考虑使用带缓冲区的类,要自己定义一个大些的数组,用于辅助缓冲;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值