字符流与字节流区别
字符流 处理文本文档中文问题 字节流解决不了中文文档的处理 不可以处理图片 视频等的复制
字节流 除了文本文档其他都用
字符编码表
1.ascii: 一个字节中的7位就可以表示。对应的字节都是正数。0-xxxxxxx
2.iso-8859-1:拉丁码表 latin,用了一个字节用的8位。1-xxxxxxx 负数
3.GBK:目前最常用的中文码表,2万的中文和符号。用两个字节表示,其中的一部分文字,第一个字节开头是1,第二字节开头是0 uft-8 三个字节 基于unicode
4.unicode:国际标准码表:无论是什么文字,都用两个字节存储
5.能识别中文的码表:GBK、UTF-8;正因为识别中文码表不唯一,涉及到了编码解码问题。
对于我们开发而言;常见的编码 GBK UTF-8 ISO-8859-1
文字--->(数字) :编码。 “abc”.getBytes() byte[]
(数字)--->文字 : 解码。 byte[] b={97,98,99} new String(b,0,len)
注意: Java中的char类型用的就是这个码表。char c = 'a';占两个字节。 Java中的字符串是按照系统默认码表来解析的。简体中文版 字符串默认的码表是GBK。
字符输入流Reader
read():读取单个字符并返回
read(char[]):将数据读取到数组中,并返回读取的个数。
FileReader
public class Demo1 { public static void main(String[] args) throws IOException { //明确数据源 FileReader fr=new FileReader("D:\\demo1018\\hello.txt"); //都一个字符 /*int len=fr.read(); System.out.println((char)len);*/ //一个字符一个字符的读 int len=0; while ((len=fr.read())!=-1) { System.out.print((char)len); } //释放资源 fr.close(); } } package com.oracle.demo02; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class Demo2 { public static void main(String[] args) throws IOException { //明确数据源 FileReader fr=new FileReader("D:\\demo1018\\hello.txt"); //读一个字符 char ch[]=new char[1024]; int len=0; while ((len=fr.read(ch))!=-1) { System.out.print(new String(ch,0,len)); System.out.println(); System.out.println(len); } //释放资源 fr.close(); } }
字符输出流Writer
FileWriter 写入字符到文件中,先进行流的刷新,再进行流的关闭
package com.oracle.demo02; import java.io.FileWriter; import java.io.IOException; public class Demo3 { public static void main(String[] args) throws IOException { //明确目的地 //FileWriter fw=new FileWriter("D:\\demo1018\\nihao.txt",true); FileWriter fw=new FileWriter("D:\\demo1018\\nihao.txt",true); //写入字符 fw.write(100); fw.flush(); //写一个字符数组 fw.write("\r\n你好123".toCharArray()); fw.flush(); //写入个字符串 fw.write("新年好,123",1,2); fw.flush(); /*fw.flush(); //写一个字符数组 char ch[]={'在','那','林','4','5','7','w'}; fw.write(ch,0,3); fw.flush(); //写入个字符串 fw.write("你好Java,1233",0,6); fw.flush();*/ //释放资源 fw.close(); } }
flush()和close()的区别
flush():将流中的缓冲区缓冲的数据刷新到目的地中,刷新后,流还可以继续使用
close():关闭资源,关闭前会将缓冲区中的数据先刷新到目的地,否则丢失数据,然后在关闭流。流不可以再使用。
如果写入数据多,一定要一边写一边刷新,最后一次可以不刷新,由close完成刷新并关闭
复制文本文件
package com.oracle.demo02; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class Copy { public static void main(String[] args) throws IOException { //明确目的地(复制到那里去) FileWriter fw=new FileWriter("D:\\demo1018\\a\\nihao2.txt"); //明确数据源(从哪赋值) FileReader fr=new FileReader("D:\\demo1018\\nihao.txt"); //一个字符一个字符复制 /*int len=0; while ((len=fr.read())!=-1) { fw.write(len); fw.flush(); }*/ //一个字符数组一个字符数组复制 char ch[]=new char[1024]; int len=0; while ((len=fr.read(ch))!=-1) { fw.write(ch,0,len); fw.flush(); } //释放资源 fw.close(); fr.close(); } }