IO字符流
IO字符流
1、字节缓冲区流
1.1、输出流--BufferedOutputStream
A、BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
1.2、输入流--BufferedInputStream
A、BufferedInputStream(InputStream in)
创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
注意:读写使用上与之前具体的输入输出流没有区别,无非是使用字节缓冲流将字节输入输 出流做了一了包装
2、转换流
2.1、格式:字节流 + 编码表
2.2、对汉字进行操作时出现的乱码情况,原是因为一个汉字是占据了两个字节。所以会出现这个问题。
2.3、编码表
2.4字符串的编码与解码
(a)、乱码产生的原因
编码与解码的编码方式不一样--如何解决?--让编码格式一致
(b)、编码--getBytes(String charsetName);
(c)、解码--String(byte[] bys,String CharsetName)
2.5、字符流
(1)、可以将字节流转换成字符流
(2)、字节流 + 编码
(3)、InputStreamReader--构造方法
A、InputStreamReader(InputStream in)--默认的编码格式 GBK
B、InputStreamReader(InputStream in, String charsetName)--可以指定一个编码格式来创建对象
(4)、OutputStreamWriter--构造方法
A、OutputStreamWriter(OutputStream out)--默认的编码格式 GBK
B、OutputStreamWriter(OutputStream out, String charsetName)--已指定的格式写入
C、五中写数据的方法
a) .write(char[] cbuf)--写入字符数组。
b) .write(char[] cbuf, int off, int len)--写入字符数组的某一部分。
c) .write(int c)--写入单个字符。
d) .write(String str)--写入字符串
e) .write(String str, int off, int len)--写入字符串的某一部分
3、字符流
3.1、FileReader--构造方法
A、FileReader(String fileName)
B、FileReader(File file)
3.2、FileWriter--构造方法
A、FileWriter(File file)
B、FileWriter(String fileName)
3.3、练习题
3.4、BufferedReader
A、一次读取一个字符
B、一次读取一个字符数组
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
//一次读取一个字符
br.read();
//一次读取一个char类型的数组
char[] chs = new char[1024];
br.read(chs);
br.close();
3.5、BufferedWriter
A、写入的五种方式
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
bw.write("hello");
bw.write(65);
char[] ch = {'a','b','c'};
bw.write(ch);
bw.write(ch, 0, 2);
bw.write("hello", 0, 3);
bw.close();
4、IO流分类总结
4.1、字节流
(1)、FileInputStream
(2)、FileOutputStream
(3)、缓冲区流
a、BufferedFileInputStream
b、BufferedFileOutputStream
(4)、读写四种方式
A、使用字节流
(a)、一次读写一个字节
//基本字节流一次读写一个字节
private static void method1() throws IOException {
//封装数据源
FileInputStream fis = new FileInputStream("d:\\复制图片.avi");
//封装目的地
FileOutputStream fos = new FileOutputStream("copy.avi");
int by;
while((by=fis.read())!=-1) {
fos.write(by);
}
fos.close();
fis.close();
}
(b)、一次读写一个字节数组
//基本字节流一次读写一个字节数组
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);
}
fos.close();
fis.close();
}
B、使用缓冲区流
(c)、一次读写一个字节
//缓冲字节流一次读写一个字节
private static void method3() throws IOException {
//封装数据源
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d:\\复制图片.avi"));
//封装目的地
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.avi"));
int by;
while((by=bis.read())!=-1) {
bos.write(by);
}
bos.close();
bis.close();
}
(d)、一次读写一个字节数组
//缓冲字节流一次读写一个字节数组
private static void method4() throws IOException {
//封装数据源
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d:\\复制图片.avi"));
//封装目的地
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.avi"));
byte[] bys = new byte[1024];
int len;
while((len=bis.read(bys))!=-1) {
bos.write(bys,0,len);
}
bos.close();
bis.close();
}
4.2、转换流
(1)、格式:将字节流 + 编码表转换成字符流
(2)、OutputStreamWriter写数据的5种方式
//创建字符输出流对象
OutputStreamWriter 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);
//public void write(char[] cbuf,int off,int len):写一个字符数组的一部分
//char[] chs = {'a','b','c','d','e'};
//osw.write(chs, 1, 3);
//public void write(String str):写一个字符串
//osw.write("hello");
//public void write(String str,int off,int len):写一个字符串的一部分
osw.write("hello", 0, 3);
////void flush():刷新该流的缓冲
//osw.flush();
//
////释放资源
osw.close(); //关闭此流,但要先刷新它
(3)、InputStreamReader读数据的2种方式
//创建字符输入流对象
//InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));
InputStreamReader isr = new InputStreamReader(new FileInputStream("OutputStreamWriterDemo.java"));
//public int read():一次读取一个字符
//int ch;
//while((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();
(4)、使用转换流复制Java文件
//封装数据源
InputStreamReader isr = new InputStreamReader(new FileInputStream("StringDemo.java"));
//封装目的地
OutputStreamWriter 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();
}
4.3、字符流
(1)、FileReader
(2)、FileWriter
(3)、缓冲区流
A、BufferedFileReader
B、BufferedFileWriter
(4)、读写五种方式
A、使用字符流
a) 、一次读写一个字符
// 基本字符流一次读写一个字符
private static void method1() throws IOException {
FileReader fr = new FileReader("d:\\林青霞.txt");
FileWriter fw = new FileWriter("窗里窗外.txt");
int ch;
while ((ch = fr.read()) != -1) {
fw.write(ch);
}
fw.close();
fr.close();
}
b) 、一次读写一个字符数组
// 基本字符流一次读写一个字符数组
private static void method2() throws IOException {
FileReader fr = new FileReader("d:\\林青霞.txt");
FileWriter fw = new FileWriter("窗里窗外.txt");
char[] chs = new char[1024];
int len;
while((len=fr.read(chs))!=-1) {
fw.write(chs, 0, len);
}
fw.close();
fr.close();
}
B、使用缓冲区流
a) 、一次读写一个字符
//缓冲字符流一次读写一个字符
private static void method3() throws IOException {
BufferedReader br = new BufferedReader(new FileReader("d:\\林青霞.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("窗里窗外.txt"));
int ch;
while((ch=br.read())!=-1) {
bw.write(ch);
}
bw.close();
br.close();
}
b) 、一次读写一个字符数组
//缓冲字符流一次读写一个字符数组
private static void method4() throws IOException {
BufferedReader br = new BufferedReader(new FileReader("d:\\林青霞.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("窗里窗外.txt"));
char[] chs = new char[1024];
int len;
while((len=br.read(chs))!=-1) {
bw.write(chs, 0, len);
}
bw.close();
br.close();
}
c) 、一次读取一行
//缓冲字符流一次读写一个字符串
private static void method5() throws IOException {
BufferedReader br = new BufferedReader(new FileReader("d:\\林青霞.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("窗里窗外.txt"));
String line;
while((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
br.close();
}