1.用OutputStreamWriter(2参)字符流向文件内写入(字符串 字符数 字符数组以及字符数组的一部分)代码如下:
public static void main(String[] args) {
OutputStreamWriter oW =null ;
try {
//5)写入第二个参数时要加入双引号
oW = new OutputStreamWriter(new FileOutputStream("kunge.txt"), "Gbk");
//1)输入字符数,直接写入即可,不用在双引号里写
oW.write(97);
//2)输入字符串
oW.write("\r\n我爱你中国!\r\n");
//3)输入字符数组
char[] enew = {'A','B','C'};
//4)从第一个位置开始包含第一个位置数据
oW.write(enew);
oW.write(enew,1,2);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
oW.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
oW.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码总结:
1)相较于字节输出流(需要将输入的字符串转化为字节数组),字符输出流不需要转换
1)字符输出流中(2参),一参为字节输出流对象,二参为输入的字符的编码格式(如gbk为汉字两个字节,它是以两个字节写入数据,所以在写入中文时就会出现乱码)
2)参考字节输出流可以输出四种类型的数据(即字符串, 字符在ASCII中对应的数字,会自动转为对应的字符 ,字符数组 ,以及字符数组的一部分)
3)在输入字符数组一部分时第二个参数时写入字符数组的位置,输入的内容包含该位置的字符
2.用OutputStreamWriter(1参)字符流向文件内写入(字符串 字符数 字符数组以及字符数组的一部分)代码如下:
public static void main(String[] args) {
OutputStreamWriter outWriter = null ;
//创建字符缓冲对象1参
try {
outWriter = new OutputStreamWriter(new FileOutputStream("happy.txt"));
//输入字符串
outWriter.write("hello,我爱你中国!\r\n");
//输入字符数
outWriter.write(98);
//输入字符数组
char[] chars = {'A', 'B', 'C', 'E', 'R'};
outWriter.write(chars);
//输入字符数组的一部分
outWriter.write(chars,2,3);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
outWriter.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
outWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码总结:
1)代码必须规范化,用try catch抛出/解决问题且通过声明用finally释放并刷新流通道.
2)用1参字符输出流向文件内写入数据时,输出时的编码格式默认为自己在平台设置的编码格式 utf-8
3.用InputStreamReader(2参)从指定文件中读取数据(一次读取一个字符)代码如下:
public static void main(String[] args) {
InputStreamReader inReader = null ;
//创建字符输入流对象2参
try {
inReader = new InputStreamReader(new FileInputStream("happy.txt"),"utf-8");
//一次读取一个字符
int len = 0 ;
while ((len = inReader.read())!=-1){
System.out.print((char)len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
inReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码总结:
1)相较于字节输入流(会将读取的数据转换为相应字节的ASCII字节数,因此在控制台上打印时要转为字符串new String()),而字符输入流每次读取一个字符会将数据转换为对应的字符数,因此要将字符数转为字符(包装类的知识?)XXXX此处总结正确性不能确定
2)相较于字节输出流(需要将字节数组转化为字符串类型的数据 new String())在控制台上显示所读数据,字符输入流要转为字符
3)用字符输入流解码和字符输出流编码时,二者的编码格式要一致,否则出现乱码
4)需声明后用finally
4.用InputStreamReader(2参)从指定文件中读取数据(一次读取一个字符数组长度)代码如下:
public static void main(String[] args) {
InputStreamReader inReader = null ;
//用字符输入流一次读一个数组长度的字符
try {
inReader= new InputStreamReader(new FileInputStream("D:\\aaa\\bbb\\测试7.txt"), "utf-8");
char[] chars = new char[1024];
int len = 0 ;
while ((len = inReader.read(chars))!=-1){
System.out.print((char)len);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
inReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
问题结果展示:
D:\Download\Java\java_jdk\bin\java.exe
D
Process finished with exit code 0
总结:
1)为何只读取到一个字符???
2)字符输入流中的一参为文件字节输入流对象,其中在文件字节输入流对象中加入要读取的文件地址时要加双引号
3)与字节输入流(字节输入流在读取字节数组时要将字节数组转换为字符串即new String(bytes,0,len))相比,字符输入流要将字符数组转化为字符((char)len)
4)与文件字节输入流(读取一个字节数组长度,len=字节输入流对象.red(bytes))读取文件相比,字符输入流读取一个字符数组长度类似即为(char[] chars = new char[1024] len = 字符输入流对象.red(chars))
5)与文件字节输入流相似,字符输入流读取文件时会将读取的字符转换为字符数组,因此在输出时要将字符数组转换为字符串
5.用字符输入流和字符输出流以字符数组长度进行复制数据,代码展示如下:
public static void main(String[] args) {
InputStreamReader iR = null ;
OutputStreamWriter oSW = null ;
try {
iR = new InputStreamReader(new FileInputStream("D:\\千峰课件\\day22\\code\\day22_IO_SOCKET\\src\\com\\qf\\io_03/CopyFileTest.java"));
oSW = new OutputStreamWriter(new FileOutputStream("D:\\aaa\\bbb/copy.java"));
char[] chars = new char[1024];
int lem = 0 ;
while ((lem = iR.read(chars))!=-1){
oSW.write(chars,0,lem);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
iR.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
oSW.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
oSW.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码总结:
1)与文件字节输入流和文件字节输出流以字节数组数组长度复制文件类似,用字符流复制文件时需要创建字符数组,读时用int类型的变量接收,写时传入三参(字符数组,0,lem)
6.用bufferedreader一次读取一行(readLine())对文件进行复制,代码展示如下:
public static void main(String[] args) {
BufferedReader bufferedReader = null ;
try {
bufferedReader = new BufferedReader(new FileReader("D:\\千峰课件\\day22\\code\\day22_IO_SOCKET\\src\\com\\qf\\io_03/CopyFileTest.java"));
String line = null ;
while ((line = bufferedReader.readLine())!=null){
System.out.println(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码总结:
1)BufferedReader独有读取一行内容(字符串)的方法为readLine(无参)
2)读取数据时因为读取的是一行内容,当读完文件中的数据时,返回值为null!
3)因为读取的是一行字符串因此,需要用空字符串进行接收(String line = null ).
3)因为一次读取一行内容(字符串),没有将读取的字符串转换为字符数组,因此在sout时不需要将字符数组转换为字符串,直接输出就行
7.用字符缓冲输出流(BufferedWriter)用特殊换行功能(newLine())将内容输入至磁盘指定位置,代码展示如下:
public static void main(String[] args) {
BufferedWriter bW = null ;
try {
bW = new BufferedWriter(new FileWriter("D:\\aaa\\bbb/kg.txt"));
bW.write("大风起乱云,追风八万里,铁鞋破,汗流三斤不回头!");
bW.newLine();
bW.write("穷且益坚,不坠青云之志!");
bW.newLine();
bW.write("小小劲草,大丈夫顶天立地");
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bW.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
bW.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码总结:
1)字符缓冲中的参数对象为FileWriter(),而字符缓冲流中的参数为文件字节输出流对象
8.用Bufferedreader和BufferedWriter一次读取一行(readLine())进行文件的复制,代码展示如下:
public static void main(String[] args) {
BufferedReader bR = null ;
BufferedWriter bW = null ;
try {
bR = new BufferedReader(new FileReader("D:\\千峰课件\\day22\\code\\day22_IO_SOCKET\\src\\com\\qf\\io_02/ReaderDemo.java"));
bW= new BufferedWriter(new FileWriter("D:\\aaa\\bbb/BRBWCOPY.java"));
//一次读取一行
String line = null ;
while ((line = bR.readLine())!= null){
bW.write(line);
bW.newLine();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bR.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
bW.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
bW.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码总结;
1)在while语句输出语句时,要用字符缓输出流对象的特有方法newline()进行换行
2)write()中的参数就一个为line