您的位置:首页 > 职场人生

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

2015-06-08 20:03 477 查看
——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 毫秒

当使用字节流时,优先考虑使用带缓冲区的类,要自己定义一个大些的数组,用于辅助缓冲;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: