IO-3(Reader、Writer、编码、FileReader、FileWriter)

1. Reader

字符输入流

read(0:读取单个字符返回

read(char[]):将数据读到数组中,返回读取的个数

2. Writer

字符输入流

已知子类:

  • BufferedWriter:高效
  • CharArrayWriter:写入内存缓冲区,不是写入文件
  • PrintWriter:打印流,提供自动刷新,自动换行等功能

写的位置不同,所以write()未实现,所以Writer为抽象类。起到规范的作用。

3. 编码

3.1 常见的编码

GBK

最常用的中文码表,用2个字节表示(第一个字节开头为1,第二个字节开头为0)

unicode

国际标准码,2个字节存储。

Java中char类型用此表,char c='a';占用两个字节

Java中字符串按系统默认表解析,简体中文版,字符串默认码表是GBK。

UTF-8

基于unicode,一个字节存储,更标准化,在每一个字节头加了编码信息。

3.2 可识别中文的码表

GBK,UTF-8

3.3 编码和解码

1、编码:文字----->(数字),"abc".getBytes()----->byte[]

2、解码:(数字)----->文字,byte[] b={97,98,99}; new String(b);

4. FileReader

java.io.FileReader;

读取字符流

继承了InputStreamReader--->Reader

BufferedReader也继承了Reader.

4.1 构造方法

假定默认字符编码和默认自己缓冲区大小都适当

FileWriter(String fileName);

FileWriter(String fileName,boolean append):是否追加

4.2 读数据步骤

  1. 创建输入流对象
  2. 调用输入流对象的读数据方法
  3. 释放资源
import java.io.FileReader;
import java.io.IOException;

public class Test{
    public static void main(String[] args) throws IOException  {
    	FileReader fr=new FileReader("a.txt");
    	int ch=0;
    	while((ch=fr.read())!=-1){
    	    //输出字符对应的编码值
    	    System.out.println(ch);

    	    //输出字符本身
    	    System.out.println((char)ch);
    	}
    	fr.close();
    }
}

运行结果:

4.2.1 分析

FileReader fr=new FileReader("a.txt"):文件a.txt必须存在,否则抛出java.io.FileNotFoundException异常。

int read():一次读取一个字符。

  • int ch=fr.read();
  • 若文件a.txt中有换行,read()也会读到

int read(char[] chs):返回的是实际读取的个数

  • char[] chs=new char[5];
  • int len=fr.read(chs);       //len=5
  • chs;     //chs={'h','e','l','l','o'}
  • len=fr.read(chs);       //len=5
  • chs;     //chs={'\r','\n','w','o','r'}
  • len=fr.read(chs);       //len=4
  • chs;     //chs={'l','d','\r','\n','r'}------上一次读取的r,此次未覆盖

说明len读取长度,不是实际chs的长度————最后显示数据时,格式为:System.out.println(new String(chs,0,len));只转实际读取的长度,排除了前面情况中的'r'。

当实际读取长度为-1时,说明无数据可读了,可作为循环判断条件。

5. FileWriter

java.io.FileWriter;

会抛出IO异常

5.1 构造函数

FileWriter(String FileName);

FileWriter(String FileName,boolean append);是否追加

5.2 写数据步骤

  • 创建输出流对象
  • 调用输出流对象的写数据方法
  • 释放资源
import java.io.FileWriter;
import java.io.IOException;

public class Test{
    public static void main(String[] args) throws IOException  {
    	FileWriter fw=new FileWriter("a.txt");
    	fw.write("你好!");
    	fw.flush();
    	fw.close();
    }
}

运行结果:

5.2.1 分析

  • FileWriter fw=new FileWriter("a.txt");----做的事情包括:
    • 创建一个a.txt文件,
    • 创建一个输出流对象fw
    • 将输出流对象指向文件
  • write(String str):调用fw.write("IO流")时,并未将IO流写入文件,而是写入了内存缓冲区,需调用fw.flush()将缓冲区的数据刷新到文件中(硬盘存储基本单位是字节,此处是字符串,需刷)
  • 不释放资源时,当程序未结束时,不可删除文件a.txt,因为正在被Java程序使用。
  • 当调用fw.close()后,即使Java程序未结束,也可删除a.txt。
  • 若未写fw.flush()而直接写了fw.close()则也会将内容刷新到文件中。因为close()会在关闭前检查缓冲区,若有内容,先fluse()再close(),释放资源。
  • close()之后,流对象fw不可再使用。

5.2.2 write方法

write(String str):写一个字符串数据

write(String str,int index,int len):一部分

write(int ch):写一个字符数据,‘a’,97都可以

write(char[] chs):写一个字符数组

write(char[] cha,int index,int len):一部分

5.2.3 实现数据的换行

fw.write("\n");

但用记事本打开无换行,因为Windows识别的换行是“\r\n”

  • Windows:\r\n
  • Linux:\n
  • mac:\r

5.2.4 数据的追加写入

用构造函数:FileWriter(String FileName,boolean append);设置append为true,默认是false。

5.3 复制文件

数据源:a.txt

读数据:FileReader

目的地:b.txt

写数据:FileWriter

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Test{
    public static void main(String[] args) throws IOException  {
    	FileReader fr=new FileReader("a.txt");
    	FileWriter fw=new FileWriter("e:\\b.txt");
    	int ch=0;
    	while((ch=fr.read())!=-1)
    		fw.write(ch);
    	fw.flush();
    	fw.close();
    	fr.close();
    }
}

运行结果;

              

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值