IO流输入输出总结及案例【无标题】


IO流(字节流):

输入(Input)/ 输出(Output)
流:数据在设备间的传输称为流
IO流的分类 :

(输入输出都是相对于内存而言)

输入流:读数据(内存读入数据)
输出流:写数据(内存向磁盘写数据)

字节流:字节输入流和字节输出流
IO流的使用场景:
操作的是图片、视频、音频等二进制文件,使用字节流
如果不确定文件类型,优先使用字节流。字节流是万能的流


字节流:
字节输出流(写入数据)
使用字节输出流写数据的步骤:

创建字节输出流(FileOutputStream)对象,让字节输出流对象指向文件
调用字节输出流对象的写数据方法
释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)
输出流写数据的方法分类:

方法名     说明
void write(int b)     将指定的字节写入此文件输出流 一次写一个字节数据
void write(byte[] b)    将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据
void write(byte[] b, int off, int len)    将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据
代码示例:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
 
public class OutPutDemo {
    public static void main(String[] args) throws IOException {
        //创建输出流对象fos,参数可以是String或者是File对象
        OutputStream fos = new FileOutputStream("day11_exercise\\aaa.txt");
        byte[] bt = {97,98,99,100,101,102,103,104};
        int a = 97;
        //写数据的三种方法
        //file.write(a);
        //file.write(bt);
        fos.write(bt, 0, 5);
        //释放资源
        fos.close();
    }
}

 字节输出流写数据实现换行和不覆盖写入:

import java.io.FileOutputStream;
import java.io.IOException;
 
public class OutputStreamDemo {
    public static void main(String[] args) throws IOException {
        //创建字节输出流对象,第二个参数传入true可以实现数据追加输入
        FileOutputStream fos = new FileOutputStream("day11_exercise\\fos.txt",true);
 
        /*  写数据实现换行
                - windows:\r\n
                - linux:\n
                - mac:\r
         */
        for (int i = 0; i < 10; i++) {
            //必须以字节类型写入调用getBytes方法,返回的是一个byte型数组
            fos.write("hello".getBytes());
            fos.write("\r\n".getBytes());
        }
        //释放资源
        fos.close();
    }
}

 1.2 字节输出流写数据的异常处理
异常处理格式:try-catch-finally(被finally控制的语句一定会执行,用于实现资源释放 )

try{
    可能出现异常的代码;
}catch(异常类名 变量名){
    异常的处理代码;
}finally{
    执行所有清除操作;
}


示例代码:

public class FileOutputStreamDemo04 {
    public static void main(String[] args) {
        //加入finally来实现释放资源
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("myByteStream\\fos.txt");
            fos.write("hello".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

1.3 字节输入流(读取数据)
字节输入流,以实际存在文件路径作为参数,创建一个FileInputStream对象,该路径可以是String类型也可以是File类型

字节输入流读取数据的步骤:

创建字节输入流对象(FileInputStream)
调用字节输入流对象的读数据方法
释放资源
 read一次读取一个字节:

import java.io.FileInputStream;
import java.io.IOException;
 
public class InputDemo {
    public static void main(String[] args) throws IOException {
        //创建一个字节输入流对象fis
        FileInputStream fis = new FileInputStream("day11_exercise\\aaa.txt");
        int b ;//用于记录读入内存的字节
        //若文件读取完毕会返回-1
        while((b = fis.read()) != -1){
            System.out.println((char)b);
        }
        //释放资源
        fis.close();
    }
}

 read一次读入一个字节数组:

import java.io.FileInputStream;
import java.io.IOException;
 
public class InputStreamDemo {
    public static void main(String[] args) throws IOException {
        //创建字节输入流对象
        FileInputStream fis = new FileInputStream("myByteStream\\fos.txt");
 
        byte[] bys = new byte[1024]; //临时存放读入内存的字节,一次读取1024字节
        int len;//若文件读取完毕返回-1
        //循环读取
        while ((len=fis.read(bys))!=-1) {
            //使用平台的默认字符集解码指定的字节子阵列来构造新的String对象,并打印
            System.out.print(new String(bys,0,len));
        }
        //释放资源
        fis.close();
    }
}

1.4 利用字节输入和输出流复制文件
实现步骤:

根据数据源地址创建字节输入流对象
根据目的地地址创建字节输出流对象
读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
释放资源
实现代码:

import java.io.*;
 
public class copyDemo {
    public static void main(String[] args) throws IOException {
        File file = new File("E:\\网络图片\\05.jpg");
        //创建输入流对象
        FileInputStream fis = new FileInputStream(file);
        //创建输出流对象
        FileOutputStream fos = new FileOutputStream("day11_exercise\\" + file.getName());
        int len;
        byte[] bys = new byte[1024];
        //一次读入一个字节数组
        while((len = fis.read(bys))!=-1){
            //一次写入一个字节数组
            fos.write(bys);
        }
        //释放资源
        fis.close();
        fos.close();
    }
}

2.字符流
2.1 字符流写数据的5种方式
方法    描述
void write(int c)    写一个字符
void write(charl[] cbuf)     写入一个字符数组
void write(char[] cbuf, int off, int len)    写入字符数组的一部分
void write(String str)     写一个字符串
void write(String str, int off, int len)     写一个字符串的一部分
2.2  字符流读数据的两种方式
方法    描述
int read()    —次读一个字符数据
int read(char[]cbuf)    一次读一个字符数组数据
练习 :

​
import java.io.*;
 
public class Character {
    public static void main(String[] args) throws IOException {
// 字符流写数据
        OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("C:\\data\\writer.txt"));
// 写一个字符,结果为:d
        osw.write(100);
// 写入一个字符数组,结果为:def
        char[] c={100,101,102};
        osw.write(c);
//写入字符数组的一部分,结果为:ef
        osw.write(c,1,2);
// 写一个字符串,结果为:落霞与孤鹜齐飞,秋水共长天一色
        String s="落霞与孤鹜齐飞,秋水共长天一色";
        osw.write(s);
//  写一个字符串的一部分,结果为:孤鹜齐飞
        osw.write(s,3,4);
        osw.close();
// 字符流读数据
        InputStreamReader isr=new InputStreamReader(new FileInputStream("C:\\data\\将进酒.txt"),"UTF-8");
// —次读一个字符数据,这里的结果是将进酒这首诗
        int ch;
        while((ch=isr.read())!=-1){
            System.out.print((char)ch);
        }
//一次读一个字符数组的数据,结果还是将进酒这首诗
        char[] cr=new char[1024];
        int len;
        while((len=isr.read(cr))!=-1){
            System.out.print(new String(cr,0,len));
        }
        isr.close();
    }
}

​

2.3 字符缓冲流 
1、BufferedReader

从字符输入流读取文本。缓冲字符,以提供字符,数组和行的高效读取。
可以指定缓冲区大小,或者可以使用默认大小。默认值足够大,可用于大多数用途。
构造方法:BufferedReader(Reader in)

2、BufferedWriter

将文本写入字符输出流,缓冲字符、数组和字符串的高效写入
可以指定缓冲区大小,也可以接受默认大小。默认值足够大,可用于大多数用途。
构造方法:BufferedWriter (Writer out)

3、对字符缓冲流的练习

import java.io.*;
 
public class BufferTest {
    public static void main(String[] args) throws IOException {
//        BufferedWriter bw=new BufferedWriter(new FileWriter("C:\\data\\buffer.txt"));
//        bw.write("万里悲秋常作客,百年多病独登台");
//        bw.close();
        BufferedReader br=new BufferedReader(new FileReader("C:\\data\\将进酒.txt"));
 
//        readLine读取一行
//        String s;
//        while((s=br.readLine())!=null){
//            System.out.println(s);
//        }
 
//        一次读取一个字符
//        int ch;
//        while((ch=br.read())!=-1){
//            System.out.print((char) ch);
//        }
 
//        一次读取一个字符数组
        char[] c=new char[1024];
        int len;
        while((len=br.read(c))!=-1){
            System.out.print(new String(c,0,len));
        }
        br.close();
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值