字节流,用中文可能会出现乱码
计算机中存储的信息都是二进制表示的
按照某种规则将字符编程二进制 再存储到计算机中,成为编码
按照同样规则,在计算机中二进制数解析出来,成为解码
编码和解码的方式必须一致,否则会导致乱码
不管在哪张码表中,中文的第一个字节一定是负数
编码和解码的方法
编码:
byte[] getBytes():使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
byte[] getBytes(String charsetName):使用指定的字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
解码:
String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的 String
String(byte[] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的 String
为什么字节流读取文本文件,可能会出现乱码?
因为字节流一次只读一个字节,但是中文都是多个字节 所以会出现乱码
字符流=字节流+编码表
字符流读取中文的过程:一旦读到负数,就知道是中文,将三个字节作为整体
小结
1,想要进行拷贝,一律使用字节流或者字节缓冲流
2,想要把文件中的数据读到内存中打印或者读到内存中运算,请使用字符输入流。 想要把集合,数组,键盘录入等数据写到文件中,请使用字符输出流
3,GBK码表一个中文两个字节,UTF-8编码格式一个中文3个字节。
字符流写数据
1.创建对象
FileWriter fw = new FileWriter("text\\a.txt");
注意:如果文件不存在,就创建,但是要保证父路径存在
如果文件存在,就清空文件
2.写数据
注意:
1.写出int类型的整数,实际上是整数在码表上对应的字母
2.如果是字符串数据,就把字符串本身原样写出
void write(int c) |
写一个字符 |
void write(char[] cbuf) |
写入一个字符数组 |
void write(char[] cbuf, int off, int len) |
写入字符数组的一部分 |
void write(String str) |
写一个字符串 |
void write(String str, int off, int len) |
写一个字符串的一部分 |
其中 写字符串用的比较多
fw.flush() 刷新流,刷新完毕之后写入的信息才会真正到文件里, 还可以继续写数据
3.释放资源
fw.close() //刷新流并关闭
每次使用完流必须释放资源
字符流读数据
1.创建对象
FileReader fr = new FileReader()
方法名 |
说明 |
int read() |
一次读一个字符数据 |
int read(char[] cbuf) |
一次读一个字符数组数据 |
public static void main(String[] args) throws IOException { // 创建读的对象 FileReader fr = new FileReader("test\\a.txt"); //创建字符数组 作为读出来数据的容器 char[] chars = new char[1024]; //定义返回的数组长度 int len ; //如果新一轮循环读不到数据 就会返回-1 while ((len=fr.read(chars))!=-1){ //将读到的所有字符转换成字符串 System.out.println(new String(chars,0,len)); } }
手动录入用户名和密码存入文件
public static void main(String[] args) throws IOException { Scanner sc = new Scanner(System.in); FileWriter fw = new FileWriter("test\\a.txt"); System.out.println("请输入用户名"); String uname = sc.next(); //写入用户名加换行 fw.write(uname+"\r\n"); System.out.println("请输入密码"); String upsd = sc.next(); fw.write(upsd); fw.close(); }
字符缓冲流
字符缓冲流:
BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途
BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途
构造方法:
BufferedWriter(Writer out)
BufferedReader(Reader in)
字符缓冲流特有功能
BufferedWriter:
void newLine() 写一行分隔符,行分隔符字符串由系统自定义
BufferedReader:
public String readLine(): 直接读一行文字,结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null
循环遍历读出文件的每行内容:
public static void main(String[] args) throws IOException { Scanner sc = new Scanner(System.in); BufferedReader br = new BufferedReader(new FileReader("test\\a.txt")); String line; while ((line= br.readLine())!=null){ System.out.println(line); } br.close(); }