java day031 缓冲流和常用API
1.缓冲流概述
BufferedInputStream
字节缓冲输入流
ButteredOutputStream
字节缓冲输出流
ButteredReader
字符缓冲输入流
ButteredWriter
字符缓冲输出流
1.缓冲流是Java提供的系统缓冲,底层是一个缓冲数组,根据处理的数据方式不同,提供的数据有字节缓冲数组和字符缓冲数组
2.字节缓冲流,默认的字节数组缓冲区是8KB
byte[] buffer = new byte[1024 * 8];
3.字符缓冲流,默认的字符数组缓冲区是16KB
char[] buffer = new char[1024 * 8];
4.【重点】
任何一个缓冲流都没有操作文件的能力!!!读取文件数据,写入文件数据都是依赖于对应的字符流或者字节流
5.缓冲流使用的方法,也是read write,并对应当前使用的字符流或者字节流
6.缓冲流极大的提高了开发效率
1.1BufferedInputStream字节输入缓冲流
构造方法Constructor
BufferedInputStream(InputStream in);
这里的参数是字节输入流对象
成员方法Method
int read();
int read(byte[] buf);
public class TestBufferedInputStream {
public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:/test/1.txt"));
System.out.println((char)bis.read());
byte[] buf = new byte[1024 * 8];
int length = -1;
while ((length = bis.read(buf)) != -1) {
System.out.print(new String(buf, 0, length));
}
bis.close();
}
}
1.2BufferedOutputStream字节输出缓冲流
构造方法Constructor
BufferedOutputStream(OutputStream out);
这里的参数是字节输入流对象
成员方法Method
void write(int b);
void write(byte[] buf);
void write(byte[] buf, int off, int count);
public class TestBufferedOutputStream {
public static void main(String[] args) throws IOException {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:/test/1.txt"));
bos.write(49);
bos.write("12345455".getBytes());
bos.write("ABBIHIDH".getBytes(), 0, 3);
bos.close();
}
}
1.3 字节缓冲总结
1.使用缓冲的效率远远高于未使用缓冲的效率,这里是一个经典的空间换时间概念
2.推荐使用系统提供的缓冲流,更加的安全。
1.4BufferedReader 字符输入缓冲流
构造方法Constructor
BufferedReader(Reader in);
成员方法Method
int read();
int read(char[] buf);
String readLine();【新方法】
从文件读取一行数据,返回值类型是字符串,如果读到文件末尾,返回null
public class TestBufferedReader {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("D:/test/1.txt"));
br.read();
String s = null;
while ((s = br.readLine()) != null) {
System.out.println(s);
}
}
}
1.5 BufferedWriter 字符输出缓冲流
构造方法Constructor
BufferedWriter(Writer in);
成员方法Method
void write(int b);
void write(char[] buf);
void write(char[] buf, int off, int count);
void write(String str);
void write(String str, int off, int len);
void newLine();
换行
public class TestBufferedWriter {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter(("D:/test/1.txt"),true));
bw.write("hahahh");
bw.newLine();
bw.write("字符类型数组".toCharArray());
bw.newLine();
bw.write("字符类型数组数组".toCharArray(), 1, 3);
bw.write("字符串", 1, 2);
bw.close();
}
}
2.java常用API
2.1 StringBuffer概述
为了解决字符串荣誉问题,Java提供了两个可变长字符串StringBuffer与StringBuilder,底层为初始化容量16的字符数组
StringBuffer是一个线程安全的可变长字符串对象
2.2 StringBuffer构造方法
Constructor
StringBuffer();
StringBuffer(String str);
StringBuffer(int capacity);
2.3添加方法
append(EveryThing);
在StringBuffer末尾追加内容,可以是任意数据类型
insert(int index, EveryThing);
在指定下标添加内容,可以是任意数据类型
public class TestStringBuffer {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("hahah");
String str = null;
sb.append(true);
sb.append('1');
sb.append(1);
sb.append(1.1);
sb.append(str);
sb.append("aaaaa".toCharArray());
System.out.println(sb);
sb.insert(2, true);
System.out.println(sb);
}
}
2.4 查看方法
String toString();
将底层字符数组保存的内容以字符串形式返回
int indexOf(String str);
指定字符串在StringBuffer第一次出现的下标位置
int lastIndexOf(String str);
指定字符串在StringBuffer最后一次出现的下标位置
String substring(int begin);
从指定下标截取字符串到末尾
String substring(int begin, int end);
从指定下标截取到end结束,左闭右开
public class TestStringBuffer2 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("123465586ABCDEFG");
System.out.println(sb.toString());
System.out.println(sb.indexOf("234"));
System.out.println(sb.lastIndexOf("234"));
System.out.println(sb.substring(3));
System.out.println(sb.substring(3,7));
}
}
2.5修改方法
replace(int start, int end, String str);
用指定字符串替换从start下标开始到end下标结束的子字符串
setCharAt(int index , char ch);
指定下标替换一个字符
System.out.println(sb.replace(0, 3, "哈哈哈哈哈"));
sb.setCharAt(0, '嘿');
2.6删除和反序
delete(int start, int end);
从start开始到end结束,左闭右开
deleteCharAt(int index);
删除指定下标的字符
reverse();
内容倒叙
2.7StringBuffer与StringBuilder的关系
StringBuffer 线程安全,效率低
StringBuilder 线程不安全,效率高
两者方法一致