IO流的概念
流:线性的,有方向的。
IO:input(输入)和 output(输出)。
JAVA中IO流的分类:
图片来自网络
字节流:
Java最底层的流,可以读写任何文件(纯文本、视频、图像、声音…),以字节为单位。
因为:一切皆为“字节”
A).输出流:OutputStream(抽象类)
B).输入流:InputStream(抽象类)
字符流:
基于字节流的,可以很方便的读写“纯文本”文件,以字符为单位,每次读取多个字节。(只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。)
A).输出流:
B).输入流:
IO流_字节输出流_FileOutputStream:
构造方法:
1)new FileOutputStream(String name) :(覆盖)创建文件输出流以指定的名称写入文件。
2).FileOutputStream(String name, boolean append) (追加)创建文件输出流以指定的名称写入文件。
3).FileOutputStream(File file):(覆盖)创建文件输出流以写入由指定的 File对象表示的文件。
4).FileOutputStream(File file, boolean append) (追加)创建文件输出流以写入由指定的 File对象表示的文件。
注意:Java中所有的“输出流”构造时,文件可以不存在,会自动创建一个;
字节写入(输出)的方法:(三种)
A).write(int b):输出一个字节;
B).write(byte[] byteArray):输出一个字节数组;
C).write(byte[] byteArray,int off,int len):输出字节数组的一部分;
1).byteArray : 要写入的数组;
2).off : 起始位置索引;
3).len : 输出的数量;
public static void main(String[] args) throws IOException {
//1.构造方法:
FileOutputStream out = new FileOutputStream("demo.txt",false);
//2.输出的方法:
//2-1:write(int b):输出一个字节
out.write(97);//97 --> 转换为二进制: 0110 0001 --> 写入文件:0110 0001
out.write(999997);//999997 -->转换为二进制:111101000010 0011 1101 --> 取最低的一个字节:写入文件:0011 1101
//2-2:write(byte[] byteArray):输出多个字节
byte[] byteArray = {97, 98, 99, 100};
out.write(byteArray);
//间接的输出一个“字符串”
out.write("大家好,呵呵".getBytes());
//输出一个换行符:
out.write("\r\n".getBytes());
//2-3:write(byte[] byteArray,int offset,int len):
//例如:写入byteArray数组中的99,100
out.write(byteArray,2,2);
//关闭流--释放资源
out.close();
}
IO流_字节输入流_FileInputStream:
1).构造方法:
1.FileInputStream(String name) 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。
2.FileInputStream(File file) 通过打开与实际文件的连接创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
注意: Java中所有的“输入流”构造时,文件必须存在,否则抛出异常;
读取的方法:
1).public int read():读取一个字节
2).public int read(byte[] byteArray):读取多个字节,封装到参数数组中。
public class Demo {
public static void main(String[] args) throws IOException {
File file = new File("demo.txt");
if (!file.exists()) {
file.createNewFile();
}
FileInputStream in = new FileInputStream(file);
//读一个字节
/*int b = 0;
while ((b = in.read()) != -1) {
System.out.println((char)b);
}*/
//读取多个字节:3个
byte[] byteArray = new byte[3];
int len = 0;
while ((len = in.read(byteArray)) != -1) {
//将 byte[]数组转换为String
String str = new String(byteArray,0,len);
System.out.println("转换为String后:" + str);
}
}
}
IO流_字符流_输出流FileWriter
(只能使用系统默认字符集)
构造方法:
1).FileWriter(String fileName)构造一个文件名的FileWriter对象。
2).FileWriter(String fileName, boolean append)构造一个FileWriter对象,给出一个带有布尔值的文件名,表示是否附加写入的数据。
3).FileWriter(File file) 给一个File对象构造一个FileWriter对象。
4).FileWriter(File file, boolean append)(追加) 给一个File对象构造一个FileWriter对象。
输出方法:
1).write(int c):输出一个字符;
2).write(char[] chArray):输出一个字符数组;
3).write(char[] chArray,int off,int len):输出字符数组的一部分;
4).write(String str):输出一个字符串;
5).write(String str,int off,int len):输出字符串的一部分;
public static void main(String[] args) throws IOException {
//注意:构造时,文件可以不存在,会自动创建
FileWriter out = new FileWriter("demo.txt");
//**********五个输出的方法*************************************//
//1.write(int c):输出一个字符
out.write(98);
//2.write(char[] chArray):输出一个字符数组
char[] chArray = {'a','b','你','好','呵','呵'};
out.write(chArray);
//3.write(char[] chArray,int off,int len("输出字符数组的一部分;
out.write(chArray,4,2);
//4.write(String s):输出一个字符串
out.write("我爱IO");
//5.write(String s,int off,int len):输出字符串的一部分
String str = "北京天安门前";
out.write(str,4,3);
//*******************输出换行************************//
out.write("\r\n");
out.write("你好");
//刷新缓存区
// out.flush();
//注意:"字符流"内部自带缓存区,write()之后一定要flush()/close()才能
//将缓存区的数据写入到文件。
out.close();//相当于:flush() + close()
}
字符流_输入流FileReader:
构造方法:
1).FileReader(String fileName) 创建一个新的 FileReader ,给定要读取的文件的名称。
2).FileReader(File file) 创建一个新的 FileReader ,给出 File读取。
读取的方法:
1).int read():读取一个字符;返回值为读取的字符的“编码”
2).int read(char[] chArray):读取多个字符,存储到字符数组中。
返回值是读取的字符的“数量”。
public static void main(String[] args) throws IOException {
FileReader in = new FileReader("demo03.txt");
//一次读取一个字符
/*int c = 0;
while ((c = in.read()) != -1) {
System.out.println("读取的字符:" + (char)c);
}*/
//一次读取一个字符数组
char[] chArray = new char[2];
int len = 0;
while ((len = in.read(chArray)) != -1) {
//可以将一个字符数组的一部分转换为String
String str = new String(chArray,0,len);
System.out.println(str);
}
in.close();
}
字符流与字节流转换
转换流的特点:
1.其是字符流和字节流之间的桥梁
2.可对读取到的字节数据经过指定编码转换成字符
3.可对读取到的字符数据经过指定编码转换成字节
何时使用转换流?
1.当字节和字符之间有转换动作时;
2.流操作的数据需要编码或解码时。
3.具体的对象体现:
InputStreamReader:字节到字符的桥梁
OutputStreamWriter:字符到字节的桥梁
这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。