I/O流中常用的流
- 如果是对多媒体文件而言,最好使用字节流
- FileOutPutStream
- FileIntPutStream
- BufferedInPutStream
- BufferedOutPutStream
- 如果是对文本文件最好使用字符流
- BufferedReand
- PrintWriter
如果没有特殊要求的情况下,上述的流可以泛用于各种情况。
FileOutPutStream和FileInPutStream
FileOutPutStream
文件字节输出流:
-
三种构造方法:
-
FileOutputStream(File file),传入一个相对应的一个File 对象
-
FileOutputStream(String path);传入文件的路径(绝对路径和相对路径-----默认当前目录下)
如果该文件不存在就会自动创建文件,如果文件已经存在,那么会先清空该文件中的数据
-
FileOutputStream(File file,boolean b),参数b为ture时为,数据会以追加的方式输出,默认情况下为false
-
-
FileOutputStream的常用方法
- write(int b) 指定某一个字节输出到对应的文件中
- write(byte[] data) 将一个字节数组里面的元素输出到对应文件
- write(byte[] data,int off,int len) 将指定字节数组从下标off开始的len个字节输出到对应·文件(建议使用这个)
- flush();清空缓冲区数据,数据写到文件会创建一个通道----缓冲区,而数据正是通过这个缓冲区流入文件中,假设程序中的字节已经全部写出并且关闭了通道,那么可能会有一部分字节还留在缓冲区,还没流到文件时候,就已经关闭了通道,这样就会导致一部分字节会丢失,所以要在管道关闭之前,清空缓冲区数据
- close() 关闭文件输入流
FileIntPutStream
文件字节输入流:
-
构造方法:
-
FileInputStream(String name),通过文件路径查找对应的文件
-
FileInputStream(File file),通过File对象来查找对应的文件
如果需要查找的文件不存在,那么就会抛出FileNotFoundException异常
-
FileInputStream(FileDescriptor fdObj) FileDescriptor 是“文件描述符”,可以被用来表示开放文件、开放套接字等
-
-
FileIntPutStream中常用的方法
- rean() 读取一个字节数据并返回,当返回类型为int,当返回-1时候表示数据读取完毕
- rean(byte[] data) 将文件数据读取到对应的数组中,如果数组长度大于数据总字节长度,那么直接一次读取完毕,如果小于的话,就会分多次读取到数组中
- int read(byte[] data,int off,int len) 从data数组off下标开始位置,读取len个字节到data数组(建议使用这种方法)
- close()关闭文件输入流
简单的例子:
public class Test {
public static void main(String[] args) throws Exception {
//创建输入输出流,并且设置为追加模式
//文件输出流,没有该文件就创建,参数为相对路径
FileOutputStream stream = new FileOutputStream("A.txt",true);
//文件输入流,参数为相对路径
FileInputStream in = new FileInputStream("A.txt");
//创建一个数组用于输入数据
byte[] b ="石原里美".getBytes();
//数组数据写入到相应文件中
stream.write(b);
stream.flush();//清空缓冲区数据
//创建一个数组用于接收读取的数据
byte[] buf = new byte[1024];
//定义一个变量,用来判断是否读取完毕
int len = -1;
//读取到相应的数组 rend()这个方法一次只能读取一个字节
while((len = in.read(buf))!=-1) {
//打印数组,查看是否读取成功
System.out.println(Arrays.toString(buf));
}
//关闭流
in.close();
stream.close();
}
}
注意输出的结果是十进制的unicode值
BufferedInPutStream和BufferedOutPutStream
这个两个都是缓冲流,
缓冲流:以往我们读取写入数据都是一个一个来进行,而缓冲流的作用就是用一个数组将要传输的数据保存下来,直接传输这个数组,就不需要一个一个的数据传输。
减少系统磁盘的IO次数,从而提高读写的效率
注意,缓冲流本身并不能传输数据,必须要依托于其他流。
BufferedInputStrem
- 构造方法
- BufferedInputStream(InputStream in) 需要传入一个字节输入流对象,
- BufferedInputStream(InputStream in, int size) 需要传入一个字节输入流对象和缓冲区数组的大小,如果不指定的话,默认时8192个字节
- BufferedInputStrem常用的方法
- read()从缓冲区中去读取一个字节
- read(byte b[],int off,int len) 从缓冲区中读取数据一个数组中,并且从off位置开始,长度为len
- skip(long n) 跳过字节的数,跳过部分不会被读取
- close() 关闭输入流
BufferedOutputStream
- 构造方法
- BufferedOutputStream(OutputStream out)需要传入一个字节输出流 对象
- BufferedOutputStream(OutputStream out, int size)需要传入一个字节输出流对象,创建时指定大小size的缓冲输出流,不指定的话,默认数组大小为8192字节
- BufferedOutputStream常用的方法
- write(int b)—将数据b写到缓冲数组buf中.
- write(byte b[],int off, int len)—将字节数组b中off索引开始,长度为len个字节写到缓冲区中.
- flush()—刷新缓冲区,将缓冲区里面的数据写到输出流中.
简单事列
public class Test {
public static void main(String[] args) throws Exception {
//创建BufferedOutputStream 并传入一个FileOutputStream 对象
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream("A.txt"));
//创建一个输入流 传入一个FileInputStream对象
BufferedInputStream in = new BufferedInputStream(new FileInputStream("A.txt"));
//输出一个byte数组
bout.write("石原里美".getBytes());
//刷新缓冲区
bout.flush();
//关闭输出流 ,这个很重要,一定要关闭
bout.close();
byte[] b = new byte[1024];
int leng = -1;
while((leng = in.read(b))!=-1) {
System.out.println(Arrays.toString(b));
}
in.close();
}
}
BufferedReand
- 构造方法
- BufferedReader(Reader in)需要传入一个字符输出流 对象
- BufferedReader(Reader in, int sz) 需要传入一个字符输出流 对象,并且要传入缓冲区数组大小,如果不指定大小,就默认大小是8192
- BufferedReand常用的方法
- read() 读取单个字符
- read(char[] cbuf) 一次读取一个数组,读取的字符数,如果已到达流的末尾,则返回 -1
- readLine() 读取一个文本行,一行的标识换行 (’\n’)、回车 (’\r’) ,如果已到达流末尾,则返回 null
- close() 关闭流
- skip(long n) 跳过指定字符不读取
- ready() 用于检查此BufferedReader流是否准备就绪或无法读取
简单例子
public class Test {
public static void main(String[] args) throws Exception {
//创建流,并传入FileReader对象
BufferedReader reader = new BufferedReader(new FileReader("A.txt"));
//定义字符串
String str;
//判断是否返回值为null
while((str = reader.readLine())!=null) {
//打印输出读取到的值
System.out.println(str);
}
//关闭流
reader.close();
}
}
PrintWriter
PrintWriter类可用来创建一个文件并向文本文件写入数据,是一个很强大的类,其构造器有很多
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mNiqvBdu-1599060294704)(C:\Users\石原里美\AppData\Roaming\Typora\typora-user-images\image-20200902232226740.png)]
并且除了一些输出流的常用方法以外,还有该类特有的一些方法
(1)print(String str):向文件写入一个字符串。
(2)print(char[] ch):向文件写入一个字符数组。
(3)print(char c):向文件写入一个字符。
(4)print(int i):向文件写入一个int型值。
(5)print(long l):向文件写入一个long型值。
(6)print(float f):向文件写入一个float型值。
(7)print(double d):向文件写入一个double型值。
(8)print(boolean b):向文件写入一个boolean型值。
public class Test {
public static void main(String[] args) throws Exception {
PrintWriter writer = new PrintWriter(new File("A.txt"));
writer.print("如今你依旧是我的光".toCharArray());
writer.flush();
writer.close();
}
}
ss Test {
public static void main(String[] args) throws Exception {
PrintWriter writer = new PrintWriter(new File("A.txt"));
writer.print("如今你依旧是我的光".toCharArray());
writer.flush();
writer.close();
}
}
该类的更多方法可以通过API去了解