欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2024/10/14 编程问答 52 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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 读数据步骤

  • 创建输入流对象
  • 调用输入流对象的读数据方法
  • 释放资源
  • 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();} }

    运行结果;

                  

     

     

    总结

    以上是生活随笔为你收集整理的IO-3(Reader、Writer、编码、FileReader、FileWriter)的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。