1、缓冲流
缓冲流:就是套在文件流之上的缓冲流
特点:能够提高程序读写的效率
字节缓冲流:BufferedInputStream,BufferedOutputStream
字符缓冲流:BufferedReader,BufferedWriter
注意:输出的时候,需要调用flush()方法,将缓冲区的数据刷新到磁盘
1.1. 字节缓冲流
1、字节缓冲流:输入流BufferedInputStream
BufferedInputStream(InputStream in)
创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
BufferedInputStream(InputStream in, int size)
创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
案例:
BufferedInputStream in = new BufferedInputStream(new FileInputStream("C:\\Users\\Administrator\\Desktop\\IO05.java"));
int r =0;
byte[] b = new byte[4096];
while((r=in.read(b)) != -1){
System.out.println(new String(b,0,r));
}
2.字节缓冲流:输出流BufferedOutputStream
BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
BufferedOutputStream(OutputStream out, int size)
创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
案例:
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\新建文本文档.txt"));
out.write("战狼2最近很火,但是我没有时间看!".getBytes());
//注意flush操作,才能把数据写到磁盘
out.flush();
out.close();
2.1. 字符缓冲流
1.字符缓冲输入流:BufferedReader
BufferedReader(Reader in)
创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz)
创建一个使用指定大小输入缓冲区的缓冲字符输入流。
这是字符缓冲流特有的方法
String readLine()
读取一个文本行。
案例:
BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\Administrator\\Desktop\\IO05.java"));
//按一个字符读
int len=0;
while((len=br.read()) != -1){
System.out.print((char)len);
}
br = new BufferedReader(new FileReader("C:\\Users\\Administrator\\Desktop\\IO05.java"));
System.out.println("=================================");
//按缓冲区读
len=0;
char[] c = new char[1024];
while((len=br.read(c)) != -1){
System.out.print(new String(c,0,len));
}
//按行读
br = new BufferedReader(new FileReader("C:\\Users\\Administrator\\Desktop\\IO05.java"));
System.out.println("=================================");
//按缓冲区读
String line=null;
while((line=br.readLine()) != null){
System.out.println(line);
}
2.字符缓冲输出流:BufferedWriter
BufferedWriter(Writer out)
创建一个使用默认大小输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz)
创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
BufferedWriter特有的方法,不过可以使用\r\n替换
newLine()
写入一个行分隔符。
案例:
BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\Administrator\\Desktop\\新建文本文档.txt"));
bw.write("创建一个使用默认大小输出缓冲区的缓冲字符输出流。 ");
bw.newLine();
bw.write("创建一个使用给定大小输出缓冲区的新缓冲字符输出流。 ");
bw.flush();
bw.close();
2、转换流
转换流:就是把字节流转化成字符流
java提供两个转换流:
字节流转字符流(输入) InputStreamReader
字节流转字符流(输出) OutputStreamWriter
为什么提供这样的转换流:
字节流中的数据都是字符时,转成字符流操作更高效。
1.转换输入流:InputStreamReader
InputStreamReader(InputStream in)
创建一个使用默认字符集的 InputStreamReader。
InputStreamReader(InputStream in, String charsetName)
创建使用指定字符集的 InputStreamReader。
案例:
InputStreamReader isr = new InputStreamReader(new FileInputStream("C:\\Users\\Administrator\\Desktop\\IO05.java"));
int len=0;
char[] c = new char[1024];
while((len=isr.read(c)) != -1){
System.out.println(new String(c,0,len));
}
System.out.println("=============");
//指定字符集
isr = new InputStreamReader(new FileInputStream("C:\\Users\\Administrator\\Desktop\\IO05.java"),"GBK");
len = 0;
while ((len = isr.read(c)) != -1) {
System.out.println(new String(c, 0, len));
}
2.转换输出流:OutputStreamWriter
OutputStreamWriter(OutputStream out)
创建使用默认字符编码的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName)
创建使用指定字符集的 OutputStreamWriter。
案例:
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\新建文本文档.txt"));
osw.write("hello io...hello OutputStreamWriter...");
osw.flush();
3.可以使用缓冲流在包装转换流
BufferedReader rs = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Users\\Administrator\\Desktop\\IO05.java")));
//缓冲流有个特殊的方法readLine,能够按行读取
String line = null;
//不等于null就表示没有到结尾
while ((line = rs.readLine()) != null) {
System.out.println(line);
}
rs.close;//可以把包装的流也关闭
3、标准输入输出流(了解)
System.in和System.out分别代表了系统标准的输入和输出
4、打印流(了解)
打印流(了解):
字节打印 PrintStream
字符打印 PrintWriter
特点:
PrintStream和PrintWriter的输出不会抛出异常
PrintStream和PrintWriter有自动flush功能
System.out返回的是PrintStream的实例
5、数据流(了解)
主要是操作Java语言的基本数据类型的数据
6、对象流
对象流:
主要用于:对象的序列化和反序列化(通俗的说就是用户对象写入IO流或从IO流读取对象)
ObjectInputStream
ObjectOutputStream
注意:要序列化到磁盘上的对象,必须实现Serializable
7、随机访问流(了解)
随机访问流:RandomAccessFile
构造器
public RandomAccessFile(File file, String mode)
public RandomAccessFile(String name, String mode)
mode:
r: 以只读方式打开
rw:打开以便读取和写入
rwd:打开以便读取和写入;同步文件内容的更新
rws:打开以便读取和写入;同步文件内容和元数据的更新
案例:
RandomAccessFile rf = new RandomAccessFile("C:\\Users\\Administrator\\Desktop\\IO05.java", "r");
rf.seek(100);
byte [] b = new byte[1024];
int off = 0;
int len = 100;
rf.read(b, off, len);
String str = new String(b, 0, len);
System.out.println(str);