文件与IO流

流的分类

按流的的方向来分(程序运行的内存为参照):

  • 输入流:只能从中读取数据,不能向其写数据 。由InputStream和Reader作为基类。
  • 输出流:只能往里面写数据,不能读取数据。由OutputStream和Writer作为基类。

按操作的数据单元来分:

  • 字节流:操作的最小数据单元是8位的字节。由InputStream和OutputStream作为基类。
  • 字符流:操作的最小数据单元是16位的字符。由Reader和Writer作为基类。
字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer

按流的角色分:

  • 节点流:可以从/向一个特定的IO设备(如磁盘,网络)读/写数据的流。
  • 处理流:对一个已经存在的流进行连接或封装,通过封装后的流来实现数据的读写功能。

现阶段我一般用的是节点流,处理流还不会。

字节流和字符流

输入流InputStream和Reader

InputStream和Reader都是抽象类,故不能创建实例来执行输入操作。但是它们是输入流的基类,它们的方法是所有输入流都可以使用的方法。
InputStream类的方法

int read():从输入流中读取单个字节,返回所读取的数据(字节数据可以直接转换成int类型)。
int read(byte[] b):从输入流中读取最多b.lenth长度的字节,并将其存放在字节数组b中,返回读取的字节数。
//从输入流中读取最多len长度的字节,存放在字节数组b中(在off位置开始存放),返回实际读取的字节数
int read(byte[] b,int off,int len)

Reader类的方法

int read():从输入流中读取单个字符,返回所读取的数据(字节数据可以直接转换成int类型)。
//从输入流中读取最多b.lenth长度的字符,并将其存放在字节数组b中,返回读取的字节数。
int read(char[] cbuf)
//从输入流中读取最多len长度的字符,存放在字节数组b中(在off位置开始存放),返回实际读取的字节数
int read(char[] cbuf,int off,int len)

不管是字节流还是字符流,上面的方法都是可以重复使用的。每次调用后,输入流的指针都会向后移动读取的字节/字符个数的位。当read方法放回-1时,表示该输入流已经被读完了。

package com.test2;

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

public class FileInputStreamTest {
    public static void main(String[] args){
        FileInputStream fis = null;
        byte[] buf = new byte[64];
        System.out.println("开始读取数据");
        try {
            //使用绝对路径来定位指定文件,由于\代表是转义字符,故需要\\作为目录分隔符
            fis = new FileInputStream("G:\\03 code\\Java\\15\\src\\com\\test2\\FileInputStreamTest.java");
            //fis = new FileInputStream("FileInputStreamTest.java");
            int hasRead = 0;
            while ((hasRead=fis.read(buf)) > 0){
                System.out.println("输入流读取的数据是:");
                //使用平台默认的字符集,将字节数组buf的第0位,长度hasRead的子数组解码成一个新的String对象
                System.out.printf(new String(buf,0,hasRead));

            }
            fis.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

输入流移动指针的方法

void mark(int readAheadLimit):在指针当前位置记录一个标记
boolean markSupported(): 判断此输入流是否支持mark操作
void reset(): 将指针重新定位到上一级标记处
long skip(long n): 指针向前移动n个字节/字符

RandomAccessFile

与普通的输入输出流不同。

  1. 它既可以向文件读入内容,也可以向文件写入数据。
  2. 支持直接跳转到文件的任意位置来读写数据。

猜你喜欢

转载自blog.csdn.net/u012881002/article/details/84555068