IO流...

程序需要实现与设备和不同介质之间的数据传输,例如:键盘录入、读取电脑文件等,Java将这种通过不同输入输出设备(键盘,显示器,网络)等之间的数据传输抽象表述为“流”。

按照操作的数据不同,可以分为:

字节流:字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的。

字符流:字符流只能操作纯字符数据,比较方便。

按照流向分,又可以分为

输入流(我读取一个文件)和输出流(把一个数据输出到一个文件中)

字节流

字节输出流OutputStream

OutputStream是抽象类,是所有字节输出流类的超类。操作的数据都是字节,该类定义了字节输出流的基本共性功能方法。

输出数据到文件中

package MONA.demo01_字节输出流;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
//文件的输入

public class Demo01 {
    public static void main(String[] args) throws Exception {
        //Ctrl+P会提示构造方法的参数
        //如果文件不存在,会自动创建文件
        FileOutputStream fos = new FileOutputStream("2.txt");
        //输出
        //fos.write(97);//ascii

        //输出数组的数据
        byte[] bytes = {97,98,99};
        fos.write(bytes);

        //关闭流
        fos.close();
        System.out.println("程序结束");
    }
}

续写文件

package MONA.demo01_字节输出流;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/**
 * 续写文件
 */
public class Demo02 {
    public static void main(String[] args) throws Exception {
        //括号里的第二个参数:是否续写
        FileOutputStream fos = new FileOutputStream("1.txt",true);
        fos.write(100);
        fos.close();


//        File file = new File("1.txt");
//        FileOutputStream fos2 = new FileOutputStream(file);

//        FileOutputStream fos2 = new FileOutputStream(new File("1.txt"));
        System.out.println("程序结束");
    }
}

输出中文以及换行

package MONA.demo01_字节输出流;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
//输出中文以及换行
public class Demo03 {
    public static void main(String[] args) {
        try {
            FileOutputStream fos = new FileOutputStream("2.txt",true);
            //你好  String -->byte[]
            fos.write("你好".getBytes());
            //换行
            fos.write("\r\n".getBytes());
            fos.write("你好".getBytes());
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

通过字节输出流,我们可以把内存中的数据写出到文件中,那如何想把文件中的数据读到内存中,可以通过InputStream可以实现。 

字节输入流InputStream

IntputStream是抽象类,是所有字节输入流类的超类。该类定义了字节输入流的基本共性功能方法。

读取单个字符

package MONA.demo02_字节输入流;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * 字节输入流
 */
public class Demo01 {
    public static void main(String[] args) throws Exception {
        FileInputStream fis = new FileInputStream("2.txt");
        //读取2里面的数据
        //read()读取数据
        System.out.println("读取1  "+(char)fis.read());
        System.out.println("读取2  "+(char)fis.read());
        System.out.println("读取3  "+(char)fis.read());

        fis.close();
    }
}
使用循环读取文件的所有内容
package MONA.demo02_字节输入流;

import java.io.FileInputStream;

//使用循环读取文件的所有内容
public class Demo02 {
    public static void main(String[] args) throws Exception{
        FileInputStream fis = new FileInputStream("2.txt");
        //read()返回读取到的数据,如果没有数据,返回-1
//        System.out.println(fis.read());
//        System.out.println(fis.read());
//        System.out.println(fis.read());

        //写法一:缺点,写法复杂
        int n = fis.read();
        while (n != -1){
            System.out.println((char)n);
            n = fis.read();//重新赋值
        }

        //写法二:将赋值语句放入判断条件里面
        int m = 0;
        while ((m = fis.read()) !=-1){
            System.out.println((char)m);
        }

        fis.close();
        System.out.println("程序结束");
    }
}

FileInputStream读取数据read(byte[])方法 

在读取文件中的数据时,调用read方法,每次只能读取一个,需要频繁的操作文件,效率非常低,于是我们可以定义数组作为临时的存储容器,这时可以调用重载的read方法,一次可以读取多个字符。

读取文件全部内容(缓冲数组)

package MONA.demo02_字节输入流;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;

/**
 * 数组缓冲区
 * 一次读取一个数组
 */
public class Demo03 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("2.txt");
        byte[] bytes = new byte[2];
        //讲读取到的数据存入数组中,返回读取到的数据的个数
//        int count = fis.read(bytes);
//        System.out.println(count);
//        System.out.println(Arrays.toString(bytes));

        //循环读取
        //写法1
//        int count = fis.read(bytes);
//        while (count != -1){
//            System.out.println(Arrays.toString(bytes));
//            count = fis.read(bytes);
//        }

        //写法2
        int count = 0;
        while ((count = fis.read(bytes))!=-1){
            System.out.println(Arrays.toString(bytes));
        }
    }
}

使用数组缓冲后出现的问题及解决

package MONA.demo02_字节输入流;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;

/**
 * 读取数据问题
 */
public class Demo04 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("2.txt");
        byte[] bytes = new byte[2];
        //写法2
        int count = 0;
        //将读取到的数据转换String类型
        while ((count = fis.read(bytes))!=-1){
            //System.out.println(Arrays.toString(bytes));
            //第一次:count 2
            //第二次:count 2
            //第三次:count 1
            String s = new String(bytes,0,count);
            System.out.println(s);
        }
        fis.close();
    }
}

复制文件(单个字符)

package MONA.demo03_练习题;

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

/**
 * 复制文件
 */
public class Demo01 {
    public static void main(String[] args) throws Exception {
        FileInputStream fis = new FileInputStream("2.txt");
        FileOutputStream fos = new FileOutputStream("3.txt");
        int n = 0;
        while((n = fis.read()) !=-1){
            //读取到一个字节了
            fos.write(n);
        }
        //后打开的先关闭
        fos.close();
        fis.close();

        System.out.println("复制完毕");
    }
}

复制文件(数组)

package MONA.demo03_练习题;

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

/**
 * 提高复制的效率
 */
public class Demo02 {
    public static void main(String[] args) throws Exception {
        FileInputStream fis = new FileInputStream("2.txt");
        FileOutputStream fos = new FileOutputStream("3.txt");
        byte[] bytes = new byte[6];
        int count = 0;
        while((count = fis.read(bytes)) !=-1){
            //只写读取到的内容
            fos.write(bytes,0,count);
        }
        fos.close();
        fis.close();
        System.out.println("复制结束");
    }
}

IO流异常处理

package MONA.demo04_异常处理;

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

public class Demo01 {
    public static void main(String[] args) {
        FileOutputStream fos = null;
        try{
            //2.发生异常
            fos = new FileOutputStream("2.txt");
            fos.write(97);
            //1.如果在此处发生异常,后面的代码不会执行。

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //无论如何都会执行
            try {
                if(fos != null){
                    fos.close();
                }
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
  1. try-with-resource结构的用法。FileInputStream类型变量就在try关键字后面的括号中声明。而且一个FileInputStream 类型被实例化并被赋给了这个变量。
  2. 关于带资源的try语句的3个关键点
  3. 由带资源的try语句管理的资源必须是实现了AutoCloseable接口的类的对象。
  4. 在try代码中声明的资源被隐式声明为fianl
  5. 通过使用分号分隔每个声明可以管理多个资源。

所声明资源的作用域被限制在带资源的try语句中

package MONA.demo04_异常处理;

import java.io.FileInputStream;

public class Demo02 {
    public static void main(String[] args) {
        //流使用完会自动关闭
        try (FileInputStream fis = new FileInputStream("2.txt");){
            System.out.println(fis.read());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值