Java之I/O流


学习IO一直零零散散的,今天特地看教程、翻阅资料做笔记整理下I/O这块。

IO流用来处理设备间的数据传输。Java程序用“流”的方式进行数据输入、输出操作。java.io包下提供各种“流”类和接口获取不同种类的数据,并通过标准的方法输入输出数据。

数据流的API结构

这里写图片描述

流的分类
这里写图片描述

这里写图片描述

IO流体系
这里写图片描述

>字节流和字符流
字节流读取时,读到一个字节就返回一个字节,可以处理所有类型数据,如文本、图片、mp3、avi等;
字符流能读到多个字节(中文对应字节数是2个,UTF-8码表是3个字节),先查指定编码表,将查到字符返回。只能处理字符数据,处理纯文本数据优先考虑使用字符流,其他类型数据用字节流。

>节点流(直接作用于文件的)和处理流
这里写图片描述

这里写图片描述

>四大抽象基类及常用方法
这里写图片描述这里写图片描述

>文件流(节点流)
|-FileInputStream |-FileOutPutStream
|-FileReadr |-FileWriter

示例代码

package com.afy.iodemo;

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

public class FileInputOutputStreamDemo {

    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("a.gif");
        FileOutputStream fos = new FileOutputStream("b.gif");
        byte input[] = new byte[50];
        while (fis.read(input)!=-1) {
            fos.write(input);
        }       
        fis.close();
        fos.close();
        System.out.println("done");
    }

}
package com.afy.iodemo;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileReaderWriterDemo {

    public static void main(String[] args) {
        FileReader fr = null;
        FileWriter fw = null;
        char c[] = null;
        int len;
        try {
            File src = new File("yoyo.txt");
            File dest = new File("yoyo1.txt");
            fr = new FileReader(src);
            fw = new FileWriter(dest);
            c = new char[40];
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            while ((len=fr.read(c))!=-1) {
                fw.write(c,0, len);
            }
        fw.close();
        fr.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}


>缓冲流
|-BufferedInputStream |-BufferedOutputStream
|-BufferedReader |-BufferedWriter

属于处理流的一种,可以提高读写效率

示例代码:

package com.afy.iodemo;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedInputOutputDemo {

    public static void main(String[] args) {
        try {
            FileInputStream fis = new FileInputStream("reread.wmv");
            BufferedInputStream bis =  new BufferedInputStream(fis,1000000);
            FileOutputStream fos = new FileOutputStream("newmovie.wmv");
            BufferedOutputStream bos = new BufferedOutputStream(fos,1000000);
            byte input[] = new byte[100000];
            int count = 0;
            long before = System.currentTimeMillis();
            while (bis.read(input)!=-1) {
                count++;
                bos.write(input);
            }
            System.out.println(count+"次");
            System.out.println("读取时间为:"+(System.currentTimeMillis()-before)+"ms");
            bis.close();
            fis.close();
            bos.close();
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

BufferedReader和BufferedWriter示例与上例类似,其中BufferedReader提供readLine()方法来读取一行字符串,BufferedWriter虽有提供write(String sr)方法,但无法写出一行字符串,只能用打印流PrintWriter中的println(String x)方法写出一行字符串。要注意的是在使用缓冲流写出数据的时候,当写出的数据还没填满缓冲区时,缓冲区里的内容有时候是不会写到文件里的,会造成在写出文件时文件部分丢失,解决方法是在完成写出操作后调用相应流的fluch()方法将当前缓冲区所有的内容进行强制输出。


>转换流

|-InputStreamReader 字节流转字符流
|-OutputStreamWriter 字符流转字节流

首先它们是字符流,然后InputStreamReader的read()方法没有提供读取一个字符串的方法,直接读取一个或一行字符串会变得很麻烦,解决方案是BufferedReader的readLine()方法,一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回。当读到末尾时,返回null。然而在使用BufferedWriter中的write(String,str)写出字符串时却并没有写出换行的字符串;同样,OutputStreamWriter的write()方法中虽然有write(String str)方法,但也无法写出一行字符串,这样写出的文本没法换行。解决方案是PrintWriter类(打印流)中的println(String x)方法,

>难点易混淆点

|->BufferedReader中的readLine()方法

|->PrintWriter中的println(String x)<方法

|->写出文件后添加的相应流的flush()方法

>遗留问题

|-字节流的read()方法读取一个字节为什么返回的是int类型,而不是byte类型?

|-write()方法一次写入一个字节,接收的是一个int类型的数值,但只保留原字节,并在剩余二进制位补0?

^_^你造这是神马鬼吗?Please tell me,thx!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值