输入输出流

一、流的概念


输入流只能读不能写,输出流只能写不能读。按照流中数据的处理单位不同,可将流分为字节流和字符流。在字节流中,数据的组织和操作的基本单位是字节;在字符流中,数据的组织和操作的基本单位是字符。综上,流可分为字节输入流,字节输出流,字符输入流,字符输出流。

使用流来进行数据输入的具体步骤为


1、创建适当的输入流类的对象,建立与输入设备(如磁盘或者文件)的连接
2、调用相应的read()方法读入数据
3、关闭流,释放相关的系统资源


使用流来进行数据输出的具体步骤为


1、创建适当的输出流类的对象,建立与输出设备(如屏幕或文件)的连接
2、调用相应的write()方法输出数据
3、关闭流,释放相关的系统资源

 二、I/O类体系


为了实现对各种输入/输出设备的操作,Java提供了丰富的基于流的I/O类,这些类位于java.io包中。其中有四个抽象类尤为重要,分别是InputStream(字节输入流)类、OutputStream(字节输出流)类、Reader(字符输入流)类和Writer(字符输出流)类所有字节流的类都是InputStream类或OutputStream类的子类,所有字符流的类都是Reader类或Writer类的子类。

InputStream和Reader是所有输入流的基类,它们两个都是抽象类,本身不能创建实例,但它们分别有一个用于读取文件的输入流:FileInputStream和FileReader,它们都是节点流。
OutputStream和Writer是所有输出流的基类,和输入流相似,也有对应的输出流:FileOutputStream和FileWriter,它们也是节点流。

 三、标准输入/输出


System类功能强大,利用它可以获得很多Java运行时的系统信息。System类的属性和方法都是静态的,System.in和System.out就是System类的两个静态属性,分别对应了系统的标准输入和标准输出。
System.in是InputStream类的对象,当程序需要从键盘输入数据时,只需要调用System.in.read()方法即可。不过要注意,System.in是字节对象流,只能输入字节类型的数据。System.out是PrintStream类的对象,有方法print(),println(),printf()可以输出各种类型的数据。
System.err是标准错误输出流。它是PrintStream类的对象,有两个方法print()和println(),调用这两个方法可以在屏幕上输出错误或者警示信息

字节输入流 InputStream


1、文件字节输入流 FileInputStream
构造方法:

1.FileInputStream(File file) 通过指定的文件建立输入流通道
2 .FileInputStream(String name) 通过字符串的路径建立输入流通道。


常用方法

1.read() 从输入流中读取一个字节。
2.read(byte[] b)将 最多b.length个数据读取到字节数组中.
注意: 返回值是读取到的字节个数。读取到的数据放在了字节数组中。 如果达到文件的末尾,返回-1

2、文件字节缓冲输入流 BufferedInputStream
构造方法

BufferedInputStream(InputStream in)
常用方法
read(byte[] )

字节输出流 OutputStream

文件字节输出流 FileOutputStream
构造方法

1 FileOutputStream(File file) /2 FileOutputStream(String name) 创建一个输出流。该输出流会自动创建一个新的文件或者覆盖原文件。

3 FileOutputStream(File file, boolean append) /4 FileOutputStream(String name, boolean append)
 

常用方法

① write(int b) 将一个字节数据写入到文件中。
② write(byte[] b)将一个数组的字节写入到文件中。
③ write(byte[] b, int off, int len) 从指定的off索引位置开始写入,写入len个数组的数据。在复制文件的时候用。

文件字节缓冲输出流

BufferedOutputStream
构造方法

BufferedOutputStream(OutputStream out)


常用方法

write(byte[] ,off,len)

文件的读取和写入操作


public class InPutTest03 {
    public static void main(String[] args) throws IOException {
        //输出流:内存的内容输出到文件(写操作)  输入流:文件内容输入到内存中(读操作)
        File f1 = new File("d:/a.txt");
        //创建一个输入流,读取f1这个文件
        InputStream input = new FileInputStream(f1);
        //read()读取文件的一个字符,然后把字符转换为对应的数字返回;若读取到文件的末尾,返回-1
//        int n;
//        while((n=input.read())!=-1){
//            System.out.println((char)n);
//        }
 
        //int read(byte[] b)使用缓冲区读取:一次读取数组长度个元素,读取到的字符转换成数字存入数组中,返回的是实际读取的字节数
        byte[] b = new byte[10];//定义byte数组,指定长度,作为每次读取的缓冲区
        int n = n=input.read(b);//按照数组长度去读取,读取的内容存在数组中,返回的是实际读取的字节数
        //System.out.println(n);
        String s = new String(b,0,n);//对数组从0索引开始 截取实际读取的长度产生字符串
        System.out.println(s);
 
        byte[] b1 = new byte[10];
        int n1 = n=input.read(b1);//要求读10个,实际只有5个 b数组中有5个是读取到的数据
        //System.out.println(n1);
        String s1 = new String(b1,0,n1);
        System.out.println(s1);
    }
}

public class InPutTest04 {
    public static void main(String[] args) throws IOException {
        File f1 = new File("D:/a.txt");
        //创建一个输入流,读取f1这个文件
        InputStream input = new FileInputStream(f1);
        //使用read()循环读取文件内容
//        int n;
//        while((n=in.read())!=-1){
//            out.write(n);
//        }
        //使用read(byte[] b)缓冲区循环读取内容
        int n;
        byte[] b = new byte[10];
        while((n=input.read(b))!=-1){
            //把读取到的byte数组转换成字符串
            String s = new String(b,0,n);//从0开始,截取有效读取的字节数你,生成字符串
            System.out.print(s);
        }
    }
}

 文件的复制

public class CopyFileTest05 {
    public static void main(String[] args) throws IOException {
        //文件复制
        //1.定义源文件和目的文件的文件对象
        File f1 = new File("D:/a.txt");
        File newFile = new File("D:/aa/copy.txt");
        //2.创建目的文件
        newFile.createNewFile();
        //3.定义输入流:使用输入流读取内容 使用输出流写入内容
        InputStream in = new FileInputStream(f1);
        OutputStream out = new FileOutputStream(newFile);
        //4.循环读取文件内容,同时写入指定的文件中
//        int n;
//        while((n=in.read())!=-1){
//            out.write(n);
//        }
        //实际工作中推荐写法
//        byte[] buffer = new byte[10];
//        int n;
//        while((n=in.read(buffer))!=-1){
//            //把buffer数组从0开始,截取读取到有效字节数n,写入到目的文件中
//            out.write(buffer,0,n);
//        }
        //练习时容易理解的方式
        byte[] buffer = new byte[10];
        int n=0;
        while(true){
            //读取文件,内容放入buffer数组中,返回的是实际读取的字节数
            n =in.read(buffer);
            if(n!=-1){
                //把buffer数组从0开始,截取读取到有效字节数n,写入到目的文件中
                out.write(buffer,0,n);
            }else{
                break;
            }
        }
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值