- 字节流读取中文会出现的问题:
-
- 1.一个中文是两个字节,我们读取一半中文 打印出来就是乱码
-
- *
- 字符编码表:
-
- 1.ASCII码表:美国人,这个表中只有英文和符号 而且每一个字符都是一个字节 0000 0000
- 所有字符都是正数 a-97 0110 0001
-
- 2.GB2312:中文简体码表 (6000-7000个汉字),汉字占有2个字节,
- 中: 1010 0010 1000 1111 中:-10-20
-
- 3.GBK码表:中文汉字(20000多个),中文两个字节,有些文字:1010 0010 0100 1111
- 比如:国 -10 20
-
- 4.Unicode:(国际统一码表),所有国家的文字都有,不管是中文,英文,日文,所有字符都是2个字节
- a:97 —>0000 0000 0110 0001
-
- 6.UTF-8:码表,基于Unicode做了优化,一个字节就可以存储的数据,不用两个字节存储
- 一个中文在这个码表中占3个字节
-
- 总结:
- 我们中文使用的码表: GBK(中文2字节) UTF-8(中文3个字节) 英文(就是一个字节)
- 了解:ISO-8859-1,拉丁码表,拉丁文
- OutputStreamWriter: 字符输出流,写一个字符,一个字符数组,一个字符串
- 功能+类型
- OutputStreamWriter 是字符流通向字节流的桥梁,查表(编码)
-
- 构造:
-
- public OutputStreamWriter(OutputStream out);//由OutputStreamWriter编码,然后把编码后的数据交给out流
- public OutputStreamWriter(OutputStream out, String charsetName);//查指定的码表
- InputStreamReader:字符输入流 读一个字符 读一个字符数组
- InputStreamReader 是字节流通向字符流的桥梁,查表(解码)
- 注意:文件是GBK编码,那么我们要用GBK解码
- 文件是UTF-8编码,那么我们要用UTF-8解码
-
- 构造:
- public InputStreamReader(InputStream in);//由in读取字节数据,交给InputStreamReader去解码
- public InputStreamReader(InputStream in, String charsetName);//指定码表
/* - 在java中 把读写对象的流称为序列化流和反序列化流;
-
- 1.把一个对象 写到文件中,这种流我们称为 序列化流 ObjectOutputStream
-
- 2.从文件中把一个对象读取出来,这种流我们称为 反序列化流 ObjectInputStream
-
- *
- ObjectOutputStream类:
- public ObjectOutputStream(OutputStream out);
-
- ObjectInputStream类:
- public ObjectInputStream(InputStream in);
-
- 两个异常:
- 1.NotSerializableException: 写入到文件的对象所属的类 没有实现 Serializable接口
- 这个接口作用就是标记
-
- 2.InvalidClassException:无效类异常
- 写入一个对象后,修改该对象所属的类,再读取刚刚写入对象
-
- 3.transient:瞬态关键字
- 修饰成员变量,被transient修饰的成员变量,用法完全和没修饰一样
- 在对象序列化的时候,会自动忽略transient修饰的成员变量
-
- 实际上static也有此功能
- /*
- 打印流:
- PrintWriter PrintStream
-
- 他们的方法完全一样,但是打印的目的地不一样
-
- PrintWriter:
- 打印的目的地:可以是File对象,其他的字节输出流对象,字符串类型的文件名
- 还可以是字符输出流
-
- PrintStream:
- 打印的目的地:可以是File对象,其他的字节输出流对象,字符串类型的文件名
-
- *
- common-io框架:是第三方组织,Apache(阿帕奇)
-
- 使用第三方框架的步骤:
-
- 1.项目根目录下建立一个文件夹 “lib”
-
- 2.把要用的第三方框架的.jar包拷贝
-
- 3.把jar包添加到类路径(classpath)
- 右键要添加的jar包—>build path(构建路径)—>add to build path(添加到构建路径)
-
- 4.直接在你的代码中使用
-
- 以FileUtils工具类为例:基本上方法都是静态的
- writeStringToFile(File file,String content):将内容content写入到file中;
- readFileToString(File file):读取文件内容,并返回一个String;
-
- copyFile(File srcFile, File destFile): 文件复制
- copyDirectoryToDirectory(File srcDir,File destDir);文件夹复制
- 3.特有方法:
- put(K k,V v);====>setProperty(String propertyName,String propertyValue);
- get(K k);====>getProperty(String propertyName);
-
- Set keySet();====>Set stringPropertyNames();
-
- 4.和持久有关的方法
- 4.1 写数据到文件(保存数据)
- store(OutputStream out);//推荐用这个
- store(Writer write);
-
- 4.2从文件中读数据(读数据)
- load(InputStream in);//推荐用这个
- load(Reader reader);