学习IO的一些理解

学习IO的一些理解

IO 是 Input(输入)和 Output(输出)的简称。在计算机中,输入就是从硬盘中读取数据,送到内存中,就是 read ;输出就是将内存中的数据写到硬盘中,就是 write 。

在Java中,数据的输入与输出操作,一般以“流”的方式进行。Java中的 java.io 包中为我们提供了各种流的接口,并且进行了分类:按照数据流的流向不同,分为了输入流与输出流;按照操作数据单位的不同,分为了字节流和字符流;按照流的功能分为节点流和处理流。

输入流是指从外部往内存中存数据,就是 Input;输出流是指从内存往外部读取数据,就是 Output。

字节流就是指在输入或输出读取数据时,一次只读取一个字节的数据,字符流指读取数据时,一次读取一个字符。字节流可以读取任何形式的数据,如文本文件、图片、视频等,而字符流只能读取纯文本形式的数据。

下面是Java输入输出流中常用的一些类

分类字节输入流字节输出流字符输入流字符输出流
抽象父类InputStreamOutputStreamReaderWriter
访问文件FileInputStreamFileOutputStreamFileReaderFileWriter
访问数组ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter
访问管道PipedInputStreamPipedOutputStreamPipedReaderPipedWriter
访问字符串StringReaderStringWriter
缓冲流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter
转换流InputStreamReaderOutputStreamWriter
对象流ObjectInputStreamObjectOutputStream
装饰流FilterInputStreamFilterOutputStreamFilterReaderFilterWriter
打印流PrintStreamPrintWriter
数据过滤流DataInputStreamDataOutputStream

由图可知,带有 Stream 的都是字节流,带有 ReaderWriter 则是字符流。因此我们可以进行一定的猜测,以后我们遇到的带有 Stream 的流,都可以认定为字节流,而带有 Reader 或者 Writer 的都可以认为是字符流。

在经过一段时间的学习后,我现在能够进行一些基础的IO操作,例如将一个文件中的内容拷贝到另一个文件中,并将其打印出来。

代码

字节流

Reader_WriterTest.java

package com.why.filetest;

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

public class Reader_WriterTest {
    public void test() {
        FileReader fr = null;
        FileWriter fw = null;
        try {
            // 需要在后面的括号中填入需要文件的路径
            File file1 = new File("C:\\Users\\why\\code\\Demo\\src\\com\\why\\filetest\\hello.txt");
            File file2 = new File("C:\\Users\\why\\code\\Demo\\src\\com\\why\\filetest\\copyhello.txt");
            // 创建输入输出流对象
            fr = new FileReader(file1);
            fw = new FileWriter(file2);
            // 创建一个字符型的数组用于读取带到的存储数据
            char[] arr = new char[(int)file1.length()];
            // 记录字符的个数
            int len;
            while ((len = fr.read(arr)) != -1) {
                fw.write(arr, 0, len);
                System.out.println(arr);
            }
        }
        catch (IOException e) {
            e.printStackTrace(); // 简单说明异常
        }
        // 关闭流
        finally {
            if(fw != null) {
                try {
                    fw.close();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fr != null) {
                try {
                    fr.close();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

字符流

StreamTest.java

package com.why.filetest;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class StreamTest {
    public void test() {
        File file = new File("C:\\Users\\why\\code\\Demo\\src\\com\\why\\filetest\\copyhello.txt");
        FileInputStream fis = null;
        try {
            // 创建输入流对象
            fis = new FileInputStream(file);
            byte[] arr = new byte[(int)file.length()];
            int len;
            while ((len = fis.read(arr)) != -1) {
                // 文件中存储的是字符型数据,因此需要进行转换才能正常输出
                String str = new String(arr, 0, len);
                System.out.println(str);
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        // 关闭流
        finally {
            if(fis != null) {
                try {
                    fis.close();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

IOTest.java

package com.why.filetest;

import java.io.*;

public class IOTest {
    public static void main(String[] args) {
        Reader_WriterTest t1 = new Reader_WriterTest();
        StreamTest t2 = new StreamTest();
        t1.test();
        // 运行了Reader_WriterTest后,查看复制是否成功
        t2.test();
    }
}

运行结果

注意 : 在使用完流之后一定要关闭流!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值