JAVA中IO流详解

字节输入流:

父类:InputStream

常用的字节输入流:FileInputStream

1.FileInputStream

①构造方法:

FileInputStream(File)

FileInputStream(String filename)

2.常用方法

①read :读取一个字节,返回该字节的值,如果到达文件的末尾,则返回-1。需要注意:read()方法和迭代器一样,会自动下移的

②read(byte[ ])从输入流中读取至多一个数组长度的内容,到达文件末尾,则返回-1。

数组称为缓冲区数组,大小一般取值为1024的整数倍。
转换为字符时,使用String(byte [ ] bytes,int offset,int length)
available()没有读取的剩余字节数,如果该文件还从未被读取,就返回该文件的长度。
close() 关闭流并释放资源

  1. 字节输入流代码演示:

其中1.txt位于本项目的根目录下:内容为"abcdefg"。

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

public class Demo6 {

    public static void main(String[] args) throws IOException{
        File file=new File("1.txt");     //新建一个文件的抽象路径
        FileInputStream fis=new FileInputStream(file);
        int result=fis.read();
        System.out.println(result);

    }

}

程序执行的结果为97,因为读取的a的ASCII码值。

字节输入流的循环读取:

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

public class Demo7 {

    public static void main(String[] args) throws IOException{
        File file =new File("1.txt");
        FileInputStream fis=new FileInputStream(file);
        int result;
        while((result=fis.read())!=-1) {
            System.out.print(result+"\t");
        }


    }

}

打印了a到g的ASCII码值:
97 98 99 100 101 102 103

  1. 字符流的读取方法:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class Demo8 {

    public static void main(String[] args) throws IOException{
        File file =new File("1.txt");
        FileInputStream fis=new FileInputStream(file);
        byte[] bt=new byte[1024];
        int count;
        while((count=fis.read(bt))!=-1) {
            String string =new String(bt,0,count);
            System.out.println(string);
        }
    }
}

输出结果:
abcdefg
下面可以用同样的文件来比较字节输入流和字符输入流的读取速度:

文件是一张格式为png图片

先是字节输入流的读取速度

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

public class Demo9 {

    public static void main(String[] args) throws IOException{
        File file =new File("D:\\Java代码\\123.png");
        FileInputStream fis=new FileInputStream(file);
        int count;
        long start=System.currentTimeMillis();
        while((count=fis.read())!=-1) {
            System.out.println(count);
        }
        long end=System.currentTimeMillis();
        System.out.println("======下面是所用的时间======");
        System.out.println(end-start);
    }

}

结果如下:
![在这里插入图片描述]
下面是字符输入流:

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

public class Demo10 {

    public static void main(String[] args) throws IOException {
        File file=new File("D:\\Java代码\\123.png");
        FileInputStream fis=new FileInputStream(file);
        byte[] bt=new byte[1024];
        int count;
        long start=System.currentTimeMillis();
        while((count=fis.read(bt))!=-1) {
            System.out.println(count);
        }
        long end=System.currentTimeMillis();
        System.out.println("======下面是所用的时间======");
        System.out.println(end-start);
    }
}

结果如下:
在这里插入图片描述
字节输入流读取文件花费了760毫秒,而字符输入流读取文件花费了3毫秒,由此可见,字符输入流的速度要比字节输入流更快。

文件字节输出流

字节输出流:OutputStream 是所有输出流的超类

常用子类:FileOutputStream 文件字节输出流

构造方法:

FileOutputStream(File file) /FileOutputStream(String name)

注意:如果父目录不存在,会报FileNotFoundException异常,如果父目录存在,会创建一个新的文件,如果此时已经有文件存在,会覆盖原文件

FileOutputStream(File file,boolean flag)/FileOutputStream(String name,boolean flag)

注意:如果当前文件需要从文件末尾进行插入(接着文件里的内容继续写),必须将第二个参数设置为true,默认不写为false,会覆盖原文件

常用方法:

write(int)向文件中写入一个字节的值

write(byte[]) 向文件中写入一个数组的数据。

write(byte[] offset len) 将 偏移量为 offset 的索引位置的长度为 len 的数据,写入到输出流中。

代码示例:

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

public class Demo11 {

    public static void main(String[] args) throws IOException {
        File file=new File("3.txt");
        FileOutputStream fos=new FileOutputStream(file);

        fos.write("没有绝对的绝缘体,只有不努力的电压。".getBytes());
    }
}

执行结果,会在本项目的根目录下生成一个3.txt 文件,并且将内容写入进去。
在这里插入图片描述

文件复制:
将一个文件通过IO流复制到另一个文件中去

代码示例:

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

public class Demo12 {

    public static void main(String[] args) throws IOException {
        File file=new File("1.txt");
        FileInputStream fis=new FileInputStream(file);
        FileOutputStream fos=new FileOutputStream(new File("4.txt"));
        byte[] bt=new byte[1024];
        int count;
        while((count=fis.read(bt))!=-1) {
            fos.write(bt,0,count);
        }
        fis.close();
        fos.close();
    }
}

结果会将1.txt的内容复制到4.txt中。

带缓冲区的字节流

  1. 通过比较 read() 与 read(byte[]) 的方法复制文件的时间的长短,可以看出,带缓冲区的读写文件的速度快,
    java 上提供了专门带缓冲区的字节流,用以提高读写速度。
    2.BufferedInputStream /BufferedOutputStream 带缓冲区的字节输入 / 输出流
  2. 结论: 带缓冲区的字节流 读取速度高于字节流
    代码演示:
public class  带缓冲区的字节流 {
public static void main(String[] args) throws IOException {
/*FileInputStream fis=new FileInputStream(new File("src\\com\\ 文件复制 .java"));
// 复制操作 :
BufferedInputStream bis=new BufferedInputStream(fis);*/
// // 读取
// BufferedInputStream bis=new BufferedInputStream(new FileInputStream(new File("src\\com\\ 文件复制 .java")));
// // 写入
// BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(new File("1.java"))
);
// 读取
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(new File("D:\\0318java 班
\\day08\\ 录屏 \\1_day08IO 流概述 .mp4")));
// 写入
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(new File("C:\\Users\\
Administrator\\Desktop\\2.mp4")));
byte[] bt=new byte[1024];
int count=0;
long start=System.currentTimeMillis();
while((count=bis.read(bt))!=-1) {
bos.write(bt, 0, count);
}
long end=System.currentTimeMillis();
System.out.println(end-start);
bis.close();
bos.close();
}
}

jdk1.6 流的异常处理

  1. 异常处理方式:
    ① try-catch-finally 异常的捕获
    ② throws 异常的声明
  2. 以文件复制的形式来写流的异常处理 :
    在 1.7jdk 之前包括 1.6 不包含 1.7 的流的异常处理形式。
    代码演示:
public class  字节流的异常处理方式 {
public static void main(String[] args) {
// 为了在 finally 里面能够使用关闭资源,提升作用域
FileInputStream fis=null;
FileOutputStream fos=null;
try {
// 输入流
fis=new FileInputStream(new File("src\\com\\ 带缓冲区的字节流 .java"));
// 输出流
fos=new FileOutputStream(new File("2.java"));
// 文件复制
byte[] bt=new byte[1024];
int count=0;
while((count=fis.read(bt))!=-1) {
fos.write(bt,0,count);
}
}catch(Exception e) {
e.printStackTrace();
}finally {
close(fis, fos);
}
}
public static void close(InputStream fis,OutputStream fos) {
// 关闭资源
try {
// 为了防止空指针,需要判断不为 null 再关闭
if (fis!=null) {
fis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
// 为了防止空指针,需要判断不为 null 再关闭
if (fos!=null) {
fos.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

Jdk1_7 流的异常处理形式

public class Jdk1_7 流的异常处理形式 {
public static void main(String[] args) {
try(
FileInputStream fis=new FileInputStream(new File("src\\com\\ 带缓冲区的字节流 .java"));
FileOutputStream fos=new FileOutputStream(new File("3.java"));
){
/*Scanner sc=new Scanner(System.in);
sc.close();*/
byte[] bt=new byte[1024];
int count=0;
while((count=fis.read(bt))!=-1) {
fos.write(bt,0,count);
}
}catch (Exception e) {
e.printStackTrace();
}
Scanner sc1=new Scanner(System.in);
String name = sc1.nextLine();
}
}

‘\r’ 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖;asci码13
 ‘\n’ 换行,换到当前位置的下一行,而不会回到行首;asci码10

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值