JDK所提供的所有流类位于java.io包中,都分别继承自以下四种抽象流类:
InputStream:继承自InputStream的流都是用于向程序中输入数据的,且数据单位都是字节(8位)。
OutputSteam:继承自OutputStream的流都是程序用于向外输出数据的,且数据单位都是字节(8位)。
Reader:继承自Reader的流都是用于向程序中输入数据的,且数据单位都是字符(16位)。
Writer:继承自Writer的流都是程序用于向外输出数据的,且数据单位都是字符(16位)。
Java流的分类
按流向分:
输入流: 程序可以从中读取数据的流。
输出流: 程序能向其中写入数据的流。
按数据传输单位分:
字节流: 以字节为单位传输数据的流
字符流: 以字符为单位传输数据的流
按功能分:
节点流: 用于直接操作目标设备的流
过滤流: 是对一个已存在的流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能。
tips:
输出流InputStreamReader负责将InputStream转化成Reader,而OutputStreamWriter则将OutputStream转化成Writer。
输入流
package base;
import java.io.*;
import java.nio.CharBuffer;
public class BaseStream {
public static void main(String[] args) throws Exception{
File file = new File("src/base/1.txt");//程序默认启动实在项目目录下,文件的相对位置随启动程序的位置
//1.文件输入流FileInputStream(字节流)
// FileInputStream fileInputStream = new FileInputStream(file);
// byte []b= new byte[256];
// fileInputStream.read(b);
// System.out.println(new String(b));
// fileInputStream.close();
// System.out.println(file.length()+":"+file.exists()+":"+file.getAbsolutePath());
//2.文件输出流fileOutputStream(字节流)用于二进制文件诸如图片,视频等
// FileOutputStream fileOutputStream = new FileOutputStream(file,true);
// fileOutputStream.write(2);
// fileOutputStream.flush();
// fileOutputStream.close();//要有随手关闭的习惯
//3.字符输出流FileWriter 适用于文本类型的数据
// FileWriter fileWriter = new FileWriter(file,true);
// fileWriter.write("我是小明");
// fileWriter.flush();
// fileWriter.close();
//4.字符读取流FileReader
// FileReader fileReader = new FileReader(file);
// char []c = new char[256];
// fileReader.read(c);
// System.out.println(c);
//5.File类APi
// System.out.println(file.createNewFile());
// System.out.println(file.isFile());
// System.out.println(file.getPath());
// System.out.println(file.getName());
// System.out.println(file.getCanonicalPath());
// File file1 = new File("src/base");
// System.out.println(file1.isDirectory());
// String[] list = file1.list();
// for (String name:list)
// {
// System.out.println(name);
// }
//6.从一个流构造另一个流,如高层流和底层流.而高层流不是从输入设备读取,而是从其他流读取。同样高层输出流也不是写入输出设备,而是写入其他流。
//底层流通常与设配相关,高层流与底层流相关,相当于装饰器模式
//DataOutputStream //可以写入任何数据对象
// FileOutputStream fileOutputStream = new FileOutputStream(file);
// DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream);
// dataOutputStream.writeChar(5);
// dataOutputStream.writeInt(5);
// dataOutputStream.writeUTF("Dasdasd");
// dataOutputStream.flush();
// dataOutputStream.close();
//7.DataInputStream
FileInputStream fileInputStream = new FileInputStream(file);
DataInputStream dataInputStream = new DataInputStream(fileInputStream);
System.out.println(dataInputStream.readChar());
System.out.println(dataInputStream.readInt());
System.out.println(dataInputStream.readUTF());
//8.InputStreamReader 将字节流转为字符流
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, Charset.forName("utf-8"));
char []c = new char[128];
inputStreamReader.read(c);
inputStreamReader.close();
fileInputStream.close();
System.out.println(c);
FileOutputStream fileOutputStream = new FileOutputStream(file);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "utf-8");
outputStreamWriter.write("我是");
outputStreamWriter.flush();
outputStreamWriter.close();
fileInputStream.close();
}
}