字节流

作者: 少冰三hun甜 | 来源:发表于2016-09-01 23:21 被阅读41次

字节流
1. InputStream 和OutputStream

inputStream 和OutputStream 的作用是用来表示那些从不同数据源产生输入输出的类
抽象了应用程序读取数据的方式。


2. EOF=end 读到-1就结尾


3. 输入流的基本方法(对应读方法)

int b=in.read();读取一个字节无符号,填充到int的低八位,-1为EOF
in.read(byte[] buf)读取数据填充到数组buf
in.read(byte[] buf,int start,int size)读取数据到字节数组buf,从buf的start位置开始存放长度为size的数据


4. 输出流的基本方法(对应写方法)

out.write(int b);写出一个字节到流,b的低八位。
out.write(byte[] buf)将buf数据都写到流
out.write(byte[] buf,int start,int size)数组buf 从start位置开始写size长度的字节到流


5. FileInputStream 具体实现了在文件上读取数据
实例代码:

/**
     * 批量读取,对大文件而言效率高,也是我们最常用的读文件的方式
     * @param fileName
     * @throws IOException
     */
    public static void printHexByByteArray(String fileName)throws IOException{
        FileInputStream in = new FileInputStream(fileName);
        byte[] buf = new byte[8 * 1024];
        /*从in中批量读取字节,放入到buf这个字节数组中,
         * 从第0个位置开始放,最多放buf.length个 
         * 返回的是读到的字节的个数
        */
        /*int bytes = in.read(buf,0,buf.length);//一次性读完,说明字节数组足够大
        int j = 1; 
        for(int i = 0; i < bytes;i++){
            System.out.print(Integer.toHexString(buf[i] & 0xff)+"  ");
            if(j++%10==0){
                System.out.println();
            }
        }*/
      int bytes = 0;
      int j = 1;
      while((bytes = in.read(buf,0,buf.length))!=-1){
          for(int i = 0 ; i < bytes;i++){
              System.out.print(Integer.toHexString(buf[i] & 0xff)+"  ");
              if(j++%10==0){
                  System.out.println();
              }
          }
      }
      in.close();
    }

6. FileOutStream实现了向文件中写出byte的方法
实例代码:

package com.imooc.io;

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutDemo1 {
    /**
     * @param args
     */
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        //如果该文件不存在,则直接创建,如果存在,删除后创建
        FileOutputStream out = new FileOutputStream("demo/out.dat");
        out.write('A');//写出了'A'的低八位
        out.write('B');//写出了'B'的低八位
        int a = 10;//write只能写八位,那么写一个int需要些4次每次8位
        out.write(a >>> 24);
        out.write(a >>> 16);
        out.write(a >>> 8);
        out.write(a);
        byte[] gbk = "中国".getBytes("gbk");
        out.write(gbk);
        out.close();
        
        IOUtil.printHex("demo/out.dat");
        
    }
}

**输入输出综合应用: **

    /**
     * 文件拷贝,字节批量读取
     * @param srcFile
     * @param destFile
     * @throws IOException
     */
    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);
            out.flush();//最好加上
        }
        in.close();
        out.close();
        
    }

7. DataOutputStream/DataInputStream

对“流”功能的扩展,可以更加方便地读取int,long,string等类型的数据(相当于对字节流的包装)

**示例代码:

写:

public class DosDemo {
    public static void main(String[] args) throws IOException {
        String file = "demo/dos.dat";
        DataOutputStream dos = new DataOutputStream(
                         new FileOutputStream(file));
        dos.writeInt(10);
        dos.writeInt(-10);
        dos.writeLong(10l);
        dos.writeDouble(10.5);
        //采用utf-8编码写出
        dos.writeUTF("中国");
        //采用utf-16be编码写出
        dos.writeChars("中国");
        dos.close();
        IOUtil.printHex(file);
    }

读:

    public static void main(String[] args) throws IOException{
        // TODO Auto-generated method stub
        String file = "demo/dos.dat";
        IOUtil.printHex(file);
       DataInputStream dis = new DataInputStream(
               new FileInputStream(file));
       int i = dis.readInt();
       System.out.println(i);
       i = dis.readInt();
       System.out.println(i);
       long l = dis.readLong();
       System.out.println(l);
       double d = dis.readDouble();
       System.out.println(d);
       String s = dis.readUTF();
       System.out.println(s);
         dis.close();
    }

8. BufferedInputStream&BufferedOutputStream(效率最高)

这两个流泪提供了带缓冲的操作,一般打开文件进行写入或读取操作时,都会加上缓冲,这种流模式提高了IO的性能
从应用程序中把输入放入文件,相当于把一缸水倒入另一个缸中
FileOutputStream->wite()方法相当一一滴一滴(一个字节)地转移水
DataOutputStream->writeXXX()方法相当于一勺一勺地转移水
BufferedOutputStream->write()更便捷,相当于一勺一勺放入桶中,再从桶中倒入另一个桶。

示例代码:

    /**
     * 进行文件的拷贝,利用带缓冲的字节流
     * @param srcFile
     * @param destFile
     * @throws IOException
     */
    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();
    }

测试代码:

public class IOUtilTest4 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            long start = System.currentTimeMillis();
            /*IOUtil.copyFileByByte(new File("e:\\javaio\\1.mp3"), new File(
                    "e:\\javaio\\2.mp3"));*/  //两万多毫秒
            /*IOUtil.copyFileByBuffer(new File("e:\\javaio\\1.mp3"), new File(
                    "e:\\javaio\\3.mp3"));//一万多毫秒*/
            IOUtil.copyFile(new File("e:\\javaio\\1.mp3"), new File(
                    "e:\\javaio\\4.mp3"));//7毫秒
            long end = System.currentTimeMillis();
            System.out.println(end - start );
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

相关文章

网友评论

      本文标题:字节流

      本文链接:https://www.haomeiwen.com/subject/krchettx.html