文件输入流FileInputStream具体实现了在文件上读取数据,文件输出流FileOutputStream实现了向文件中写出byte数据。
1.1 FileInputStreamin.read() 按单字节读取数据
in.read(byte[] buf,int start,int size) 从字节数组buf中start处开始读取数据,长度为size
1、单字节读取数据,并将结果输出到控制台上,每10个byte进行换行
实现步骤:
(1)将文件作为字节流进行读操作
(2)使用单字节进行循环读取,每10个字节进行换行操作
public static void printHex(String fileName) throws IOException{
FileInputStream in = new FileInputStream(fileName);
int b; //用于判断文件是否读到结尾处
int i = 1;//用于计数,每10个字节换行
while((b=in.read()) != -1){
if(b<0xf){ //单字节前面补0
System.out.print("0");
}
System.out.print(Integer.toHexString(b)+" ");
if(i++%10 == 0){
System.out.println();
}
}
in.close();
}
2、对上例进行批量读取,此方法适合大文件,效率高
public static void printHexByByte(String fileName)throws IOException{
FileInputStream in = new FileInputStream(fileName);
byte[] buf = new byte[20*1024];
//由于可能数组不够,也可能数组过大,下面的语句返回的是读到的字节个数,不会多读余下的空也不会超出
int bytes = in.read(buf,0,buf.length);//一次性读完
int j = 1;
for(int i=0;i<bytes;i++){
if(buf[i]<=0xf){
System.out.print("0");
}
System.out.print(Integer.toHexString(buf[i])+" ");
if(j++%10 == 0){
System.out.println();
}
}
in.close();
}
1.2 FileOutputStream
out.write(int b) 写出数据
out.write(byte[] buf,int start,int size) 从start处开始写出buf中的字节,长度为size
写出数据的示例代码如下所示:
public static void main(String[] args)throws IOException {
//如果文件不存在则直接创建,否则删除后创建
FileOutputStream out = new FileOutputStream("demo/out.dat");
//如果文件不存在则直接创建,否则在原文件后追加内容
//FileOutputStream out1 = new FileOutputStream("demo/out.dat",true);
int a = 10;
out.write(a>>>24);
out.write(a>>>16);
out.write(a>>>8);
out.write(a);
byte[] s = "中国".getBytes();
out.write(s);
out.close();
}
1.3 代码:文件复制功能的实现
实现步骤:
1、先对参数进行判断,源文件是否存在且是否是文件;
2、构造文件输入输出流
3、使用批量读取的形式对源文件进行读取,然后写入到目标文件中
public static void copyFile(File srcFile,File destFile) throws IOException{
if(!srcFile.exists()){
throw new IllegalArgumentException("文件"+srcFile+"不存在!");
}
if(!srcFile.isFile()){
throw new IllegalArgumentException(srcFile+"不是文件!");
}
FileInputStream in = new FileInputStream(srcFile);
FileOutputStream out = new FileOutputStream(destFile);
byte[] buf = new byte[8*1024];
int b;
while((b = in.read(buf,0,buf.length))!=-1){
out.write(buf, 0, b);
}
in.close();
out.close();
}
二、数据输入/输出流
数据输入/输出流(DataInputStream/DataOutputStream)是对“流”功能的扩展,可以更加方便的进行基础数据类型的读写操作。其主要方法及使用如下代码所示。
String file = "demo/dos.dat";
DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
dos.writeInt(-27);
dos.writeDouble(89.06);
dos.writeLong(2000l);
dos.writeUTF("中国");//以UTF-8编码格式写进文件
dos.writeChars("中国");//以utf-16be格式写进文件
dos.close();
DataInputStream dis = new DataInputStream(new FileInputStream(file));
int i = dis.readInt();
System.out.println(i);
double d = dis.readDouble();
System.out.println(d);
long l = dis.readLong();
System.out.println(l);
System.out.println(dis.readUTF());
System.out.println(dis.read());
dis.close();
三、字节缓冲流
字节缓冲流(BufferedInputStream/BufferedOutputStream)为IO提供了带缓冲区的操作,提高了IO性能。下面使用字节缓冲流进行文件拷贝操作,代码如下。此方法的效率没有批量读取的高,但比单字节读取更快。
public static void copyFileByBuffer(File srcFile,File destFile)throws IOException{
if(!srcFile.exists()){
throw new IllegalArgumentException("文件"+srcFile+"不存在!");
}
if(!srcFile.isFile()){
throw new IllegalArgumentException(srcFile+"不是文件!");
}
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
int c;
while((c=bis.read())!=-1){
bos.write(c);
bos.flush();//刷新缓冲区
}
bis.close();
bos.close();
}
注:文章根据本站相关课程的学习笔记整理而来,有错误或其他任何问题敬请指正,欢迎共同学习交流!