缓冲字节流
缓冲区:计算机访问外部设备或文件,要比直接访问内存慢的多。如果我们每次调用read()方法或者writer()方法访问外部的设备或文件,CPU就要花上最多的时间是在等外部设备响应,而不是数据处理。为此,我们开辟一个内存缓冲区的内存区域,程序每次调read()方法或writer()方法都是读写在这个缓冲区中。当这个缓冲区被装满后,系统才将这个缓冲区的内容一次集中写到外部设备或读取进来给CPU。使用缓冲区可以有效的提高CPU的使用率,能提高整个计算机系统的效率。在字符流操作中,所有的字符都是在内存中形成的,在字符流输出前都将保存在内存中的缓冲区内。
public class Demo01 {
/*
* BufferedInputStream(InputStream in,int size)
* size: 指定缓冲区的大小,默认是8kb
* */
public static void main(String[] args) {
BufferedInputStream bis = null;
try {
// 1、真正去文件中读取字节数据的字节流
FileInputStream fis = new FileInputStream("C:\\Users\\GzhAnkh\\Desktop\\test.txt");
// 2、创建缓冲流对象,并且规定缓冲区为4kb
bis = new BufferedInputStream(fis,4*1024);
// 3、通过缓冲流读数据
byte [] bytes = new byte[1024];
int len;
while((len=bis.read(bytes))!=-1){
System.out.println(len);
System.out.println(new String(bytes,0,len));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(bis!=null) {
try {
bis.close();// 4、释放资源, 关闭流
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
缓冲字节输出流BufferedOutputStream:
/*
* 缓冲字节输出流
* BufferedOutputStream:
* 1、BufferedOutputStream(OutputStream out)
* 2、BufferedOutputStream(OutputStream out,int size)
*
* 以stream结尾是字节流, 操作字节数组. 字节流的所有核心方法都被定义在了InputStream/OutputStream
* 所以凡是涉及到字节流的输入/输出,代码基本上是一摸一样的。
*
* 以reader/writer结尾是字符流, 操作字符数组
* */
public class Demo05 {
public static void main(String[] args) {
BufferedOutputStream bos = null;
try {
FileOutputStream fos = new FileOutputStream("C:\\Users\\GzhAnkh\\Desktop\\456.txt");
bos = new BufferedOutputStream(fos);
String s = "xxaaxa!";
int len;
byte [] data = s.getBytes(); // 通过"utf-8"编码将s字符串转为字节数组
bos.write(data,0,data.length);
} catch (IOException e) {
e.printStackTrace();
} finally {
if(bos!=null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
缓冲字符输入流BufferedReade:
/*
* 字符缓冲流:
* BufferedReader(Reader reader)
* BufferedWriter(Writer writer)
* */
public class Demo06 {
public static void main(String[] args) {
BufferedReader br = null;
try {
FileInputStream fis = new FileInputStream("C:\\Users\\GzhAnkh\\Desktop\\test.txt");
Reader reader = new InputStreamReader(fis);
br = new BufferedReader(reader);
char [] chars = new char[1024];
int len;
while((len=br.read(chars))!=-1){
System.out.println(chars);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(br!=null)
// 会用到一个设计模式(写代码的套路): 装饰者模式
{
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* 可以写,但是没必要,因为BufferedReader的close方法底层会去调用下面的方法
* reader.close();
* fis.close();
* */
}
}
}
public class Demo07 {
public static void main(String[] args) {
/*
* BufferedReader中有一个方法: readLine(), 一次读取一行
* 如果调用该方法返回为null,表示读完。
*
* 注意: readLine()方法是在BufferedReader中定义的,所以
* 在声明类型时候要声明为BufferedReader而不是Reader
*
* 凡是以Buffered开头的流,都有一个构造方法来指定缓冲区的大小,
* 默认缓冲区的大小是8KB.
*
* */
BufferedReader br = null;
try {
FileInputStream fis = new FileInputStream("C:\\Users\\000\\Desktop\\test.txt");
Reader reader = new InputStreamReader(fis);
br = new BufferedReader(reader);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
字符缓冲输出流BufferedWriter:
public class Demo09 {
public static void main(String[] args) {
BufferedWriter bw = null;
try {
FileWriter fw = new FileWriter("C:\\Users\\000\\Desktop\\789.txt");
bw = new BufferedWriter(fw);
bw.write("abcabcabc");
/*
* newLine(): 在文件中换行
* */
bw.newLine(); // 等价于bw.writer("\r\n")
bw.write("徐卓韩也喜欢去");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}
if(bw!=null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
字符流,缓冲流实现文件复制:
public class Demo01 {
public static void main(String[] args) {
buffererReaderTest("C:\\Users\\GzhAnkh\\Desktop\\FileApiDemo03\\Demo01\\Code04.java",
"C:\\Users\\GzhAnkh\\Desktop\\FileApiDemo03\\Demo01\\Code03.java");
}
private static void buffererReaderTest(String s,String s1) {
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try {
File file = new File(s);
FileReader fileReader = new FileReader(file);
bufferedReader = new BufferedReader(fileReader);
File file1 = new File(s1);
FileWriter fileWriter = new FileWriter(file1);
bufferedWriter = new BufferedWriter(fileWriter);
String lenght;
while ((lenght = bufferedReader.readLine()) != null) {
System.out.println(lenght);
bufferedWriter.write(lenght+"\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedWriter.flush();
} catch (IOException e) {
e.printStackTrace();
}
if (bufferedWriter != null) {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
public class Demo01 {
public static void main(String[] args) throws Exception{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte [] bytes = {1,2,3,4,5,6};
baos.write(bytes);
byte[] target = baos.toByteArray();
for (byte b : target) {
System.out.println(b);
}
}
}