1).使用字节流写入文本文件,这个没有问题。对于out.writer(byte[] byteArray)方法,内部使用了"字符集"信息。使用平台默认的字符集。
2).当程序读取时,就要按照写入的顺序,以及"字节码"数量进行读取,否则就会出现"乱码";
3).这时,Java将对"文本文件"读写的流,单独分离出来,专门对"文本文件"进行读写。
这些单独分离出来的流,就是"字符流"。
字符流的特点:可以指定"编码方式(字符集)"。由于指定了字符集,所以它可以一次读写一个"字符";
4).以后,我们知道涉及到对"文本文件"进行读写操作,如果需要"显示数据",就考虑使用"字符流"
5).Java中提供了两种"转换流",可以将"字节流"转换为"字符流":
转换流:
输出流:OutputStreamWriter:
输入流:InputStreamReader:
(1).写入文件时,是编码;
(2).将文字内容按照某种的"字符集(编码表)"编译成二进制数据,写入到文件中;
(3).将"看得懂的"变为"看不懂的";
(4).String的编码方式:将字符串变为字节数组
String.getBytes();使用平台的默认字符集:GBK
String.getBytes(Charset charset):指定字符集。
String.getBytes(String charsetName):指定字符集
(1).从文件中读取内容,并向用户显示出来;
(2).关键是:向用户显示时,将几个字节的二进制,解码为一个文字;
(3).按照某种字符集,将相应的二进制,转换为能看得懂的文字;
(4).将"看不懂的" 转换为 "看得懂的"
(5).String的解码方式:将字节数组使用构造方法变为字符串
String(byte[] bytes, String charsetName)
String(byte[] bytes, int offset, int length, String charsetName)
public class Demo {
public static void main(String[] args) throws UnsupportedEncodingException {
byte[] byteArray1 = "a".getBytes();
System.out.println("byteArray1.length = " + byteArray1.length);//1
byte[] byteArray2 = "ab".getBytes();
System.out.println("byteArray2.length = " + byteArray2.length);//2
byte[] byteArray3 = "你".getBytes();
System.out.println("byteArray3.length = " + byteArray3.length);//2
byte[] byteArray4 = "你".getBytes("GBK");
System.out.println("byteArray4.length = " + byteArray4.length);//2
byte[] byteArray5 = "你".getBytes("UTF-8");
System.out.println("byteArray5.length = " + byteArray5.length);//3
//将上述的byte数组进行解码
String s4 = new String(byteArray4);//使用平台默认的
String s5 = new String(byteArray4,"GBK");
System.out.println("s4 = " + s4);
System.out.println("s5 = " + s5);
// String s6 = new String(byteArray5,"GBK");
String s6 = new String(byteArray5,"UTF-8");//保持跟编码方式一致,才不会乱码;
System.out.println("s6 = " + s6);//乱码(解码时使用的字符集和编码时使用的不一致)
public OutputStreamWriter(OutputStream out):使用一个字节输出流构造一个转换流
public OutputStreamWriter(OutputStream out,String charsetName):使用一个字节输出流,和编码方式,构造一个转换流:
public InputStreamReader(InputStream in):使用一个字节输入流构造
public InputStreamReader(InputStream in,String charsetName):使用一个字节输入流,和一个编码方式构造
public int read():读取单个字符
public int read(char[] cbuf):读取到一个字符数组cbar,返回读取的字符的数量;
范例:
char[] charArray = new char[10];
int len = 0;
while((len = in2.read(charArray)) != -1){//返回读取的字符数量
String s = new String(charArray,0,len);//字符串的构造方法,转化为字符串。
System.out.println("读取的内容:" + s);
一次读取一个字符
一次读取一个字符数组
FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。
FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
FileWriter(File file, boolean append) :根据给定的 File 对象以及是否追加写入构造一个 FileWriter 对象。
没有自有的方法,都是从父类继承的;5种写入的方法:见OutputStreamWriter
FileReader(String fileName) :在给定从中读取数据的文件名的情况下创建一个新 FileReader。
FileReader(File file) :在给定从中读取数据的 File 的情况下创建一个新 FileReader。
没有自有的方法,都是从父类继承的;2种读取的方法:见InputStreamReader
构造方法:BufferedWriter(Writer out) :创建一个使用默认大小输出缓冲区的缓冲字符输出流
写入的方法:几个write()方法都是使用父类的;
特有的方法:void newline()输出一个换行。(当然也可以直接书写一个换行符write(\r\n))
构造方法:BufferedReader(Reader in) : 创建一个使用默认大小输入缓冲区的缓冲字符输入流
读取方法:继承的方法:public int read()一次读取一个字符
public int read(char[] charArray)一次读取一个字符数组
特有的方法:String read()一次读取一行数据
String s = null;
while((s = in.readLine()) != null){
System.out.println("读一行:" + s);
OutputStream:
|--FileOutputStream:
|--FilterOutputStream:(没学)
|--BufferedOutputStream:
InputStream:
|--FileInputStream:
|--FilterInputStream:(没学)
|--BufferedInputStream:
write(int n):写入一个字节:
write(byte[] byteArray):写入一个字节数组;
int read():读取一个字节:
int read(byte[] byteArray):读取一个字节数组;
Writer:
|--OutputStreamWriter:
|--FileWriter:
|--BufferedWriter:
Reader:
|--InputStreamReader:
|--FileReader:
|--BufferedReader:
基本字符流,和缓冲流都具有的:
write(int n):写入一个字符:
write(char[] charArray):写入一个字符数组;
write(char[] charArray,int off,int len):写入字符数组的一部分;
write(String s):写入一个字符;
write(String s,int off,int len):写入一个字符串的一部分;
缓冲流特有的:
BufferedWriter:
newLine();
BufferedReader:
String readLine();