1.文件字符流拷贝

package ``task17``;<br />``import ``java.io.FileReader``;<br />``import ``java.io.FileWriter``;<br />``import ``java.io.IOException``;<br />``public class ``FileCopyTest {

``public static void ``main``(String[] args) {

FileReader fr = ``null;<br />`` ``FileWriter fw = ``null;<br />`` try ``{
fr = ``new ``FileReader(``"d:/Java.txt"``)``;<br />`` ``fw = ``new ``FileWriter(``"d:/Java01.txt"``)``;<br />`` ``System.``_out_``.println(``"``努力加载中!!!``"``)``;<br />`` int ``res = ``0``;<br />`` while ``((res = fr.read()) != -``1``){
fw.write(res)``;<br />`` ``}
} ``catch ``(IOException e) {
e.printStackTrace()``;<br />`` ``} ``finally ``{

``if ``(``null ``!= fw) {
``try ``{
fw.close()``;<br />`` ``} ``catch ``(IOException e) {
e.printStackTrace()``;<br />`` ``}
}
``if ``(``null ``!= fr) {
``try ``{
fr.close()``;<br />`` ``} ``catch ``(IOException e) {
e.printStackTrace()``;<br />`` ``}
}
}

}
}

2.文件字节流的拷贝

17.4.3 FileOutputStream类(重点)

(1)基本概念

java.io.FileOutputStream类主要用于将图像数据之类的原始字节流写入到输出流中。

(2)常用的方法

**方法声明 功能介绍**
FileOutputStream(String name)
根据参数指定的文件名来构造对象
FileOutputStream(String name,
boolean append)
以追加的方式根据参数指定的文件名来构造对象
void write(int b)
将指定字节写入此文件输出流
void write(byte[] b, int offff, int len)
将指定字节数组中从偏移量``offff``开始的``len``个字节写入
此文件输出流
void write(byte[] b)
将`` b.length ``个字节从指定字节数组写入此文件输出
流中
void flflush()
刷新此输出流并强制写出任何缓冲的输出字节
void close()
关闭流对象并释放有关的资源

17.4.4 FileInputStream类(重点)

(1)基本概念

java.io.FileInputStream类主要用于从输入流中以字节流的方式读取图像数据等。

(2)常用的方法

方法声明 功能介绍
FileInputStream(Stringname)
根据参数指定的文件路径名来构造对象
int read()
从输入流中读取单个字节的数据并返回,返回``-1``表示读取到末尾
int read(byte[] b, int
offff, int len)
从此输入流中将最多``len``个字节的数据读入字节数组中,返回读取到的
字节个数,返回``-1``表示读取到末尾
int read(byte[] b)
从此输入流中将最多`` b.length ``个字节的数据读入字节数组中,返回读
取到的字节个数,返回``-1``表示读取到末尾
void close()
关闭流对象并释放有关的资源
int available()
获取输入流所关联文件的大小

读取图像数据和视频数据的案例代码

package com.lagou.task17;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileByteCopyTest {
public static void main(String[] args) {
// 获取当前系统时间距离1970年1月1日0时0分0秒的毫秒数
long g1 = System.currentTimeMillis();
FileInputStream fis = null;
FileOutputStream fos = null;
try {
// 1.创建FileInputStream类型的对象与d:/03 IO流的框架图.png文件关联
//fis = new FileInputStream("d:/03 IO流的框架图.png");
fis = new FileInputStream("d:/02_IO流的框架结构.mp4");
// 2.创建FileOutputStream类型的对象与d:/IO流的框架图.png文件关联
//fos = new FileOutputStream("d:/IO流的框架图.png");
fos = new FileOutputStream("d:/IO流的框架结构.mp4");
// 3.不断地从输入流中读取数据内容并写入到输出流中
System.out.println("正在玩命地拷贝...");
// 方式一:以单个字节为单位进行拷贝,也就是每次读取一个字节后再写入一个字节
// 缺点:文件稍大时,拷贝的效率很低
/*int res = 0;
while ((res = fis.read()) != -1) {
fos.write(res);
}*/
// 方式二:准备一个和文件大小一样的缓冲区,一次性将文件中的所有内容取出到缓冲区然后一次性写入进去
// 缺点:若文件过大时,无法申请和文件大小一样的缓冲区,真实物理内存不足
/*int len = fis.available();
System.out.println("获取到的文件大小是:" + len);
byte[] bArr = new byte[len];
int res = fis.read(bArr);
System.out.println("实际读取到的文件大小是:" + res);
fos.write(bArr);*/
// 方式三:准备一个相对适当的缓冲区,分多次将文件拷贝完成
byte[] bArr = new byte[1024];
int res = 0;
while ((res = fis.read(bArr)) != -1) {
fos.write(bArr, 0, res);
}
System.out.println("拷贝文件成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
// 4.关闭流对象并释放有关的资源
if (null != fos) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != fis) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
long g2 = System.currentTimeMillis();
System.out.println("使用文件流拷贝视频文件消耗的时间为:" + (g2-g1)); // 165
}
}

视频拷贝的三种方式分析

//``拷贝视频数据<br />``fis= ``new ``FileInputStream(``"d:/01``:什么是淘宝无货源电商``.mp4"``)``;<br />``fos = ``new ``FileOutputStream(``"d:/02``:什么是淘宝无货源电商``.mp4"``)``;<br />``System.``_out_``.println(``"``努力加载中!!!``"``)``;

// 方式一:以单个字节为单位进行拷贝,也就是每次读取一个字节后再写入一个字节
// 缺点:文件稍大时,拷贝的效率很低``<br />``/*int res = 0;<br />``while ((res = fis.read()) != -1) {<br />`` fos.write(res);<br />``}*/<br />`` // 方式二:准备一个和文件大小一样的缓冲区,一次性将文件中的所有内容取出到缓冲区然后一次性写入进去
// 缺点:若文件过大时,无法申请和文件大小一样的缓冲区,真实物理内存不足
/*<br />``int len = fis.available();<br />``System.out.println("``文件大小是:`` "+len);<br />``byte[] barr = new byte[len];<br />``int res = fis.read(barr);<br />``System.out.println("``实际读取到的文件大小是`` "+res);<br />``*/<br />``//``方式三:准备一个相对合理的缓冲区,分批次将文件拷贝完成。<br />``// ``合理缓冲区也就是
byte ``[] barr = ``new byte``[``1024``]``;<br />``int ``res = ``0``;<br />``while ``((res = fis.read(barr)) != -``1``){
fos.write(barr``,``0``,``res)``;<br />``}
System.``_out_``.println(``"``拷贝成功!``"``)``;
``