JavaSE——IO流(二)

1.概述及分类

(1)概述:IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式,Java用于操作流的对象都在IO包中 java.io。
(2)分类

  • 按照数据流向(站在内存的角度):可以分为输入流(读入数据),输出流(写入数据)。
  • 按照数据类型:可以分为字节流和字符流
    字节流:可以读写任何类型的文件,包括音频,视频,文本文件。
    字符流:只能读写文本文件
    (3)IO流基类概述图示
    在这里插入图片描述

2.FileInputStream和FileOutputStream类

(1)FileOutputStream写入数据

①构造方法

FileOutputStream(File file):创建一个向指定 File 对象表示的文件中写入数据的文件输出流
FileOutputStream(String name): 创建一个向具有指定名称的文件中写入数据的输出文件流。
FileOutputStream(String name,boolean append)
FileOutputStream(File file,boolean append)

②方法

public void write(int b):写一个字节  超过一个字节 砍掉前面的字节
public void write(byte[] b):写一个字节数组
public void write(byte[] b,int off,int len):写一个字节数组的一部分

案例演示

package com.westmo3.demo2;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class MyDemo4 {
    public static void main(String[] args) throws IOException {
        File file = new File("test.txt");
        //FileOutputStream fileOutputStream1 = new FileOutputStream("tezt.txt");
        //输出流所关联的文件,如果不存在会自动创建
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        fileOutputStream.write(101);//写入一个字节
        String str="你好呀啦啦啦啦啦";
        byte[] bytes1 = str.getBytes();
        fileOutputStream.write(bytes1);//写入一个字节数组
        fileOutputStream.write(bytes1,0,8);//写入一个字节数组的一部分
        fileOutputStream.close();
        //有时候我们需要追加写入,不需要重新覆盖,可以用下面的创建方法
        FileOutputStream fileOutputStream1 = new FileOutputStream("test.txt", true);
        fileOutputStream1.write(123);
        fileOutputStream1.close();
    }
}

③注意事项
创建字节输出流对象了做了几件事情?

a:调用系统资源创建a.txt文件
b:创建了一个fos对象
c:把fos对象指向这个文件

为什么一定要close()?

a: 通知系统释放关于管理a.txt文件的资源
b: 让Io流对象变成垃圾,等待垃圾回收器对其回收

④FileOutputStream的异常处理

package com.westmo3.demo2;
import java.io.FileOutputStream;
import java.io.IOException;
public class MyDemo5 {
    public static void main(String[] args) {
        FileOutputStream out=null;
        try {
            out = new FileOutputStream("abc.txt");
            out.write("你好".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (out!=null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println("后面的代码");
    }
}
(2)读取数据FileOutputStream

方法

int read():一次读取一个字节,如果没有数据返回的就是-1
int read(byte[] b):一次读取一个字节数组,返回的int类型的值表示的意思是读取到的字节的个数,如果没有数据了就返回-1
public void write(byte[] b,int off,int len):读取字节数组的一部分

案例演示

package com.westmo3.demo2;
import java.io.FileInputStream;
import java.io.IOException;
public class MyDemo6 {
    public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream("a.txt");
        System.out.println(in.read());
        System.out.println(in.read());
        System.out.println(in.read());
        System.out.println(in.read());
     /*  97
         115
         100 
         -1*/       
    }
}
(3)案例演示

字节流一次读一个字节数组赋值MP3文件

package com.westmo3.demo2;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Copymp3 {
    public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream("C:\\Users\\Public\\Music\\许巍 - 曾经的你.mp3");
        FileOutputStream out = new FileOutputStream("E:\\123\\许巍 - 曾经的你.mp3");
        int read=0;
        byte[] bytes = new byte[1024 * 8];
        long start = System.currentTimeMillis();
        while((read=in.read(bytes))!=-1){
            out.write(bytes,0,read);
            out.flush();
        }
        in.close();
        out.close();
        long end = System.currentTimeMillis();
        System.out.println("耗费时间"+(end-start));//17毫秒
    }
}

3.BufferedOutputStream和BufferedInputStream

(1)缓冲思想
字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,
这是加入了数组这样的缓冲区效果,java本身在设计的时候,
也考虑到了这样的设计思想(装饰设计模式后面讲解),所以提供了字节缓冲区流
(2)构造方法
BufferedOutputStream(OutputStream out)
BufferedInputStream(InputStream in)
(3)字节流四种方式复制MP3并测试效率
package com.westmo3.demo1;

import java.io.*;

public class CopyMP1 {
    public static void main(String[] args) throws IOException {
        BufferedInputStream in = new BufferedInputStream(new FileInputStream("C:\\Users\\Public\\Music\\许巍 - 曾经的你.mp3"));
        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("E:\\123\\许巍 - 曾经的你.mp3"));
        int read=0;
        byte[] bytes = new byte[1024 * 8];
        long start = System.currentTimeMillis();
        while((read=in.read(bytes))!=-1){
            out.write(bytes,0,read);
            out.flush();
        }
        in.close();
        out.close();
        long end = System.currentTimeMillis();
        System.out.println("耗费时间"+(end-start));//耗费时间162
    }
}
package com.westmo3.demo1;
import java.io.*;
public class CopyMP1 {
    public static void main(String[] args) throws IOException {
        BufferedInputStream in = new BufferedInputStream(new FileInputStream("C:\\Users\\Public\\Music\\许巍 - 曾经的你.mp3"));
        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("E:\\123\\许巍 - 曾经的你.mp3"));
        int len=0;
        long start = System.currentTimeMillis();
        while((len=in.read())!=-1){
            out.write(len);
            out.flush();
        }
        in.close();
        out.close();
        long end = System.currentTimeMillis();
        System.out.println("耗费时间"+(end-start));//耗费时间44759

    }
}
发布了58 篇原创文章 · 获赞 13 · 访问量 1876

猜你喜欢

转载自blog.csdn.net/weixin_44324174/article/details/104382185
今日推荐