流的概念:
流是Java内存中的一组有序数据序列。Java将数据从源(文件、内存、键盘、网络)读入到内存中,形成了流,然后将这些流还可以写到另外的目的地(文件、内存、控制台、网络),之所以称为流,是因为这个数据序列在不同时刻所操作的是源的不同部分。
也可以这么理解:流在Java中是指计算中流动的缓冲区。
流的分类
字节流:
1.字节输入流类:FileInputStream、BufferedInputStream和DataInputStream
其中:
FileInputStream用于从本地文件系统中读取文件内容,
BufferedInputStream用于读取文本文件内容,它继承于FilterInputStream。
DataInputStream 是数据输入流,它继承于FilterInputStream。DataInputStream 是用来装饰其它输入流,它“允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型”。应用程序可以使用DataOutputStream(数据输出流)写入由DataInputStream(数据输入流)读取的数据。
FileInputStream:
/**
* 构造方法:
*
*·FileInputStream(File file):打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象file指定。
*·FileInputStream(String name):打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径名name指定。
*
*常用方法:
*
*·int available():返回下一次对此输入流调用的方法不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。
*·void close():关闭此文件输入流并释放与该流关联的所有系统资源。
*/
BufferedInputStream:
/**
*构造方法:
*·BufferedInputStream(InputStream in):创建一个BufferedInputStream并保存其参数,即输入流in,以便将来使用。
*·BufferedInputStream(InputStream in,int size):创建一个具有指定缓冲区大小的BufferedInputStream并保存其参数,即输入流in,以便将来使用。
*常用方法:
*·int available():返回下一次对此输入流调用的方法不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。
*·void close():关闭此输入流并释放与该流关联的所有系统资源。
*·int read():从输入流中读取数据的下一个字节。
*·int read(byte[] b,int off,int len):从此字节输入流中给定偏移量处开始将各字节读取到指定的byte数组中。
*
*
*/
DataInputStream:
/**
* 构造方法:
*·DataInputStream(InputStream in):使用指定的底层InputStream创建一个DataInputStream。
*常用方法:
*·int read(byte[] b):从包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组b中。
*·int read(byte[] b,int off,int len):从包含的输入流中将最多len个字节读入一个byte数组中。
*
*/
2.字节输出流类:FileOutputStream、BufferedOutputStream和DataOutputStream
FileOutputStream:用于从本地文件系统的文件中写入数据。BufferedOutputStream:本身带有一个缓冲区,在写入数据时,先放到缓冲区中,实现缓冲的数据流。DataOutputStream(OutputStream out):创建一个新的数据输出流,将数据写入指定基础输出流。
FileOutputStream:
/**
* 构造方法:
*·FileOutputStream(File file):创建一个向指定File对象表示的文件中写入数据的文件输出流。
*·FileOutputStream(String name):创建一个向具有指定名称的文件中写入数据的输出文件流。
*常用方法:
*·void close():关闭此文件输出流并释放与此流有关的所有系统资源。
*·FileDescriptor getFD():返回与此流有关的文件描述符。
*·void write(byte[] b):将b.length个字节从指定byte数组写入此文件输出流中。
*·void write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入此文件输出流。
*·void write(int b):将指定字节写入此文件输出流。
*
*/
BufferedOutputStream:
/**
* 构造方法:
*·BufferedOutputStream(OutputStream out):创建一个新的缓冲输出流,来将数据写入指定的底层输入流。
*·BufferedOutputStream(OutputStream out,int size):创建一个新的缓冲输出流,来将具有指定缓冲区大小的数据写入指定的底层输出流。
*常用方法:
*·void flush():刷新此缓冲的输出流。
*·void write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入此缓冲的输出流。
*·void write(int b):将指定的字节写入此缓冲的输出流。
*/
DataOutputStream(OutputStream out):
/* *
*常用方法:
*·void flush():清空此数据输出流。
*·int size():返回计数器written的当前值,即到目前为止写入此数据输出流的字节数。
*·void write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入基础输出流。
*·void write(int b):将指定字节(参数b的八个低位)写入基础输出流。
*
*/
3.实例化操作:
FileOutputStream/FileInputStream:
package 流;
import org.junit.Test;
import java.io.*;
public class TestIO {
@Test
public void test1() throws Exception{
/**
* 构造方法:
*·FileOutputStream(File file):创建一个向指定File对象表示的文件中写入数据的文件输出流。
*·FileOutputStream(String name):创建一个向具有指定名称的文件中写入数据的输出文件流。
*常用方法:
*·void close():关闭此文件输出流并释放与此流有关的所有系统资源。
*·FileDescriptor getFD():返回与此流有关的文件描述符。
*·void write(byte[] b):将b.length个字节从指定byte数组写入此文件输出流中。
*·void write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入此文件输出流。
*·void write(int b):将指定字节写入此文件输出流。
*
*/
FileOutputStream fout = new FileOutputStream ("D:/Program Files/java/流/src/流/a.txt");
byte[]b = {0,0,0,20}; //查找20号字符
fout.write (b[0]);
fout.write (b[1]);
fout.write (b[2]);
fout.write (b[3]);
fout.close (); //释放内存:void.close():关闭此文件输出流并释放与此流有关的所有系统资源。
}
@Test
public void test2() throws Exception{
/**
* 构造方法:
*
*·FileInputStream(File file):打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象file指定。
*·FileInputStream(String name):打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径名name指定。
*
*常用方法:
*
*·int available():返回下一次对此输入流调用的方法不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。
*·void close():关闭此文件输入流并释放与该流关联的所有系统资源。
*/
FileInputStream fin = new FileInputStream ("D:/Program Files/java/流/src/流/a.txt");
byte[]b = new byte[4]; //查找20号字符
b[0] = (byte)fin.read ();
b[1] = (byte)fin.read ();
b[2] = (byte)fin.read ();
b[3] = (byte)fin.read ();//按位运算
System.out.println(b[3]);
fin.close (); //释放内存:void.close():关闭此文件输出流并释放与此流有关的所有系统资源。
}
}
输出:
20
字符流:
FileReader:用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。
构造方法:
·FileReader(File file):在给定从中读取数据的File的情况下创建一个新的FileReader。
·FileReader(String fileName):在给定从中读取数据的文件名的情况下创建一个新的FileReader。
BufferedReader类是Reader类的子类,为Reader对象添加字符缓冲器,为数据输入分配内存存储空间,存取数据更为有效。
构造方法:
·BufferedReader(Reader in):创建一个使用默认大小输入缓冲区的缓冲字符输入流。
·BufferedReader(Reader in,int sz):创建一个使用指定大小输入缓冲区的缓冲字符输入流。
操作方法:
·void close():关闭该流并释放与之关联的所有资源。
·void mark(int readAheadLimit):标记流中的当前为止。
·boolean markSupported();判断此流是否支持mark()操作。
·int read():读取单个字符。
·int read(char[] cbuf,int off,int len):将字符读入数组的某一部分。
·String readLine():读取一个文本行。
·boolean ready():判断此流是否已准备好被读取。
·void reset():将流重置到最新的标记。
·long skip(long n):跳过字符。
FileWriter:用来写入字符文件的便捷类,可用于写入字符流。
构造方法:
·FileWriter(File file):根据给定的File对象构造一个FileWriter对象。
·FileWriter(String filename):根据给定的文件名构造一个FileWriter对象。
BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。