JAVA基础_IO流_字节流_抽象类OutStream&InputStream

1 File类

1.1 File类的概述

File:文件和目录路径名的抽象表示形式
也就是说文件和目录是可以通过File封装成对象的

目录:其实就是文件夹

1.2 File类的构造方法

  1. File(String pathname):通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
  2. File(String parent, String child):根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
  3. File(File parent, String child):根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实

代码演示

package com.twy.test.test8_17;

import java.io.File;

public class FileDemo {
    public static void main(String[] args) {
        //File(String pathname)
        File f1 = new File("G:\\BigData\\test\\a.txt");

        //File(String parent,String child)
        File f2 = new File("G:\\BigData\\test","a.txt");

        File(File parent,String child)
        File f3 = new File("G:\\BigData\\test");
        File f4 = new File(f3,"a.txt");

        //以上f1,f2,f4做的是同一件事
    }
}

1.3 File类的成员方法

  • public boolean createNewFile():创建文件
    如果文件不存在,创建文件并返回true
    如果文件存在,创建文件失败并返回false

  • public boolean mkdir():创建目录
    如果目录不存在,创建目录并返回true
    如果目录存在,创建目录失败并返回false

  • public boolean mkdirs():创建多级目录

  • public boolean delete():删除文件和目录

如果一个目录中有内容(目录,文件),就不能直接删除。
应该先删除目录中的内容,最后才能删除目录。

  • 判断功能
  1. public boolean isDirectory():判断是否是目录
  2. public boolean isFile():判断是否是文件
  3. public boolean exists():判断是否存在
  • 获取功能
  1. public String getAbsolutePath():获取绝对路径
  2. public String getPath():获取相对路径
  3. public String getName():获取名称

绝对路径:是以盘符开始的路径。d:\aa\b.txt
相对路径:不以盘符开始。相对于当前的项目而言,在项目的目录下。如何显示出来呢?刷新项目就可以了。
代码演示

package com.twy.test.test8_17;

import java.io.File;
import java.io.IOException;

public class FileDemo2 {
    public static void main(String[] args) throws IOException {
        File f1 = new File("G:\\a.txt");
        System.out.println(createFile(f1));

        File f2 = new File("G:\\BigData\\test2");
        System.out.println(f2.mkdirs());

        File f3 = new File("a.txt");
        f3.createNewFile();

        //删除功能public Boolean delete()
        boolean delete = f1.delete();
        System.out.println(delete);

        //判断是否是目录
        boolean directory = f1.isDirectory();
        System.out.println(directory);

        //判断是否是文件
        boolean file = f1.isFile();
        System.out.println(file);

        //判断是否存在
        boolean exists = f1.exists();
        System.out.println(exists);

        //获取绝对路径
        String absolutePath = f3.getAbsolutePath();
        System.out.println(absolutePath);

        //获取相对路径
        String path = f3.getPath();
        System.out.println(path);

        //获取名称
        String name = f3.getName();
        System.out.println(name);


    }

    public static Boolean createFile(File f) throws IOException {

        return f.createNewFile();
    }
}

2 IO(字节流)

2.1 IO流的概述

2.1.1 什么是IO流,其作用是?

IO可以拆开来理解
I — Input – 输入 —相对java程序为读取
O — Output – 输出 —相对java程序为写出

读取和写出都是针对数据而言的, 所以, IO流就是用来处理设备之间的数据传输
常见应用于:文件复制,文件上传。文件下载

2.1.2 IO流的分类

按照类型分:
字节流
字符流 (字符流数据通过Windows自带的记事本软件打开是可以读懂里面内容的)
按照流向分:
输入流 : 用来读取数据的:
输出流 : 用来写出数据的

2.1.3 字节流&字符流的抽象父类

字节流:
InputStream 字节输入流
OutputStream 字节输出流
字符流:
Reader 字符输入流
Writer 字符输出流

2.2 FileOutputStream写数据

字节流写数据
OutputStream:此抽象类是表示输出字节流的所有类的超类
FileOutputStream:文件输出流是用于将数据写入 File

构造方法:
FileOutputStream(String name):创建一个向具有指定名称的文件中写入数据的输出文件流。

字节流写数据的步骤:
A:创建字节输出流对象
B:调用写数据的方法
C:释放资源
代码演示

public static void main(String[] args) throws IOException {
        //创建字节输出流对象
        FileOutputStream fos = new FileOutputStream("a.txt");

        //写内容
        fos.write(65);
        fos.write(97);

        //释放资源
        fos.close();
    }

2.2.1 FileOutputStream写数据的三种方法

三种方法:

public void write(int b):一次写一个字节
public void write(byte[] b):一次写一个字节数组
public void write(byte[] b,int off,int len):一次写一个字节数组的一部分

String类中的方法:

byte[] getBytes()  将字符串转换为字节数组

代码演示

public static void main(String[] args) throws IOException {
        //创建字节输出流对象
        FileOutputStream fos = new FileOutputStream("a.txt");
        FileOutputStream fos2 = new FileOutputStream("b.txt");

        //写内容
        fos.write(55);
        
        //写内容void write(byte[] by)
        byte[] by = {97,98,99,100};
        fos.write(by);
        
        fos.write("hello".getBytes());

        //void write(byte[] b,int off.int len)
        fos2.write(by,1,by.length-1);


        //释放资源
        fos.close();
        

    }

2.2.2 FileOutputStream如何实现换行和追加写数据

2.2.2.1 如何实现数据的换行

不同的操作系统,针对换行的符号识别是不一样的。
windows:\r\n
linux:\n
mac:\r

2.2.2.2 如何实现数据的追加写入

FileOutputStream(String name)此构造函数,每次启动程序,写入的数据都是相同的
FileOutputStream(String name, boolean append) 此构造函数,每次启动程序,当第二个参数为true时,写入的数据可以与上次的数据拼接,实现追加

代码演示

public static void main(String[] args) throws IOException {
        //创建字节输出流对象
        FileOutputStream fos = new FileOutputStream("a.txt",true);

        //实现换行和追加
        for (int i = 0; i < 5; i++) {
            fos.write("abcde".getBytes());
            fos.write("\r\n".getBytes());
        }
        //释放资源
        fos.close();
    }

2.2.3 FileOutputStream写数据加入异常处理

格式

try{
			可能发生问题的代码
}catch(){
	处理异常代码
}finally{
		一定会被执行的代码.   // 通常用于释放资源, 做善后的动作
}

代码演示

FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("G://a.txt",true);
            fos.write("sssdfgfg".getBytes());

        } catch (IOException  e) {
            e.printStackTrace();
        }
        finally {
            if(fos!=null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

注意:在释放资源时,要判断对象是否为空,如果为空,则说明写入数据为成功,字节输入流对象任为空,系统释放资源时将会报空指针异常

2.3 FileInputStream读数据

2.3.1 字节流读取数据的三个步骤

字节流读数据的步骤:
A:创建字节输入流对象
B:调用读数据的方法
C:释放资源

2.3.2 读取方式一

public static void main(String[] args) throws IOException {

        //1.创建输出流对象
        FileInputStream fis = new FileInputStream("a.txt");
        //2.读出字节流
        int read = fis.read();
        System.out.println((char)read);
        //3.释放资源
        fis.close();
    }

2.3.3 读取方式二

public int read(byte[] b):
从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中
返回值是读入缓冲区的字节总数,也就是实际的读取个数
如果因为已经到达文件末尾而没有更多的数据,则返回 -1。

public static void main(String[] args) throws IOException {

        //1.创建输出流对象
        FileInputStream fis = new FileInputStream("a.txt");

        File file = new File("b.txt");
        FileInputStream fis2 = new FileInputStream(file);
        //1.
        int read = 0;
        while( (read = fis2.read())!=-1){
            System.out.println((char)read);
        }
        System.out.println("-------------------");
        //2.
        byte[] by = new byte[1024];
        int len;
        while ((len = fis.read(by))!=-1){
            System.out.println(new String(by,0,len));
        }
      
       //3.释放资源
        fis.close();
    }

读取的字符数组的元素用String的一个构造函数转换为字符串类型,输出

2.4 字节流练习之复制文本文件

需求: 拷贝文本文件
分析:
第一步: 创建输入输出流对象关联数据源和数据目的
第二步: 定义字节数组,为了提高效率
第三步: 将数据通过while循环不断读取到字节数组中
第四步: 将数据从字节数组中取出并写出
第五步: 释放资源

package com.twy.test.test9_io_17;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyTextDemo {

    public static void main(String[] args) throws IOException {
        //创建字节流对象
        FileInputStream fis = new FileInputStream("a.txt");
        FileOutputStream fos = new FileOutputStream("c.txt");

        //将读取到的数据内容写入c.txt
        byte[] by = new byte[1024];
        int lens;
        while ((lens = fis.read(by))!= -1){
            fos.write(by,0,lens);
        }

        //3.释放资源
        fis.close();
        fos.close();

    }
}

2.5 字节流练习之复制图片

package com.twy.test.test9_io_17;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyJpgDemo {
    public static void main(String[] args) throws IOException {
        //1.创建读写对象
        FileInputStream fis = new FileInputStream("G:\\联想漂亮锁屏\\1.jpg");
        FileOutputStream fos = new FileOutputStream("a.jpg");

        //2.读写
        byte[] by = new byte[1024];
        int lens;
        while ((lens = fis.read(by))!= -1){
            fos.write(by,0,lens);
        }

        //3.释放资源
        fos.close();
        fis.close();
    }
}

2.6 字节缓冲区流

2.6.1 字节缓冲区流的概述和使用

2.6.1.1 字节缓冲流的作用是?

字节流一次读写一个数组的速度比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,java本身在设计的时候,也考虑到了这样的设计思想,所以提供了字节缓冲区流

  • 字节缓冲流 :
  1. BufferedOutputStream:字节缓冲输出流
  2. BufferedInputStream:字节缓冲输入流
2.6.1.2 为什么字节缓冲流的构造方法需要传入一个OutputStream

字节缓冲区流仅仅提供缓冲区,而真正的底层的读写数据还得需要基本的流对象进行操作。

代码演示

public class BufferedStreamDemo {
	public static void main(String[] args) throws IOException {
		// BufferedInputStream(InputStream in)
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));
		//方式1:一次读取一个字节
//		int by;
//		while((by=bis.read())!=-1) {
//			System.out.print((char)by);
//		}
		
		//方式2:一次读取一个字节数组
		byte[] bys = new byte[1024];
		int len;
		while((len=bis.read(bys))!=-1) {
			System.out.print(new String(bys,0,len));
		}
		//释放资源
		bis.close();
	}
}

2.6.2 字节流四种方式复制AVI并测试效率

package com.twy.test.test10_io_18;

//分析:
/*   1.public static long currentTimeMillis():返回以毫秒为单位的当前时间。开始结束时间,做差输出
     2.定义4个方法,分别记录其复制文件所用时间
     3.method1():字节流一次读取一个字节输出
     4.method2():字节流一次读取一个字节数组输出
     5.method3():缓冲字节流一次读取一个字节数组输出
     6.method4():缓冲字节流一次读取一个字节数组输出

*
*
* */

import java.io.*;

public class CopyAviTest {
    public static void main(String[] args) throws IOException {

        //设置记录时间开始
        long l = System.currentTimeMillis();

       //调用方法
       // method1();      //86075毫秒
       // method2();    //   225 毫秒
      // method3();    //476  毫秒
        method4();    //  39 毫秒


        //设置结束时间记录
        long l1 = System.currentTimeMillis();
        System.out.println(l1-l);



    }

    //基本字节流一次输出一个字节
    private static void method1() throws IOException {
        //封装数据源
        FileInputStream fis = new FileInputStream("a.flv");
        //封装目的地
        FileOutputStream fos = new FileOutputStream("b.flv");

        //复制文件
        int len;
        while ((len = fis.read())!= -1){
            fos.write((char)len);
        }

        //释放内存
        fis.close();
        fos.close();
    }

    //基本字节流一次输出一个字节数组
    private static void method2() throws IOException {
        //封装数据源
        FileInputStream fis = new FileInputStream("a.flv");
        //封装目的地
        FileOutputStream fos = new FileOutputStream("b.flv");

        //复制文件
        byte[] by = new byte[1024];
        int len;
        while ((len = fis.read(by))!= -1){
            fos.write(by,0,len);
        }

        //释放内存
        fis.close();
        fos.close();
    }

    //缓冲流基本字节流一次输出一个字节
    private static void method3() throws IOException {
        //封装数据源
        BufferedInputStream fis = new BufferedInputStream(new FileInputStream("a.flv"));
        //封装目的地
        BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream("b.flv"));

        //复制文件
        int len;
        while ((len = fis.read())!= -1){
            fos.write((char)len);
        }

        //释放内存
        fis.close();
        fos.close();
    }

    //缓冲区字节流一次输出一个字节数组
    private static void method4() throws IOException {
        //封装数据源
        BufferedInputStream fis = new BufferedInputStream(new FileInputStream("a.flv"));
        //封装目的地
        BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream("b.flv"));

        //复制文件
        byte[] by = new byte[1024];
        int len;
        while ((len = fis.read(by))!= -1){
            fos.write(by,0,len);
        }

        //释放内存
        fis.close();
        fos.close();
    }

}

总结:字节数组相比一次一个字节输出快,缓冲区相对非缓冲区要快,当字节数组与缓冲区同时使用时,效率最高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值