手记

JavaIO之字节流学习笔记

一、文件输入/输出流

文件输入流FileInputStream具体实现了在文件上读取数据,文件输出流FileOutputStream实现了向文件中写出byte数据。

1.1 FileInputStream
in.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();
    }

注:文章根据本站相关课程的学习笔记整理而来,有错误或其他任何问题敬请指正,欢迎共同学习交流!

1人推荐
随时随地看视频
慕课网APP