Java中的流从流向来分为输入流和输出流
输入流:是指java程序从外部(比如文件,内存中)读取数据
输出流:是指用java程序向外部(比如文件,内存)写入数据
JAVA中的流按照流中处理数据的方式可以分为字节流和字符流
字节流分为InputStream以及OutputStream
字符流分为Reader以及Writer
字节流
字符流
结论:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。
字节流
Writer
Writer append(char c) 将指定的字符附加到此字符流
Writer append(CharSequence csq) 将指定的字符序列附加到此字符流
Writer append(CharSequence csq, int start, int end) 将指定字符序列的子序列附加到此字符流
abstract void close() 关闭流,先刷新
abstract void flush() 刷新流
void write(char[] cbuf) 写入一个字符数组。
abstract void write(char[] cbuf, int off, int len) 写入字符数组的一部分
void write(int c) 写一个字符
void write(String str) 写一个字符串
void write(String str, int off, int len) 写一个字符串的一部分
缓冲流:BufferedInputStream ,BufferedOutputstream,BufferedWriter,BufferedReade中缓冲流相比较于其他的流效率更高,缓冲流,没有频繁的和磁盘打交道而是将数据存放再内存中,最后再和磁盘打交道,一定要刷新要不不会写入磁盘
Reader
abstract void close() 关闭流并释放与之相关联的任何系统资源。
void mark(int readAheadLimit) 标记流中的当前位置。
boolean markSupported() 告诉这个流是否支持mark()操作。
int read() 读一个字符
int read(char[] cbuf) 将字符读入数组。
abstract int read(char[] cbuf, int off, int len) 将字符读入数组的一部分。
int read(CharBuffer target) 尝试将字符读入指定的字符缓冲区。
boolean ready() 告诉这个流是否准备好被读取。
void reset() 重置流。
long skip(long n) 跳过字符
字节流
IntputStream
int available() 从下一次调用此输入流的方法返回可从该输入流读取(或跳过)的字节数,而不会阻塞。
void close() 关闭此输入流并释放与流相关联的任何系统资源。
void mark(int readlimit) 标记此输入流中的当前位置。
boolean markSupported() 测试此输入流是否支持 mark和 reset方法。
abstract int read() 从输入流读取数据的下一个字节。
int read(byte[] b) 从输入流中读取一些字节数,并将它们存储到缓冲器阵列 b 。
int read(byte[] b, int off, int len) 从输入流读取最多 len个字节的数据到字节数组。
byte[] readAllBytes() 从输入流读取所有剩余字节。
int readNBytes(byte[] b, int off, int len) 将所请求的字节数从输入流读入给定的字节数组。
void reset() 将此流重新定位到最后在此输入流上调用 mark方法时的位置。
long skip(long n) 跳过并丢弃来自此输入流的 n字节的数据。
long transferTo(OutputStream out) 从该输入流中读取所有字节,并按读取的顺序将字节写入给定的输出流。
OutputStream
void close() 关闭此输出流并释放与此流相关联的任何系统资源。
void flush() 刷新此输出流并强制任何缓冲的输出字节被写出。
void write(byte[] b) 将 b.length字节从指定的字节数组写入此输出流。
void write(byte[] b, int off, int len) 从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
abstract void write(int b) 将指定的字节写入此输出流。
FileInputStream
int available() 返回从此输入流中可以读取(或跳过)的剩余字节数的估计值,而不会被下一次调用此输入流的方法阻塞。
void close() 关闭此文件输入流并释放与流相关联的任何系统资源。
protected void finalize() 已过时。
finalize方法已被弃用。 为了执行清理而覆盖finalize子类应该修改为使用替代清理机制,并删除覆盖的finalize方法。 当覆盖finalize方法时,其实现必须明确确保按照super.finalize()所述调用super.finalize() 。 有关迁移选项的更多信息,请参阅Object.finalize()的规范。
FileChannel getChannel() 返回与此文件输入流相关联的唯一的FileChannel对象。
FileDescriptor getFD() 返回表示与此 FileInputStream正在使用的文件系统中的实际文件的连接的 FileDescriptor对象。
int read() 从该输入流读取一个字节的数据。
int read(byte[] b) 从该输入流读取最多 b.length个字节的数据到一个字节数组。
int read(byte[] b, int off, int len) 从该输入流读取最多 len个字节的数据到字节数组。
long skip(long n) 跳过并从输入流中丢弃 n字节的数据。
FileOutputStream
void close() 关闭此文件输出流并释放与此流相关联的任何系统资源。
protected void finalize() 已过时。
finalize方法已被弃用。 为了执行清理,覆盖finalize子类应被修改为使用替代的清理机制,并删除覆盖的finalize方法。 当覆盖finalize方法时,其实现必须明确确保按照super.finalize()中所述调用super.finalize() 。 有关迁移选项的更多信息,请参阅Object.finalize()的规范。
FileChannel getChannel() 返回与此文件输出流相关联的唯一的FileChannel对象。
FileDescriptor getFD() 返回与此流相关联的文件描述符。
void write(byte[] b) 将 b.length字节从指定的字节数组写入此文件输出流。
void write(byte[] b, int off, int len) 将 len字节从指定的字节数组开始,从偏移量 off开始写入此文件输出流。
void write(int b) 将指定的字节写入此文件输出流。
FileOutputStream和FileInputStream示例
public static void main(String[] args) throws IOException {
String pathName = "D:" + File.separator + "a.txt";
File file = new File(pathName);
OutputStream outputStream = new FileOutputStream(file);
outputStream.write("abc1".getBytes());
outputStream.close();
InputStream inputStream = new FileInputStream(file);
//这个字节数组的意思每次读取最多读取多少字符
byte[] bytes = new byte[1024];
int length = inputStream.read(bytes);
String s = new String(bytes, 0, length);
System.out.println(s);
inputStream.close();
}
BufferedInputStream和BufferedOutputStream 示例
public static void main(String[] args) throws IOException {
String pathName = "D:" + File.separator + "a.txt";
File file = new File(pathName);
BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(new File("D:" + File.separator + "b.txt")));
byte[] bytes = new byte[4];
while (inputStream.read(bytes) != -1) {
System.out.println(new String(bytes));
outputStream.write(bytes);
}
inputStream.close();
outputStream.close();
}
上面代码为把一个文件读取出来写入另一个文件