首页 > 其他 > 详细

IO流

时间:2019-12-13 10:32:40      阅读:83      评论:0      收藏:0      [点我收藏+]


1. Stream


1 不同设备之间的数据传输就是流,可以抽象理解供水厂到家庭之间的水管,水(数据)在管道传输,就成了流


2 根据流向分为输出流和输入流

  • 数据从文件流向程序称为输入流

  • 数据从程序流向文件称为输出流


3 根据数据类型分为字节流和字符流

  • 字节流处理字节数据

  • 字符流处理字符数据


4 IO流属于阻塞操作,一般项目中应放到子线程中,避免阻塞主线程


其中几个常见流之间的继承关系如下

技术分享图片


2. 各种流介绍


2.1 File

在了解各种流之前,先看看File类

其构造函数

File(String pathname)

//返回一个File类
//其参数地址的反斜杠应反斜杠转义C:\\Users\\Howl\\Desktop\\FileInputStream.txt

其方法

boolean exists()        //文件是否存在
boolean delete()        //删除文件
boolean createNewFile() //创建文件


2.1 字节流

能处理各类数据,比如字符和图片视频


2.1.1 FileInputStream和FileOutputStream

从本地文件读写字节流,先看二者构造函数,还有各自的方法

FileInputStream(File file)                      //参数为一个File类型       
FileOutputStream(File file, boolean append)     //第二个参数表示覆盖还是追加

FileInputStream

int read()                              //返回下一个字节的值,到了末尾返回-1
int read(byte[] b)                      //把字节放入数组b,返回读取的字节个数
int read(byte[] b,int off,int len)      //把字节放入数组b,后两参数代表始末位置,返回读取的字节个数
void close()                            //关闭流

FileOutputStream

void write(int b)                       //只读取低8位
void write(byte[] b)                    //和上面同理
void write(byte b,int off,int len)
void close()                            //关闭流


2.1.2 ObjectInputStream和ObjectOutputStream

对象的序列化和反序列化

其构造方法

ObjectInputStream (InputStream in)
ObjectOutputStream (OutputStream out)   //参数类型为字节流

其方法

返回值 函数 说明
void writeObject(Object obj) 往流中写入一个对象
Object readObject() 从流中读取一个对象

实例

public static void main(String[] args) {
    
    //准备
    User user = new User(20,"1210911104@qq.com","Howl");
    File file = new File("C:\\Users\\Howl\\Desktop\\ObjectOutputStream.txt");
    
    //自动关闭资源
    try( FileOutputStream fos = new FileOutputStream(file);
         ObjectOutputStream obs = new ObjectOutputStream(fos);){
        
        if(!file.exists()){
            file.createNewFile();
        }
    
        //先写入对象
        obs.writeObject(user);
        System.out.println("写入成功\n");
        
        //读取对象
        FileInputStream fis = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(fis);
        User user2 = (User) ois.readObject();
        System.out.println("读入成功\n" + user2.getId() + "--" + user2.getEmail() + "--" + user2.getPassword());
        
        
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

打印,桌面多了一个ObjectOutputStream.txt文件,存放序列化的对象

写入成功

读入成功
20--1210911104@qq.com--Howl


2.2 字符流

只能处理字符数据


2.2.1 InputStreamReader和OutputStreamWriter

字节流转换成字符流

其构造函数,第一个参数是字节流,第二参数指定是字符集一般写utf-8

InputStreamReader(InputStream in, Charset cs)
OutputStreamWriter(OutputStream out, Charset cs)

转换流的方法和2.1.1方法很类似但区别在于参数是byte还是int或String类型

InputStreamReader

int read()
int read(char[] cbuf, int offset, int length)

OutputStreamWriter

void write(int c)
void write(char[] cbuf, int off, int len)
void write(String str, int off, int len)


2.2.2 FileReader和FileWriter

从本地文件读写字符流

构造函数,并且方法和父类一致,这里不介绍了

FileReader(File file)
FileWriter(File file, boolean append)


2.2.3 BufferedReader和BufferedWriter

带缓冲区的流,减少访问磁盘次数,提高性能,其构造函数

BufferedReader(Reader in)       //以字符流为参数,例如FileReader
BufferedWriter(Writer out)      //以字符流为参数,例如FileWriter

BufferedReader有一个特有方法

String readLine()           //读取一行字符,返回字符串

BufferedWriter也有一个特殊方法

void newLine()              //写入行分隔符








IO流

原文:https://www.cnblogs.com/Howlet/p/12033337.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!