File类:
package com.ztb.entity;
import java.io.*;
public class FileOutPutStreamTest {
public static void main(String[] args) {
try(
FileInputStream fils=new FileInputStream("File.txt");//创建一个字节输入流,输入源为File.txt文件
FileOutputStream fos=new FileOutputStream("objects.txt")) {//创建字节输出流,输出源为(objects.txt文件)
byte[] b = new byte[32];
int hashRead = 0;
while ((hashRead = fils.read(b)) > 0) {//循环从流中拿数据32个字节
fos.write(b, 0, hashRead);//每读取一次,即写入文件输出流,读多少写多少
}
}catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
//注意:这里源文件都是在根目录下真实存在的,否则会报ioexception错误。目标文件可以不存在,会自动在项目的根目录下创建
java中的IO流分类
1,字节缓冲流(高效流)
1).BufferedInputStream:字节缓冲输入流,提高了读取效率。
InputStream in = new FileInputStream("test.txt");
// 字节缓存流
BufferedInputStream bis = new BufferedInputStream(in);
byte[] bs = new byte[20];
int len = 0;
while ((len = bis.read(bs)) != -1) {
System.out.print(new String(bs, 0, len));
// ABCD
// hello
}
// 关闭流
bis.close();
2).BufferedOutputStream:字节缓冲输出流,提高了写出效率。
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.txt", true));
// 输出换行符
bos.write("\r\n".getBytes());
// 输出内容
bos.write("Hello Android".getBytes());
// 刷新此缓冲的输出流
bos.flush();
// 关闭流
bos.close();
read()这个方法完成的事情就是从数据源中读取8个二进制位,并将这8个0或1转换成十进制的整数,然后将其返回(1字符=2字符=2*8个二进制位)
2.字节文件操作流
1).FileInputStream:字节文件输入流,从文件系统中的某个文件中获得输入字节,用于读取诸如图像数据之类的原始字节流。
// 读取f盘下该文件f://hell/test.txt
//构造方法1
InputStream inputStream = new FileInputStream(new File("f://hello//test.txt"));
int i = 0;
//一次读取一个字节
while ((i = inputStream.read()) != -1) {
// System.out.print(i + " ");// 65 66 67 68
//为什么会输出65 66 67 68?因为字符在底层存储的时候就是存储的数值。即字符对应的ASCII码。
System.out.print((char) i + " ");// A B C D
}
//关闭IO流
inputStream.close();
// 读取f盘下该文件f://hell/test.txt
//构造方法2
InputStream inputStream2 = new FileInputStream("f://hello/test.txt");
// 字节数组
byte[] b = new byte[2];
int i2 = 0;
// 一次读取一个字节数组
while ((i2 = inputStream2.read(b)) != -1) {
System.out.print(new String(b, 0, i2) + " ");// AB CD
}
//关闭IO流
inputStream2.close();
注: 一次读取一个字节数组,提高了操作效率,IO流使用完毕一定要关闭
2).FileOutputStream:字节文件输出流是用于将数据写入到File,从程序中写入到其他位置。
OutputStream outputStream = new FileOutputStream(new File("test.txt"));
// 写出数据
outputStream.write("ABCD".getBytes());
// 关闭IO流
outputStream.close();
// 内容追加写入
OutputStream outputStream2 = new FileOutputStream("test.txt", true);
// 输出换行符
outputStream2.write("\r\n".getBytes());
// 输出追加内容
outputStream2.write("hello".getBytes());
// 关闭IO流
outputStream2.close();
注;输出的目的地文件不存在,则会自动创建,不指定盘符的话,默认创建在项目目录下;输出换行符时一定要写\r\n不能只写\n,因为不同文本编辑器对换行符的识别存在差异性。
(1).字符转换流
1).InputStreamReader
//使用默认编码
InputStreamReader reader = new InputStreamReader(new FileInputStream("test.txt"));
int len;
while ((len = reader.read()) != -1) {
System.out.print((char) len);//
}
reader.close();
//指定编码
InputStreamReader reader = new InputStreamReader(new FileInputStream("test.txt"),"utf-8");
int len;
while ((len = reader.read()) != -1) {
System.out.print((char) len);//????????Android
}
reader.close();
2).OutputStreamWriter
(3).字符缓冲流(高效流)
1)BufferedReader:字符缓冲流,从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取.
//生成字符缓冲流对象
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt")));
String str;
//一次性读取一行
while ((str = reader.readLine()) != null) {
System.out.println(str);// 爱生活,爱Android
}
//关闭流
reader.close();
2).BufferedWriter :字符缓冲流,将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
(4).FileReader、FileWriter.
5.高效流效率比对
FileInputStream inputStream = new FileInputStream("E:\\PR\\剪辑成品\\LX.mp4");
FileOutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4");
int len;
/ / 开始时间
long begin = System.currentTimeMillis();
// 一次读取一个字节
while ((len = inputStream.read()) != -1) {
outputStream.write(len);
}
//这里有两点需要注意:一是这个方法的返回值是int类型;二是在这个方法每次从数据源中读取一个byte并返回。
// 很多初次接触Java的读者在看到这里时都会产生下面的疑问,就是这个方法读取的byte是如何以int的形式返回的。
// 用时毫秒
System.out.println(System.currentTimeMillis() - begin);// 耗费时间223195
/ /关闭流释放资源
inputStream.close();
outputStream.close();
方法二:用字节输入流,一次读取一个字节数组的数据
/**
* 一次读取一个字节数组,还是使用字节输入输出流
*/
FileInputStream inputStream = new FileInputStream("E:\\PR\\剪辑成品\\LX.mp4");
FileOutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4");
int len;
byte[] bs = new byte[1024];
// 开始时间
long begin = System.currentTimeMillis();
// 一次读取一个字节数组
while ((len = inputStream.read(bs)) != -1) {
outputStream.write(bs, 0, len);
}
// 用时毫秒
System.out.println(System.currentTimeMillis() - begin);// 75秒就够
inputStream.close();
outputStream.close();
方法三:使用字 符缓冲流,从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
FileInputStream inputStream = new FileInputStream("E:\\PR\\剪辑成品\\LX.mp4");
BufferedInputStream bis = new BufferedInputStream(inputStream);
FileOutputStream outputStream = new FileOutputStream("HEEL_FLIP1.mp4");
BufferedOutputStream bos = new BufferedOutputStream(outputStream);
int len;
byte[] bs = new byte[1024];
// 开始时间
long begin = System.currentTimeMillis();
while ((len = bis.read(bs)) != -1) {
bos.write(bs, 0, len);
}
// 用时毫秒
System.out.println(System.currentTimeMillis() - begin);// 16秒就够
bis.close();
bos.close();
得出结论: 高效缓冲流读写速度效率更高。