java开发的第二十个博客(IO流)

1.IO概述

1.概念

  • 数据在内存和硬盘的传输

2.分类

  • 输入流:硬盘->内存
  • 输出流:内存->硬盘
  • 字节流:单位为字节
  • 字符流:单位为字符(编码)

3.IO流顶级抽象类

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

2.字节流

1.概念

  • 字节流可以传输任意文件数据,但传输中文时可能会出现乱码

2.OutputStream共有方法

  • public void close() :关闭并刷新流
  • public void flush() :刷新流
  • public void write(byte[] b):将字节数组写入流
  • public void write(byte[] b, int off, int len) :将指定位置的字节数组写入流
  • public abstract void write(int b) :将字节写入流

3.FileOutputStream子类构造

  • public FileOutputStream(File file):创建指定File对象的流
  • public FileOutputStream(String name): 创建指定名称的流
  • public FileOutputStream(File file, boolean append): 以追加形式创建指定File对象的流
  • public FileOutputStream(String name, boolean append): 以追加形式创建指定名称的流

4.InputStream共有方法

  • public void close() :关闭并刷新流
  • public abstract int read(): 从流读取下一字节数据(无返回-1)
  • public int read(byte[] b): 从流读取下一字节数组数据(无返回-1)

5.FileInputStream子类构造

  • public FileInputStream(File file):创建指定File对象的流
  • public FileInputStream(String name): 创建指定名称的流
    注:文件不存在时会自动创建

6.使用字节流实现数据拷贝

import java.io.*;
//单个字节拷贝数据
public class demo1 {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("demo\\b.txt");
        FileReader fd = new FileReader("demo\\a.txt");
        int ch;
        while ((ch = fd.read())!=-1){
            fw.write(ch);
        }
        fw.close();
        fd.close();
    }
}
import java.io.*;
//使用字节数组拷贝数据
public class demo1 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("demo\\b.txt");
        FileInputStream fis = new FileInputStream("demo\\a.txt");
        int ch;
        byte[] by = new byte[1024];
        while ((ch = fis.read(by))!=-1){
            fos.write(by,0,ch);
        }
        fos.close();
        fis.close();
    }
}

3.字符流

1.概念

  • 只能处理纯文本文件,且字符输出流有内置数组

2.Reader共有方法

  • public void close() :关闭并刷新流
  • public int read(): 从流中读取一个字符
  • public int read(char[] cbuf): 从流中读取一个字符数组

3.FileReader子类构造

  • FileReader(File file): 创建指定File对象的流
  • FileReader(String fileName): 创建指定名称路径的流

4.Writer共有方法

  • public abstract void close() :关闭并刷新流
  • public abstract void flush() :刷新流
  • public void write(int c) :用流写出一个字符
  • public void write(char[] cbuf):用流写出一个字符数组
  • public abstract void write(char[] b, int off, int len) :用流写出一个字符数组的部分
  • public void write(String str) :用流写出一个字符串(底层会将字符串转为字符数组)

5.FileWriter子类构造

  • FileWriter(File file): 创建指定File对象的流
  • FileWriter(String fileName): 创建指定名称路径的流
  • FileWriter(String fileName, boolean append):创建指定名称路径的追加流
    注:文件不存在时会自动创建

6.使用字符流实现数据拷贝

import java.io.*;

public class demo1 {
	//使用单个字符
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("demo\\b.txt");
        FileReader fd = new FileReader("demo\\a.txt");
        int ch;
        while ((ch = fd.read())!=-1){
            fw.write(ch);
        }
        fw.close();
        fd.close();
    }
}

import java.io.*;
//使用字符数组
public class demo1 {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("demo\\b.txt");
        FileReader fd = new FileReader("demo\\a.txt");

        int ch;
        char[] chars = new char[1024];
        while ((ch = fd.read(chars))!=-1){
            fw.write(chars,0,ch);
        }
        fw.close();
        fd.close();
    }
}

7.补充

面试题:flush和close的区别?
  • flush只会刷新缓冲区,流对象还可以继续使用
  • close会关闭流并刷新缓冲区,流对象不能继续使用

4.IO异常处理

1.JDK7前

import java.io.*;

public class demo1 {
    public static void main(String[] args)  {
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("demo\\a.txt");
            fos.write(99);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try { //先判断流对象是否存在,否则可能导致空指针异常
                if (fos!=null) {
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

2.JDK7及以后

import java.io.*;
//try()里面的流对象都继承了AutoCloseable自动关闭接口
public class demo1 {
    public static void main(String[] args)  {
        try (FileOutputStream fos = new FileOutputStream("demo\\a.txt");){
            fos.write(99);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5.属性集合(Properties)

1.概念

  • JDK1出现的属性集合类,拥有双列集合的功能(没有泛型约束)和表示一个持久的属性集合

2.构造方法

  • public Properties() :创建一个空的属性列表

3.基本存储方法

  • public Object setProperty(String key, String value) : 保存一对属性。
  • public String getProperty(String key) :根据键找值
  • public Set stringPropertyNames() :所有键的名称的集合

4.加载文件配置信息方法

public void store(OutputStream out,String comments):往
public void load(InputStream inStream): 从字节输入流中读取关联的文件到集合中,一般存储键值对。

FileOutputStream fos = new FileOutputStream("day09\\data.txt");//持久化保存到硬盘永久的
p.store(fos,null);//把p里面内容保存到fos输出流关联的文件,null对文件注释
FileInputStream fis = new FileInputStream("day09\\data2.properties");
//扩展输入流,类加载器有方法把文件变成输入流(src文件夹才有效)
InputStream fis = Test08.class.getClassLoader().getResourceAsStream("data2.properties");
p.load(fis);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值