FileInputStream与FileOutputStream用于对字节进行输入输出,对于纯文本文件的读取会有字符乱码的
JAVA中的IO流的那些事----缓冲流/处理流
FileInputStream
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("D:Test.txt");
FileInputStream is = new FileInputStream(file);
//byte v[] = new byte[3];
int n = is.read();
while (n != -1) {
System.out.print((char) n);
n = is.read();
}
is.close();
}
}
字节流适合读取非文本文件(比如图片、视频、音频等)----本例一图片为例:
package HuiXin;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("D:\\117357.jpg");
FileInputStream is = new FileInputStream(file);
//byte v[] = new byte[3];
int n = is.read();
while (n != -1) {
System.out.print( n);
n = is.read();
}
is.close();
}
}
FileOutputStream
接下来完成文件的复制—
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("D:\\117357.jpg");
FileInputStream is = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream("D:\\宝宝.jpg");
long start = System.currentTimeMillis();
int n = is.read();
while (n != -1) {
fos.write(n);
n = is.read();
}
long end = System.currentTimeMillis();
System.out.println(end - start);
fos.close();
is.close();
}
}
复制时间对比
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("D:\\117357.jpg");
FileInputStream is = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream("D:\\宝宝.jpg");
long start = System.currentTimeMillis();
byte b[]=new byte[100];//缓冲
int n = is.read(b);
while (n != -1) {
fos.write(b,0,n);
n = is.read(b);
}
long end = System.currentTimeMillis();
System.out.println(end - start);
fos.close();
is.close();
}
}
所以最好用缓冲数组来读取,时间快;
read()方法
read(byte []b,int off,int len)----表示从输入流当中最多将 len 个字节的数据读取到一个 byte
数组当中
BufferedInputStream 与BufferedOutputStream
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("D:\\117357.jpg");
FileInputStream is = new FileInputStream(file);
byte b[]= new byte[1024*1000];
BufferedInputStream bis= new BufferedInputStream(is);//字节缓冲输入流
File file1= new File("D:\\亲爱的祖国.jpg");
FileOutputStream fis= new FileOutputStream(file1);
BufferedOutputStream bos= new BufferedOutputStream(fis);//字节缓冲输出流
int len = bis.read(b);
while (len!=-1){
//System.out.println(len);
bos.write(b,0,len);
len=bis.read(b);
}
bis.close();
bos.close();
}
}
BufferedReader 与BufferedWriter
再来,字符缓冲流
package HuiXin;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("E:\\since的用法归纳及例句.txt");
File file1= new File("D:/SINCE.txt");
FileReader fr= new FileReader(file);
FileWriter fw= new FileWriter(file1);
int len = fr.read();
long start = System.currentTimeMillis();
while(len!=-1){
fw.write(len);
len=fr.read();
}
long end = System.currentTimeMillis();
System.out.println(end-start);
fw.close();
fr.close();
}
}
用时—
package HuiXin;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("E:\\since的用法归纳及例句.txt");
File file1= new File("D:/SINCE.txt");
FileReader fr= new FileReader(file);
FileWriter fw= new FileWriter(file1);
char c[]= new char[1024];//设置缓冲数组--一次读取大小
int len = fr.read(c);
long start = System.currentTimeMillis();
while(len!=-1){
fw.write(c,0,len);
len=fr.read(c);
}
long end = System.currentTimeMillis();
System.out.println(end-start);
fw.close();
fr.close();
}
}
用时—
package HuiXin;
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("E:\\since的用法归纳及例句.txt");
File file1= new File("D:/SINCE.txt");
FileReader fr= new FileReader(file);
BufferedReader bfr= new BufferedReader(fr);//套起来
FileWriter fw= new FileWriter(file1);
BufferedWriter bfw= new BufferedWriter(fw);//套起来
int len = bfr.read();
long start = System.currentTimeMillis();
while(len!=-1){
bfw.write(len);
len=bfr.read();
}
long end = System.currentTimeMillis();
System.out.println(end-start);
fw.close();
fr.close();
}
}
用时—
在复制文件时的效率—
一般形况下,一个一个读的小于缓冲数组缓冲数组小于缓冲流、 设置缓冲的好处是减少硬盘的读取和写入次数;
当我们数组缓冲流设置过大时也可以减少时间但是比较占用内存空间;
来看一下源码