Java中的IO流

很重要的一个java基础内容

什么是流 ?

在Java程序中,数据的输入/输出操作以“流”(Stream)方式进行;JavaAPI提供了各式各样的流类,用以获取不同种类的数据。

Java中IO流分为几种

  • 按流向分,可以分为输出流和输入流
  • 按操作单元划分,可以分为字节流和字符流
  • 按流的角色分,可以分为节点流和处理流

Java IO流中涉及40多个类,但都是从4个抽象类派生出来的。

  • Writer/OutputStream:所有输出流的基类,前者是字符流,后者是字节流
  • Reader/InputStream:所有输入流的基类,前者是字符流,后者是字节流

按操作方式化分流

IO-操作方式分类

按操作对象划分
IO-操作对象分类

  • 节点流:相当于一根管道,给数据一个通道,进入或出去
  • 处理流:包裹管道的一个东西,所以处理流构造方法中一般会传入一个 它的父类型的对象

常用的几个IO流

1.缓冲流
  • BufferedOutputStream

    //向文件中输入字符
    public class BufferedOutputStreamDemo1 {
        public static void main(String[] args) throws Exception {
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.txt"));
            for(int i=48;i<100;i++) {
                bos.write((char)i);
            }
            bos.flush();
        }
    }
    
  • BufferedInputStream

public class BufferedInputStreamDemo1 {
    public static void main(String[] args) throws Exception {
        int b = 0;
        FileInputStream fis = new FileInputStream("offeroffer.iml");
        BufferedInputStream bis = new BufferedInputStream(fis);
//        System.out.println((char) bis.read());
//        System.out.println((char) bis.read());

        bis.mark(1);//在第20个字符处标记
        for (int i = 0; i < 10 && (b = bis.read()) != -1; i++) {
            System.out.print((char) b);
        }
        System.out.println();
        bis.reset();//让光标位置重新回到标记处
        b = 0;
        for (int i = 0; i < 10 && (b = bis.read()) != -1; i++) {
            System.out.print((char) b);
        }
        System.out.println();
        bis.reset();//让光标位置重新回到标记处
        b = 0;
        for (int i = 0; i < 10 && (b = bis.read()) != -1; i++) {
            System.out.print((char) b);
        }
    }
}
2.文件流
  • FileInputStream

/**
 * 文件输入流Demo1
 * 用字节流读取文件内容含有中文的时候会出现乱码
 * 原因是因为  字节流读取的单位是8位 一个字节
 * 中文的单位为16位  两个字节  所以每次读取都只能读取一半的字节  就会出现乱码。
 * 当有中文的时候,建议使用FileReader 每次读取一个字符,英文和中文都能正常显示
 */
public class FileInputStreamDemo1 {

    public static void main(String[] args) {

        int b = 0;//接收返回的数据字节

        FileInputStream fis = null;
        try {
            fis = new FileInputStream(new File("E:/java/cd5m/offeroffer/src/com/iostream/FileInputStreamDemo1.java"));
        } catch (FileNotFoundException e) {
            System.out.println("未找到指定文件");
            System.exit(-1);
        }

        int num = 0;//记录总共读取的字节数

        try {
            while ((b = fis.read()) != -1) {
                //读取到-1的时候说明已经到了文件末尾了
                System.out.print((char)b);
                num++;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("总共读取了 "+num+" 个字节");
    }

}

  • FileOutputStream

/**
 * 文件输出流练习
 * 字节输出流当输出的内容占2个字节 也会出现乱码的前情况
 */
public class FileOutputStreamDemo1 {
    public static void main(String[] args) {
        int b = 0;
        FileInputStream fis = null;
        FileOutputStream fos = null;

        try {
            fis = new FileInputStream(new File("offeroffer.iml"));//读取文件内容
            fos = new FileOutputStream(new File("test.txt"));//输出内容到文件
        } catch (FileNotFoundException e) {
            System.out.println("未找到指定文件");
            System.exit(-1);
        }

        try {
            while ((b=fis.read())!=-1){
                fos.write(b);
            }
        } catch (IOException e) {
            System.out.println("复制文件失败");
        }

        System.out.println("文件复制成功");

    }
}

  • FileWriter && FileReader

public class FileWriterReaderDemo1 {
    public static void main(String[] args) throws IOException {
        //将1~~6000的字符数据写入到文件 data.dat中
        FileWriter fw = null;
        try {
            fw = new FileWriter(new File("data.dat"));
            for (int i=1;i<=60000;i++){
                fw.write(i);
            }
        } catch (IOException e) {
            System.out.println("写入数据失败");
            System.exit(-1);
        }

        FileReader fr = new FileReader(new File("data.dat"));
        int b = 0;
        while((b=fr.read())!=-1){
            System.out.println(b);
        }


        fw.close();


    }
}

3.数据流
  • DataOutputStream & DataInputStream

public class DataStreamDemo1 {
    public static void main(String[] args) throws IOException {
        //调用构造方法的时候会在内存中创建一个ByteArray字节数组
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        //套接上一层数据流,用来处理int double 类型的数据
        DataOutputStream dos = new DataOutputStream(baos);
        //写入的数据都会存放在  ByteArrayOutputStream  的Byte 数组buf里面
        dos.writeBoolean(false); //写入boolean类型的数据
        dos.writeDouble(Math.random());

        //读取刚刚的数据,要按照存放的顺序读取
        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        System.out.println(bais.available());
        //包装一层数据流,用来读取int double 类型的数据
        DataInputStream dis = new DataInputStream(bais);
        System.out.println(dis.readBoolean());
        System.out.println(dis.readDouble());

    }
}

4.转换流
  • OutputStreamWriter
public class OutputStreamWriterDemo1 {
    public static void main(String[] args) throws Exception {
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("test.txt"));
        osw.write("Hello World!");
        System.out.println(osw.getEncoding());
        osw.close();

    }
}
  • InputStreamReader
public class InputStreamReaderDemo1 {
    public static void main(String[] args) throws IOException {
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        String s = br.readLine();
        while (s != null) {
            if (s.equals("exit")) break;
            System.out.println(s);
            s = br.readLine();
        }
        br.close();
        isr.close();
    }
}

暂时就记录到这里,学到了更多的知识再进行记录 有问题请联系 QQ914456697

不怕学得少,就怕不学习

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值