IO流
字节缓冲区流的概述和使用
字节缓冲区流
字节流一次读写一个数组的速度比一次读写一个字节的速度快很多, 这是加入了数组这样的缓冲区效果,java本身在设计的时候,也是考虑到了这样的设计思想,所以提供了字节缓冲区流
字节缓冲输出流
BufferedOutputStream
字节缓冲输入流
BufferedInputStream
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*BufferedOutputStream(OutputStream out)
*使用这种构造方法,它提供了一种默认的缓冲区大小,所以我们一般使用默认的就好了
*字节缓冲区流仅仅提供缓冲区,而真正的底层的读写数据还得需要基本的流对象进行操作*/
public class BufferedStreamDemo {
public static void main(String[] args) throws IOException {
//BufferedOutputStream(OutputStream out)
//FileOutputStream fos = new FileOutput("a.txt");
//BufferedOutputString bos = new BufferedOutStream(fos);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a.txt"));
bos.write("hello".getBytes());
bos.close();
//BufferedInputStream(InputStream in)
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));
//方式1:一次读取一个字节
int by;
while((by=bis.read())!=-1){
System.out.print((char)by);
//方式2:一次读取一个数组
byte[] bys = new byte[1024];
int len;
while((len=bis.read(bys))!=-1) {
System.out.print(new String(bys, 0, len));
}
}
}
字节流四种方式复制AVI并测试效率
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputSream;
import java.io.IOException;
/*
*把d:\\xxx.avi复制到当前项目目录下的copy.avi中
*数据源:d:\\xxx.avi
*目的地:copy.avi
*四种方式比较复制效率
*基本字节流一次读写一个字节
*基本字节流一次读写一个字节数组
*缓冲字节流一次读写一个字节
*缓冲字节流一次读写一个字节数组
*提示:
*复制文件的时间计算可以采用System类的方法实现
*public static long currentTimeMillis():返回以毫秒为单位的当前时间
*/
public class CopyAviTest {
public static void main(String[] args) {
//记录开始时间
long start = System.currentTimeMillis();
method1();
method2();
method3();
method4();
//记录结束时间
long end = System.currentTimeMillis();
System.out.println("共耗时:"+(end-start)+"毫秒");
}
//基本字节流一次读写一个字节数组
private static void method2() throws IOException {
//封装数据源
FileInputStream fis = new FileInputStream("d:\\复制图片.avi");
//封装目的地
FileOutputStream fos = new FileOutputStream("copy.avi");
byte[] bys = new byte[1024];
int len;
while((len=fis.read(bys))!=-1){
fos.write(bys,0,len);
}
}
//基本字节流一次读写一个字节
private static void method1() throws IOException{
//封装数据源
FileInputStream bis = new BufferedInputStream(new FileInputStream("d:\\复制图片"))
//封装目的地
FileOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.avi"));
int by;
while((by=fis.read())!=-1){
fos.write(by);
}
fos.close();
fis.close();
}
//缓冲字节流一次读写一个字节
private static void method3() throws IOException {
//封装数据源
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d:\\复制图片.avi"));
//封装目的地
BufferedOutStream bos = new BufferedOutStream(new FileOutputStream("copy.avi"));
int by;
while((by=bis.read())!=-1){
bos.write(by);
}
bos.close();
bis.close();
}
//缓冲字节流读写一个字节数组
private static void method4() throws IOException {
//封装数据源
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d:\\复制图片.avi"));
//封装目的地的
BufferedOutputStream bos = new BufferedOutputStream(new FileOutStream("copy.avi"));
byte[] bys = new byte[1024];
int len;
while((len=bis.read(bys))!=-1){
bos.write(bys,0,len);
}
bos.close();
bis.close();
}
private static void method3() throws IOException {
//封装数据源
FileInputStream fis = new FileInputStream("d:\\复制图片.avi");
//封装目的地
FileOutputStream fos = new FileOutputStream("copy.avi");
byte[] bys = new byte[1024];
int len;
while((len=fis.read(bys))!=-1){
for.write(bys,0,len);
}
fos.close();
fis.close();
}
}
转换流出现的原因
由于字节流操作中文不是特别方便,所以,java就提供了转换流。
转换流 = 字节流+编码表
String类中的编码和解码问题
/*
*编码
*把看得的懂的变成看不懂的
*public byte[] getBytes(String charseName) throws UnsupportedEncodingException
*使用指定的字符集将此String 编码为byte序列,并将结果存储到一个新的byte数组中
*解码
*把看不懂的变成看得懂的
*public String(byte[] bytes,String charsetName)
*通过使用指定的charset解码指定的byte数组,构成一个新的String
*/
public class StringDemo {
public static void main(String[] args){
//定义一个字符串
String s = "你好";
//编码
byte[] bys = s.getBytes();
//默认编码GBK
//[-60,-29,-70,-61]
//byte[] bys = s.getBytes("GBK");
//[-60,-29,-70,-61]
//byte[] bys = s.getBytes("UTF-8");
//[-28,-67,-96,-27,-91,-61]
System.out.println(Arrays.toString(bys));
//解码
//String ss = new String(bys);
String ss = new String(bys,"GBK");
System.out.println(ss);
}
}
转换流中的编码和解码问题
/*
*import java.io.FileNotFoundException;
*import java.io.FileOutputStream;
*import java.io.OutputStreamWriter;
*转换流其实就是一个字节流
*OutputStreamWrite 字符输出流
*public OutputStreamWrite(OutputStream out):根据默认编码把字节流的数据转换为字符流
*public OutputStreamWrite(OutputStream out,String charsetName):根据指定编码把字节流转换为字符流
*InputStreamReader字符输入流
*public InputStreamReader(InputStream in):用默认的编码
*public InputStreamReader(InputStream in,String charsetName):用指定的编码读数据
*/
public class ConversionStreamDemo{
public static void main(String[] args) throws IOException {
OutputStreamWrite osw = new OutputStreamWrite(new FileOutputStream("osw.txt"),"UTF-8");
//调用写数据的方法
osw.write("你好");
//释放资源
osw.close();
System.out.println("-------")
InputStreamReader isr = new InputStreamReader(new FileInputStream("osw.txt"),"UTF-8");
int ch;
while((ch=isr.read())!=-1){
System.out.print((char)ch);
}
//释放资源
isr.close();
}
}
OutputStream写数据的5种方式
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
/*
*OutputStreamWrite写数据方法;
*public void write(int c):写一个字符
*public void write(char[] cbuf):写一个字符数组
*public void write(char[] cbuf,int off,int len):写一个字符数组的一部分
*public void write(String str):写一个字符串
*public void write(String str,int off,int len):写一个字符串的一部分
*/
public class OutputStreamWriteDemo {
public static void main(String[] args) throws IOException {
//创建字符输出流对象
OutputStreamWrite osw = new OutputStreamWriter(new FileOutputStream("b.txt"));
//public void write(int c):写一个字符
osw.write(97);
osw.write('a');
//1字符=2字节
//文件的数据存储单位是字节
//public void write(char[] cbuf):写一个字符数组
char[] chs = {'a','b','c','d','e'};
//osw.write(chs,1,3);
//osw.write("hello");
//void flush():刷新该流的缓冲
//osw.flush();
osw.close();
}
}
InputStreamRead读数据的2种方式
/*
*InputStreamReader读数据方法
*public int read():一次读一个字符
*public int read(char[] cbuf):一次读取一个字符数据
*/
public class InputStreamReaderDemo {
public static void main(String[] args) throws IOException {
//创建字符输入流对象
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));
InputStreamReader isr = new InputStreamReader("OutputStream");
//public int read():一次读取一个字符
int ch;
which((ch=isr.read())!=-1){
System.out.print((char)ch);
}
//public int read(char[] cbuf):一次读取一个字符数组
char[] chs = new char[1024];
int len;
while((len=isr.read(chs))!=-1) }
System.out.print(new String(chs,0,len));
}
//释放资源
isr.close();
}
}
字符流的练习之复制java文件
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/*
*把当前项目目录下的StringDemo.java内容复制到当前项目目录下的Copy.java
*数据源:StringDemo.java --- 读数据 --- 字符流 --- InputStreamReader
*目的地:Copy.java --- 写数据 --- 字符流 --- OutputStreamWriter
*/
public class CopyJavaTest {
public static void main(String[] args) throws IOException {
//封装数据源
InputStreamReader isr = new InputStreamReader(new FileInputStream("StringDemo.java"));
//封装目的地
OutputStreamWrite osw = new OutputStreamWriter(new FileOutputStream("Copy.java"));
//读写数据
//方式1:一次读写一个字符
int ch;
while((ch=isr.read())!=-1){
osw.write(ch);
}
//方式2:一次读写一个字符数组
char[] chs = new char[1024];
int len;
while((len=isr.read(chs))!=-1){
osw.write(chs,0,len);
}
//释放资源
osw.close();
isr.close();
}
}
改进版
/*
*把当前项目目录下的StringDemo.java内容复制到当前项目目录下的Copy.java中
*准换流的名字比较长,而我们常见的操作都是按照本地默认编码实现的,所以,为了简单我们的书写,转换流提供了对应的子类。
*FileWriter:用来写入字符文件的便捷性:OutputStreamWriter
*FileReader:用来读取字符文件的便捷性:InputStreamReader
*OutputStreamWriter = FileOutputStream + 编码表(GBK)
*FileWriter = FileOutputStream + 编码表
*FileWriter(String fileName)
*
*InputStreamReader = FileInputStream + 编码表
*FileRead = FileInputStream + 编码表
*FileReader(String fileName)
*
*数据源:StringDemo.java --- 读数据 --- 字符流 ---InputStreamReader --- FileReader
*目的地:Copy.java --- 写数据 --- 字符流 --- OutputStreamWriter --- FileWriter
*/
public class CopyJavaTest2 {
public static void main(String[] args) throws IOException {
//封装数据源
FileReader fr = new FileReader("StringDemo.java");
//封装目的地
FileWriter fw = new FileWriter("Copy.java");
//读写数据
//一次读写一个字符
int ch;
while((ch=fr.read())!=-1){
fw.write(chs,0,len);
}
//释放资源
fw.close();
fr.close();
}
}
字符缓冲区流的概述和使用
import java.io.BufferedWriter;
import java.io.FileWriter;
/*
*字符缓冲区流:
*BufferedWriter:
*将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入
*构造方法:BufferedWriter(Writer out)
*BufferedReader;
*从字符输入流读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取
*构造方法:BufferedReader(Reader in)
*/
public static void main(String[] args) throws IOException {
//创建字符缓冲输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));
//调用写数据的方法
bw.write("hello");
//释放资源
bw.close();
//创建字符缓冲输入流对象
BufferedReader br = new BufferedReader(new FileReader("BufferedStreamDemo.java"));
//方式1:一次读取一个字符
int ch;
while((ch=br.read())!=-1) {
System.out.print((char)ch);
}
//方式2:一次读取一个字符数组
char[] chs = new char[1024];
int len;
while((len=br.read(chs))!=-1) {
System.out.print(new String(chs,0,len));
}
//释放资源
br.close();
}
}
字符缓冲区流的练习之复制文本文件
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWrite;
import java.io.IOException;
/*
*把项目目录下的a.txt内容复制到项目目录下的b.txt中
*数据源:a.txt---读数据---字符流---InputStreamReader---FileReader---BufferedReader
*目的地:b.txt---写数据---字符流---OutputStreamWriter---FileWriter---BufferedWriter
*/
public class CopyText {
public static void main(String[] args) throws IOException{
//封装数据源
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
//封装目的地
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
//读写数据
//一次读写一个字符数组
char[] chs = new char[1024];
int len;
while((len=br.read(chs))!=-1) {
bw.write(chs,0,len);
}
//释放资源
bw.close();
br.close();
}
}
字符缓冲区流的特殊功能
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
/*
*特殊功能
*BuffereredWriter
*void newLine():写入一个行分隔符,这个行分隔符是由系统确定的
*BufferedReader
*String readLine()
*/
public class BufferedStreamDemo {
public static void main(String[] args) throws IOException {
//创建字符缓冲输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
//写数据
for(int x=0;x<3;x++) {
bw.write("hello9");
}
//释放资源
bw.close();
//创建字符缓冲输入流对象
BufferedReader br = new BufferedReader(new FileReader("bw.txt"));
//读取一次
String line = br.readLione();
System.out.println(line);
//最终代码
String line;
while((line=br.readLine())!=null) {
System.out.println(line);
}
br.close();
}
}
字符缓冲区流的特殊功能复制java文件,文本文件
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
*字符缓冲流特殊功能复制java文件
*数据源:
*BufferedStreamDemo.java --- BufferedReader
*目的地:
*Copy.java---BufferedWriter
/*
public class CopyJavaTest {
public static void main(String[] args) throws IOException {
//封装数据源
BufferedReader br = new BufferedReader(new FileReader("BufferedStreamDemo.java"));
BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));
//读写数据
String line;
while((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
//释放资源
bw.close();
br.close();
}
}
/*
*需求:5种方式复制文本文件
*数据源:d:\\xxx.txt
*目的地:yyy.txt
*5种方式:
*基本字符流一次读写一个字符
*基本字符流一次读写一个数组
*缓冲字符流一次读写一个字符
*缓冲字节流一次读取一个字符数组
*缓冲字符串一次读写一个字符串
*/
public class CopyFileTest {
public static void main(String[] args) {
method1();
method2();
method3();
method4();
method5();
}
//基本字符流一次读取一个字节
private static void method1() throws IOExeption {
FileReader fr = new FileReader("d:\\xxx.txt");
FileWriter fw = new FileWriter("yyy.txt");
int ch;
while((ch=fr.read())!=-1){
fw.write(ch);
}
fw.close();
fr.close();
}
//基本字符流一次读取一个字符数组
private static void method2() throws IOException {
FileReader fr = new FileReader("d:\\xxx.txt");
FileWriter fw = new FileWriter("yyy.txt");
char[] chs = new char[1024];
int len;
while((len=fr.read(chs))!=-1){
fw.write(chs,0,len);
}
fw.close();
fr.close();
}
//缓冲字符流一次读取一个字符
private static void method3() throws IOException {
BufferedReader br = new BufferedReader(new FileReader("d:\\xxx.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("yyy.txt"));
int ch;
while((ch=br.read())!=-1) {
bw.write(ch);
}
bw.close();
br.close();
}
//缓冲字符流一次读写一个字符数组
private static void method4() throws IOException {
FileReader br = new FileReader("d:\\xxx.txt");
FileWriter bw = new FileWriter("yyy.txt");
char[] chs = new char[1024];
int len;
while((len=fr.read(chs))!=-1){
bw.write(chs,0,len);
}
bw.close();
br.close();
}
//缓冲字符流读写一个字符串
private static void method5() throws IOException {
FileReader br = new FileReader("d:\\xxx.txt");
FileWriter bw = new FileWriter("yyy.txt");
char[] chs = new char[1024];
int len;
while((len=fr.read(chs))!=-1){
bw.write(chs,0,len);
}
bw.close();
br.close();
}
}