我与二狗的学习日常
又过了一会。二狗找我说。
老大咱现在是知道了用字节流来操作文件。但是我如果想通过字符来操作可不可以呢?说着露出了问到你了吧的表情
我看到他这表情,斜睨了一下它
你不是第一个想到的,当然也不会是最后一个。关于这个问题你看一下咋们的I/O类结构图里面不是有着字符流类吗?你觉得它是摆设。他跟字节流一样都可以操作的。
哦,那是不是使用
FileReader();
FileWriter();
打开文件呢?
孺子可教也。不错就是这么干的。
那是不是读取的时候不可以用byte类型的变量来读取数据。毕竟那个是读取字节的。
对,读取使用int 或者是 char类型就可以。
又过了很长一段时间后,二狗又来找我。
老大,我有段代码没怎么清楚,不知道什么意思。
Reader input=null;
Writer output=null;
input= new InputStreamReader(new FileInputStream("src.txt"), "utf-8");
output = new OutputStreamWriter(new FileOutputStream("dest.txt"), "gbk");
你说这是什么事?你先用字节流开了个文件然后又把它当做参数开字符型的文件??
嗯,二狗你有此疑问是很正常的。我先给你普及一下,什么是转换流。即从 字节流转换为字符流 或者 从字符流转换为字节流 就叫转换流。还有就是编码方式。举个例子:
假如二狗你和一个不通中国话的歪果仁在一起。你们能不能正常对话?
根据我连英语都没过级的样子。明显不可能。
那么假如英语里面有着和汉语词语一样的发音的字,你会觉得两个的意思回事一样的吗?
很大概率不会吧!
对,即使有也不会太多。那么假如我把你说的语言称之为"utf-8",再把老外的语言称之为"gbk",那么虽然你们两个的语言有着少许在形式上一样并且意思也一样的语句。但并不是说全部都是这样。这就导致了你如果使用"gbk"相关字典翻译你的"utf-8"的文章。很显然,会出现错误。这就是编码规则。每个都有着属于自己的编码规则。
那么这个跟咋们的这个代码有什么关系吗?
你看到了里面的第二个参数是什么了吗?
哦,是"utf-8" 和 “gbk”
对,因为你打开文件的时候用字节流打开的,所以是二进制的。虽说两个都是
二进制但是显然他们的编码规则不一样。所以需要各自的编码规则去翻译成字符。这就是它做的全部事情。
当然这些为了让你有个初步认识。实际情况并非如此简单。详细的要自己去查。
直接放代码:
边打边学
可能引起你的恐惧的代码那里已经标记好。最下面已经给你解释好了那段标记的代码。恐惧了就看一下解释。激励一下自己。
//做法一: 一次读一个字符,默认字符编码是OS默认编码,本程序是gbk
import java.io.*;
public class IOStreamTest {
public static void main(String[] args) throws IOException {
//恐惧点1
Reader input=null;
Writer output=null;
input= new FileReader("src.txt");
output = new FileWriter("dest.txt");
int b=-1;
while(true){
b=input.read();
if(b==-1) break;
System.out.print((char)b);
System.out.print(b);
output.write(b);
}
input.close();
output.close();
}
}
/**
//做法一: 一次读一个字符,默认字符编码是OS默认编码,本程序是gbk
package cn.edu.dlnu;
import java.io.*;
public class IOStreamTest {
public static void main(String[] args) throws IOException {
Reader input=null;
Writer output=null;
input= new FileReader("src.txt");
output = new FileWriter("dest.txt");
int b=-1;
while((b=input.read())!=-1){
output.write(b);
}
input.close();
output.close();
}
}
*/
/**
//做法二:一次读出若干个字符,使用数组
package cn.edu.dlnu;
import java.io.*;
public class IOStreamTest {
public static void main(String[] args) throws IOException {
Reader input=null;
Writer output=null;
input= new FileReader("src.txt");
output = new FileWriter("dest.txt");
char[] b=new char[10];
int length=-1;
while((length=input.read(b))!=-1 ){
output.write(b,0,length); // 为啥写length?
}
System.out.println("程序运行结束.");
input.close();
output.close();
}
}
*/
/**
//做法二的改进版本, 按字符编码读到RAM的数组中;
//再按另一种字符编码写到文件中
//如本例,src文件字符编码是utf-8, dest文件字符编码是gbk
//你要做的工作,将src.txt编码变为 utf-8(不带BOM头的),搜搜看咋变?
package cn.edu.dlnu;
import java.io.*;
public class IOStreamTest {
public static void main(String[] args) throws IOException {
Reader input=null;
Writer output=null;
//恐惧2
input= new InputStreamReader(new FileInputStream("src.txt"), "utf-8");
output = new OutputStreamWriter(new FileOutputStream("dest.txt"), "gbk");
char[] b=new char[7];
int length=-1;
int count=0; //统计字节总数
while((length=input.read(b))!=-1 ){
output.write(b,0,length); // 为啥写length?
//按src.txt文本编码格式,以字节形式输出文本
for(int i=0; i<length;i++) {
System.out.printf("%c",b[i]);
}
count +=length;
}
System.out.printf(" \nThe length of file: %d个字符\n", count);
input.close();
output.close();
}
}
*/
恐惧1
Reader input = null;
Writer output = null;
//需要输入相对地址
input = new FileReader("D:\\JAVA\\Java\\IOStream\\src\\two\\src.txt");
output = new FileWriter("D:\\JAVA\\Java\\IOStream\\src\\two\\destdemo1.txt");
第一和第二行的代码:你需要先认识到 input 和 output 是两个变量。而他的类型是它前面的Reader 和 Writer 。
如果你想知道这个类型到底是什么呢?
现在没有必要。毕竟你只需知道他们两个是变量就可以了。反正不会影响你的使用。等你学完了这一段你就会明白的。就好像地球是会转的,但为什么会转是你以后要考虑的事情,而不是现在。
恐惧2
还是不懂?
看一下别人写的博客