Java------字符流和字节流(II)

java字节流实现文件夹的拷贝:
package com.java.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**

  • java字节流实现文件夹的拷贝
  • 拷贝文件夹,其中文件夹中又有多个文件
  • 1.先遍历这个文件夹,判断是否是目录
  • 2.创建文件夹
  • 3.拷贝文件到新的地方
  • */
    public class FileDirectoryCopyDemo {
    //遍历文件夹
    public static void copy(File srcDir,File destDir){
    //遍历srcDir文件夹
    File[] list=srcDir.listFiles();
    for(File f:list){
    //先判断是否是目录,在目录文件夹里创建一个子目录
    if(f.isDirectory()){
    String name=f.getName(); //获取目录的名字
    //调用方法去目录文件夹里创建子目录
    File newDestDir=makeDir(destDir,name);
    //递归
    copy(f,newDestDir);
    }else{
    //如果不是目录,就拷贝文件
    File dest=new File(destDir,f.getName());
    fileCopy(f,dest);
    }
    }
    }
    public static File makeDir(File parent,String name){
    File f=new File(parent,name);
    f.mkdir();//创建文件夹
    return f;
    }
    //文件拷贝函数
    public static void fileCopy(File src,File dest){
    InputStream in=null; //输入流,负责读文件
    OutputStream out=null; //输出流,负责写入文件
    try{
    in=new FileInputStream(src);
    out=new FileOutputStream(dest);
    long start=System.currentTimeMillis();
    //定义缓冲区
    byte[] buffer=new byte[1024];
    int len=-1;

        while((len=in.read(buffer))!=-1)//说明还没有读到文件的结尾
        {
            out.write(buffer,0,len);   //输出流写入一个字节
        }
        long end=System.currentTimeMillis();
        //文件夹下有几个文件就耗时几次
        System.out.println("拷贝文件耗时:"+(end-start)+"毫秒");
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        try {
            in.close();
            out.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    }
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    //拷贝之前的原文件
    File src=new File(“D:”+File.separator+”haha”);
    //拷贝之后的文件
    File dest=new File(“F:”+File.separator+”haha”);
    if(!dest.exists()){
    dest.mkdir(); //创建文件夹
    }
    copy(src,dest);
    }
    }

缓冲区:内存里的一块区域,与用来存放临时数据
DataInputStream:可以读写java基本的数据类型
public static void main(String[] args) {
// TODO Auto-generated method stub
String name=”张三丰”;
int number=100;
double price=12.5;
boolean flag=true;
float f=78.34f;
char c=’a’;
//使用DataOutputStream 把以上变量保存到一个文件里去 d:\mydata.dat
File file=new File(“D:”+File.separator+”mydata.dat”);
//mydata.dat是二进制文件,不是文本文件
DataOutputStream dout=null;
DataInputStream din=null;
try{
if(!file.exists()){
file.createNewFile();
}
//把数据保存到文件里
dout=new DataOutputStream(new FileOutputStream(file));
dout.writeUTF(name);//写入一个字符串
dout.writeInt(number);
dout.writeChar(c);
dout.writeDouble(price);
dout.writeFloat(f);
dout.writeBoolean(flag);
//再使用DataInputStream,把文件的数据读取出来
din=new DataInputStream(new FileInputStream(file));
//读的次序要和写的次序一致
System.out.println(din.readUTF()); //读出
System.out.println(din.readInt());
System.out.println(din.readChar());
System.out.println(din.readDouble());
System.out.println(din.readFloat());
System.out.println(din.readBoolean());
}catch(Exception e){
e.printStackTrace();
}
}

序列化与基本类型序列化
1)将类型int 转换成4byte或将其他数据类型转换成byte的过程叫序列化
数据—->n byte
2)反序列化
将n个byte 转换成一个数据的过程
nbyte —> 数据
3)RandomAccessFile提供基本类型的读写方法,可以将基本类型数据
序列化到文件或者将文件内容反序列化为数据
IO流(输入流、输出流)
字节流、字符流
1.字节流
1)InputStream、OutputStream
InputStream抽象了应用程序读取数据的方式
OutputStream抽象了应用程序写出数据的方式
2)EOF = End 读到-1就读到结尾
3)输入流基本方法
int b = in.read();读取一个字节无符号填充到int低八位.-1是 EOF
in.read(byte[] buf)
in.read(byte[] buf,int start,int size)
4)输出流基本方法
out.write(int b) 写出一个byte到流,b的低8位
out.write(byte[] buf)将buf字节数组都写入到流
out.write(byte[] buf,int start,int size)

5)FileInputStream—>具体实现了在文件上读取数据
6)FileOutputStream 实现了向文件中写出byte数据的方法
7)DataOutputStream/DataInputStream
对”流”功能的扩展,可以更加方面的读取int,long,字符等类型数据
DataOutputStream
writeInt()/writeDouble()/writeUTF()

8)BufferedInputStream&BufferedOutputStream
这两个流类位IO提供了带缓冲区的操作,一般打开文件进行写入
或读取操作时,都会加上缓冲,这种流模式提高了IO的性能
从应用程序中把输入放入文件,相当于将一缸水倒入到另一个缸中:
FileOutputStream—>write()方法相当于一滴一滴地把水“转移”过去
DataOutputStream–>writeXxx()方法会方便一些,相当于一瓢一瓢把水“转移”过去
BufferedOutputStream—>write方法更方便,相当于一飘一瓢先放入桶中,再从桶中倒入到另一个缸中,性能提高了

点赞