1.文件缓冲输入输出流
BufferedInputStream BufferedOutputStream
方法:int available();返回当前缓冲区的字节数
close();关闭流
read();读取一个字节read(byte[ ] b);读取一个数组 read(byte[ ] b,int start,int length);读取数组b
中start开始长度为length的字节.
构造方法可以传一个InputStream 或InputStream和一个int 大小的内部缓冲区数组
BufferedOutputStream中提供flush()方法,刷新缓冲区的输出流,因为写入速度没有读取那么
快,flush方法可避免数据丢失
package 缓冲流;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
*
* @author hb
*
*/
public class FileIo {
/**
* 输入流 InputStream 字节
* 输出流 OutputStream 字节
*/
public static void main(String[] args) {
String Path = "D:\\360Downloads\\Software\\一键GHOST_2013.exe";
String Path1 = "d:\\2.txt";
File f= new File(Path);
File f1= new File(Path1);
long t1=System.currentTimeMillis(); //测试复制时间
byte b[]=reader(f);
writter(f1,b);
long t2=System.currentTimeMillis();
System.out.println(t2-t1);
}
public static byte[] reader(File f){
try {
FileInputStream fis = new FileInputStream(f);
BufferedInputStream bis = new BufferedInputStream(fis,100);//默认为8192
int len = bis.available();
byte [] bs=new byte[len];
bis.read(bs);
fis.close();
return bs;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static void writter(File f,byte bs[]){
try {
FileOutputStream fos = new FileOutputStream(f);
BufferedOutputStream bos = new BufferedOutputStream(fos,100);
fos.write(bs);
bos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
一个方法中实现复制
package 缓冲流;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 缓冲流的复制
* @author hb
*
*/
public class CopyOnBuffered {
public static void main(String[] args) {
String Path = "D:\\360Downloads\\Software\\一键GHOST_2013.exe";
String Path1 = "e:\\2.txt";
File f= new File(Path);
File f1= new File(Path1);
long t1=System.currentTimeMillis();
try {
FileInputStream fis = new FileInputStream(f);
FileOutputStream fos = new FileOutputStream(f1);
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
//**********读一个字节写一个字节。运行效率很低
// int t = bis.read();
// int len = bis.available();
// while(len>0){
// bos.write(t);
// t= bis.read();
// len=bis.available();
// }
int t=bis.read();//**********读到缓冲区再写到缓冲区,再写到流,和一个一个字节读有差别。
while(t!=-1){
bos.write(t);
t=bis.read();
}
bos.flush();
fos.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
long t2=System.currentTimeMillis();
System.out.println(t2-t1);
}
}
2.文件输入输出字符流
InputStreamReader OutputStreamWriter
方法:read();都很类似,读取一个字符并返回int,没有了返回-1;
ready()返回Boolean判断是否已经准备好了读取
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/**
* 复制String文件
* @author hb
*
*/
public class Copy {
public static void main(String[] args) {
File f=new File("D:\\新建文本文档.txt");
File f1=new File("d:\\c2.txt");
long t1=System.currentTimeMillis();
CopyStr(f,f1);
long t2=System.currentTimeMillis();
System.out.println(t2-t1);
}
/**复制方法
*
* @param f 源文件
* @param f1 目标文件
*/
public static void CopyStr(File f,File f1){
try {
FileInputStream fis =new FileInputStream(f);
FileOutputStream fos =new FileOutputStream(f1);
InputStreamReader isr =new InputStreamReader(fis);//字符流
OutputStreamWriter osr =new OutputStreamWriter(fos);//字符流
int t = isr.read();//没有了会返回一个-1
while(t!=-1){
osr.write(t);//读了就写单个字符
t=isr.read();
}
osr.flush();
fos.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.基本数据类型的输入输出流
DataInputStream DataOutputStream
读的顺序和写的顺序必须相同.
方法:writerBoolean(Boolean v);writeByte(int v);writeBytes(String s);writeChar(int v);
writeChars(String s);witerInt(int v);……
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class 基本数据类型的输出 {
public static void main(String[] args) {
File f=new File("e:\\aaa.txt");
writeF(f);
readF(f);
}
public static void writeF(File f){
try {
FileOutputStream fos =new FileOutputStream(f);
DataOutputStream dos = new DataOutputStream(fos);
dos.write(1);//1个字节
dos.writeInt(100);//4个字节
dos.writeBoolean(true);//1个字节
dos.writeChar('a');//2个字节
dos.writeFloat(10.0f);//4个字节
dos.writeChars("中");//4个字节 每个char都是2个字节
dos.writeBytes("ssss");//4个字节
dos.flush();
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void readF(File f){
try {
FileInputStream fis =new FileInputStream(f);
DataInputStream dis = new DataInputStream(fis);
byte i=dis.readByte();//1个字节
int j=dis.readInt();//4个字节
boolean s=dis.readBoolean();//1个字节
char c=dis.readChar();//2个字节
float fa= dis.readFloat();
String s1=dis.readLine();//该方法读字符串只能读英文字符。
System.out.println(i+" "+j+" "+" "+fa+" "+s+" "+c+" "+s1);
dis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//输出结果:1 100 10.0 true a N-ssss
问题:中文无法正常显示
解决方法
dos.writeUTF(stu.name);
stu.name=dis.readUTF();
示例程序
Student.java
package v120140526;
import java.io.File;
public class Student {
char sex;
byte age;
String name;
int num;
public static void main(String[] args) {
Student stu=new Student();
File f=new File("D:\\save.txt");
stu.sex='b';
stu.age=18;
stu.num=20124585;
stu.name="黄斌";
Save.writeF(f, stu);
Save.readF(f, stu);
}
}
Save.java
package v120140526;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Save {
public static void writeF(File f,Student stu){
try {
FileOutputStream fos =new FileOutputStream(f);
DataOutputStream dos = new DataOutputStream(fos);
dos.write(stu.age);
dos.writeInt(stu.num);
dos.writeChar(stu.sex);
dos.writeUTF(stu.name);
dos.flush();
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void readF(File f,Student stu){
try {
FileInputStream fis =new FileInputStream(f);
DataInputStream dis = new DataInputStream(fis);
stu.age=dis.readByte();//1个字节
stu.num=dis.readInt();//4个字节
stu.sex=dis.readChar();//2个字节
stu.name=dis.readUTF();
System.out.println("年龄"+stu.age+" 学号"+stu.num+" 性别"+stu.sex+" 姓名"+stu.name);
dis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果:
年龄18 学号20124585 性别b 姓名黄斌