字节流和字符流如何进行选择???
复制数据,如果我们知道用记事本打开并能够读懂,就用字符流,否则就用字节流
复制数组用字符流
字节流有4种方式,FileInputStream,FileOutputStream和BufferedOutputStream,BufferedInputStream
分别使用一次一个字节和一次读写一个字节数组
字符流有5种方式:FileReader,FileWriter和BufferedReader,BufferedWriter
FileReader和FileWriter有两种方式:1.一次读写一个字符2.一次读写一个字符数组
BufferedReader和BufferedWriter有三种方式:1.一次读写一个字符2.一次读写一个字符数组3.一次读写一行
一:字节流
输入流:InputStream
子类有:FileInputStream
BufferedInputStream
输出流:OutputStream
子类有:FileOutputStream
BufferedOutputStream
1.FileOutputStram 字节输出流 写
(1)构造方法:
FileOutputStream(File file)
FileOutputStream(String name):
FileOutputStream fos = new FileOutputStream(String name,boolean flag):文件追加
习惯用第二种的构造方法,因为比第一种写着简单许多
(2)写操作
write(Byte [] bytes):将字节数组写入文件中
write(int num):会将数字对应的ASCI值写入文件中
write(byte[] bytes,int off,int length):将字节中从off位置起,length个长度的字节写入到文件中
(3)close()关闭,让打开的文件变成垃圾,被垃圾回收站回收,否则文件一直被打开,造成电脑卡
2.FileInputStream字节输入流:
(1)构造方法:
FileInputStream fis = new FileInputStream(String txt);
(2)读方法:
int read():一次读取一个字节
int read(byte[] b):一次读取一个字节数组
3.代码:
public class CopyFileDemo3 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("FileOutputStramDemo.java");
FileOutputStream fos = new FileOutputStream("b.txt");
byte[] buffer = new byte[1024];
int len = -1;
while ((len = fis.read(buffer))!=-1) {
fos.write(buffer,0,len);
}
//int by = 0;
//while ((by = fis.read())!=-1) {
// fos.write(by);
//}
fis.close();
fos.close();
}
}
二:转换流
1.OutputStreamWriter:输出缓冲流,是字符流通向字节流的桥梁OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("osw.txt"));
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("osw.txt"),"utf-8");
2.InputStreamReader:输入缓冲流,是字节流通向字符流的桥梁
InputStreamReader isr = new InputStreamReader(new FileInputStream("osw.txt"));
InputStreamReader isr = new InputStreamReader(new FileInputStream("osw.txt"),"utf-8");
3.OutputStreamWriter的方法:
public void write(int c):写一个字符
public void write(char[] cbuf):写一个字符数组
public void write(char[] cubf,int off,int len):写一个字符数组的一部分
public void write(String str):写一个字符串
public void write(String str,int off,int len):写一个字符串的一部分
4.close()和flush()的区别:
A:close()关闭流对象,但是先刷新一个缓冲区。关闭之后,流对象不可以继续再使用了
B:flust()仅仅刷新缓冲区,刷新之后,流对象还可以继续使用
构造方法中只有一个参数时,默认编码是gbk,有两个参数时,则编码格式是第二个参数的值
三:字符流
BufferedWriter:字符缓冲输出流BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
BufferedReader:字符缓冲输入流
BufferedReader br = new BufferedReader(new FileReader("bw.txt"));
字符缓冲流的特殊方法:
BufferedWrite:
public void newLine():根据系统来决定换行符
BufferedReader:
public String readLine():一次读取一行数据
包含该行内容的字符串,不包含任何终止符,如果已经达到流末尾,则返回null
代码:
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
BufferedReader br = new BufferedReader(new FileReader("InputStreamReaderDemo.java"));
String line = null;
while((line = br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
br.close();
}