JAVA基础(十五)——IO流

28 篇文章 5 订阅

概念:
IO流来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中
流按操作数据分为两种:字节流(图片,纯文本数据)与字符流(文字)
流按流向分为:输入流,输出流。

在这里插入图片描述

一、字符流:
写:
在这里插入图片描述

在这里插入图片描述
读:
在这里插入图片描述
在这里插入图片描述
复制文件:
在这里插入图片描述
在这里插入图片描述
Windows换行:\r\n
Linux换行:\n

IO异常处理方式:

import java.io.FileWriter;
import java.io.IOException;

public class FileWriteDemo {
    public static void main(String[] args) {
        FileWriter fw = null;
        try {
            fw = new FileWriter("demo.txt");
            fw.write("Hello Java");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if( fw != null)
                    fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import java.io.FileReader;
import java.io.IOException;

public class MyBuffereReader {
    private FileReader r;
    MyBuffereReader(FileReader r){
        this.r = r;
    }
    //定义一个可以一次读一行数据的方法
    public String myReadLine() throws IOException {
        //定义一个临时容器。原BuffereReader封装的是字符数组。
        //定义一个StringBuilder容器。因为最终还是要将数组编程字符串
        StringBuilder sb = new StringBuilder();
        int ch = 0;
        while((ch = r.read()) != -1)
        {
            if(ch == '\r')
                continue;
            if(ch == '\n')
                return sb.toString();
            else
                sb.append((char)ch);
        }
        if(sb.length()!=0)
            return sb.toString();
        return null;
    }
    public void myClose() throws IOException {
        r.close();
    }
}

class ReaderDemo{
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("a.txt");
        MyBuffereReader myfr = new MyBuffereReader(fr);
        String line;
        while((line =myfr.myReadLine()) != null){
            System.out.println(line);
        }
        myfr.myClose();

    }
}

源码:

String readLine(boolean ignoreLF) throws IOException {
        StringBuffer s = null;
        int startChar;

        synchronized (lock) {
            ensureOpen();
            boolean omitLF = ignoreLF || skipLF;

        bufferLoop:
            for (;;) {

                if (nextChar >= nChars)
                    fill();
                if (nextChar >= nChars) { /* EOF */
                    if (s != null && s.length() > 0)
                        return s.toString();
                    else
                        return null;
                }
                boolean eol = false;
                char c = 0;
                int i;

                /* Skip a leftover '\n', if necessary */
                if (omitLF && (cb[nextChar] == '\n'))
                    nextChar++;
                skipLF = false;
                omitLF = false;

            charLoop:
                for (i = nextChar; i < nChars; i++) {
                    c = cb[i];
                    if ((c == '\n') || (c == '\r')) {
                        eol = true;
                        break charLoop;
                    }
                }

                startChar = nextChar;
                nextChar = i;

                if (eol) {
                    String str;
                    if (s == null) {
                        str = new String(cb, startChar, i - startChar);
                    } else {
                        s.append(cb, startChar, i - startChar);
                        str = s.toString();
                    }
                    nextChar++;
                    if (c == '\r') {
                        skipLF = true;
                    }
                    return str;
                }

                if (s == null)
                    s = new StringBuffer(defaultExpectedLineLength);
                s.append(cb, startChar, i - startChar);
            }
        }
    }

在这里插入图片描述
BufferedReader和BufferedWriter都是Reader和Writer的装饰类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最终版本:装饰设计方式,继承体系超类。

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class MyBuffereReader extends Reader {
    private Reader r;
    MyBuffereReader(Reader r){
        this.r = r;
    }
    //定义一个可以一次读一行数据的方法
    public String myReadLine() throws IOException {
        //定义一个临时容器。原BuffereReader封装的是字符数组。
        //定义一个StringBuilder容器。因为最终还是要将数组编程字符串
        StringBuilder sb = new StringBuilder();
        int ch = 0;
        while((ch = r.read()) != -1)
        {
            if(ch == '\r')
                continue;
            if(ch == '\n')
                return sb.toString();
            else
                sb.append((char)ch);
        }
        if(sb.length()!=0)
            return sb.toString();
        return null;
    }

    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        return r.read(cbuf,off,len);
    }

    @Override
    public void close() throws IOException {
        r.close();
    }

    public void myClose() throws IOException {
        r.close();
    }
}

class ReaderDemo{
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("a.txt");
        MyBuffereReader myfr = new MyBuffereReader(fr);
        String line;
        while((line =myfr.myReadLine()) != null){
            System.out.println(line);
        }
        myfr.myClose();

    }
}

在这里插入图片描述
自己写LineNumberReader:

class MyLineNumberReader{
    private Reader r;
    private int lineNumber;
    MyLineNumberReader(Reader r){
        this.r = r;
    }

    public int getLineNumber() {
        return lineNumber;
    }

    public void setLineNumber(int lineNumber) {
        this.lineNumber = lineNumber;
    }

    public String myReaderLine() throws IOException{
        lineNumber++;
        StringBuilder sb = new StringBuilder();
        int ch = 0;
        while((ch = r.read()) != -1)
        {
            if(ch == '\r')
                continue;
            if(ch == '\n')
                return sb.toString();
            else
                sb.append((char)ch);
        }
        if(sb.length()!=0)
            return sb.toString();
        return null;
    }
    public void myClose() throws IOException {
        r.close();
    }
}

class ReaderDemo{
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("a.txt");
        MyLineNumberReader myfr = new MyLineNumberReader(fr);
        String line;
        while((line =myfr.myReaderLine()) != null){
            System.out.println(myfr.getLineNumber() + "::" + line);
        }
        myfr.myClose();

    }
}

继承BufferedReader:提高代码复用性

class MyLineNumberReader  extends MyBuffereReader{
    private Reader r;
    private int lineNumber;
    MyLineNumberReader(Reader r){
        super(r);
    }

    public int getLineNumber() {
        return lineNumber;
    }

    public void setLineNumber(int lineNumber) {
        this.lineNumber = lineNumber;
    }

    public String myReaderLine() throws IOException{
        lineNumber++;
        return super.myReadLine();
    }

}
  1. 输入流

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  1. 输出流
    在这里插入图片描述
    在这里插入图片描述
    注意:上面少了一个释放资源, f r . c l o s e ( ) fr.close() fr.close().

练习:
在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述

练习:文件复制
在这里插入图片描述

  1. 缓冲流的基本使用:
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

缓冲流复制文件:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

缓冲区的特殊功能:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

复制文件:
在这里插入图片描述

总结:5种方式复制文本:

import java.io.*;

public class CopyTest {
    public static void main(String[] args) throws IOException{
        String srcFileName = "FileWrite.java";
        String destFileName = "Copy.java";

        method1(srcFileName,destFileName);
        method2(srcFileName,destFileName);
        method3(srcFileName,destFileName);
        method4(srcFileName,destFileName);
//        method5(srcFileName,destFileName);
    }

    //基本流一次读写一个字符
    public static void method1(String srcFileName, String destFileName) throws IOException{
        //创建输入流对象
        FileReader fr = new FileReader(srcFileName);
        //创建输出流对象
        FileWriter fw = new FileWriter(destFileName);

        //一次读写一个字符
        int ch;
        while((ch = fr.read()) != -1)
        {
            fw.write(ch);
        }

        //释放资源
        fw.close();
        fr.close();
    }
    //基本流一次读写一个字符
    public static void method2(String srcFileName, String destFileName) throws IOException{
        //创建输入流对象
        FileReader fr = new FileReader(srcFileName);
        //创建输出流对象
        FileWriter fw = new FileWriter(destFileName,true);

        //一次读写一个字符
        char[] chs = new char[1024];
        int len;
        while((len = fr.read(chs)) != -1)   //函数原型  public int read(char cbuf[]) throws IOException
        {
            fw.write(chs,0,len);    //public void write(char cbuf[], int off, int len) throws IOException
        }

        //释放资源
        fw.close();
        fr.close();
    }

    //缓冲流一次读写一个字符
    public static void method3(String srcFileName, String destFileName) throws IOException
    {
        //创建输入缓冲对象
        BufferedReader br = new BufferedReader(new FileReader(srcFileName));
        //创建输出缓冲对象
        BufferedWriter bw = new BufferedWriter(new FileWriter(destFileName,true));

        //一次读写一个字符
        int ch;
        while((ch = br.read()) != -1){
            bw.write(ch);
        }
        //释放资源
        bw.close();
        br.close();
    }

    //缓冲流一次读写一个字符数组
    public static void method4(String srcFileName, String destFileName) throws IOException
    {
        //创建输入缓冲对象
        BufferedReader br = new BufferedReader(new FileReader(srcFileName));
        //创建输出缓冲对象
        BufferedWriter bw = new BufferedWriter(new FileWriter(destFileName,true));

        //一次读写一个字符数组
        char[] chs = new char[1024];
        int len;
        while((len = br.read(chs)) != -1){
            bw.write(chs,0,len);
        }

        //释放资源
        bw.close();
        br.close();
    }

    //缓冲流一次读写一个字符串
    public static void method5(String srcFileName, String destFileName) throws IOException
    {
        //创建输入缓冲对象
        BufferedReader br = new BufferedReader(new FileReader(srcFileName));
        //创建输出缓冲对象
        BufferedWriter bw = new BufferedWriter(new FileWriter(destFileName,true));

        //一次读写一个字符串
        String line;
        while((line = br.readLine()) != null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        //释放资源
        bw.close();
        br.close();
    }
}

练习:把集合元素写到文本文件中

在这里插入图片描述
在这里插入图片描述

练习:把文本文件中的数据读取到集合中:
在这里插入图片描述
在这里插入图片描述
二、字节流
不涉及刷新,不涉及到任何转换
在这里插入图片描述

总结:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值