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、编码表

 IO字符流

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练习题

 IO字符流

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();

}