今日内容介绍
    标准输入流 & 转换流 & 打印流
    对象操作流
    Properties集合
第1章 标准输入流 & 转换流 & 打印流
1.1 标准输入输出流public static final InputStream in:标准输入流public static final PrintStream out:标准输出流package com.itheima_05;
/** 标准输入输出流:public static final InputStream in:字节输入流,用来读取键盘录入的数据public static final int x;InputStream is = System.in;Scanner sc = new Scanner(System.in);public static final PrintStream out:字节输出流,将数据输出到命令行System.out.println();*/
public class SystemInOutDemo {}1.2  转换流
1.2.1   OutputStreamWriter:将字节输出流转换为字符输出流
1.2.1.1 案例代码一:package com.itheima_05;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;/** 需求:读取项目根目录下的SystemInOutDemo.java,并输出到命令行* * 数据源:项目根目录下的SystemInOutDemo.java  BufferedReader* 目的地:命令行  System.out* * * 由于标准输出流是一个字节输出流,所以只能输出字节或者字节数组,但是我们读取到的数据则是字符串,如果想进行输出还需要转换成字节数组* 我们要想通过标准输出流输出字符串,把标准输出流转换成一种字符输出流即可,OutputStreamWriter* * OutputStreamWriter(OutputStream out) :转换流,把字节输出流转换成字符输出流* * */
public class OutputStreamWriterDemo {public static void main(String[] args) throws IOException   {//method2();//创建输入流对象BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));//创建输出流对象//OutputStream os = System.out;//Writer w = new OutputStreamWriter(System.out);//多态,父类型引用指向子类对象//BufferedWriter bw = new BufferedWriter(w);BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));//进行数据的读写String line;//用于存储读取到的数据while((line = br.readLine()) != null) {bw.write(line);bw.newLine();}//释放资源bw.close();br.close();}private static void method2() throws FileNotFoundException, IOException {//创建输入流对象BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));//创建输出流对象//OutputStream os = System.out;Writer w = new OutputStreamWriter(System.out);//多态,父类型引用指向子类对象//进行数据的读写String line;//用于存储读取到的数据while((line = br.readLine()) != null) {w.write(line);w.write("\r\n");}//释放资源w.close();br.close();}private static void method() throws FileNotFoundException, IOException {//创建输入流对象BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));//创建输出流对象OutputStream os = System.out;String line;//用于存储读取到的数据while((line = br.readLine()) != null) {os.write(line.getBytes());os.write("\r\n".getBytes());}//释放资源os.close();br.close();}
}
1.2.2   InputStreamReader:将字节输入流转换为字符输入流
1.2.2.1 案例代码二:
package com.itheima_05;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;/** 需求:读取键盘录入的数据,并输出到项目根目录下的a.txt文件中* * 数据源:读取键盘录入的数据    System.in* 目的地:项目根目录下的a.txt  FileWriter* * * * 转换流:需要把字节输入流转换成字符输入流,InputStreamReader* InputStreamReader(InputStream in) */
public class InputStreamReaderDemo {public static void main(String[] args) throws IOException  {//创建输入流对象InputStream is = System.in;Reader r = new InputStreamReader(is);//创建输出流对象FileWriter fw = new FileWriter("a.txt");//读写数据char[] chs = new char[1024];int len;while((len = r.read(chs)) != -1) {fw.write(chs,0,len);fw.flush();}//释放资源fw.close();is.close();}private static void method() throws IOException {//创建输入流对象InputStream is = System.in;//创建输出流对象FileWriter fw = new FileWriter("a.txt");//读写数据byte[] bys = new byte[1024];int len;//用于存储读取到的字节个数while((len = is.read(bys)) != -1) {fw.write(new String(bys,0,len));fw.flush();}//释放资源fw.close();is.close();}
}
1.3 打印流
打印流添加输出数据的功能,使它们能够方便地打印各种数据值表示形式.
字符打印流   PrintWriter
void print(String str): 输出任意类型的数据,
void println(String str): 输出任意类型的数据,自动写入换行操作
1.3.1   案例代码三:
package com.itheima_06;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;/** 打印流:*         PrintStream*        PrintWriter*            可以自动换行,println()*            不能输出字节,但是可以输出其他任意类型*             通过某些配置,可以实现自动刷新(只有在调用 println、printf 或 format才有用)*             也是包装流,不具备写出功能*           可以把字节输出流转换成字符输出流* * 注意:只能输出不能输入* *  */
public class PrintWriterDemo {public static void main(String[] args) throws IOException  {//创建打印流对象PrintWriter pw = new PrintWriter("b.txt");//写出数据pw.write("hello");pw.write("world");pw.write("java");//释放资源pw.close();}
}
1.3.2   案例代码四:利用打印流实现自动换行与自动更新package com.itheima_06;import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;/** 打印流的特有功能:*        自动换行 使用方法println()实现自动换行*       自动刷新  创建PrintWriter对象时启动自动刷新开关,并且使用println等3个方法可以实现自动刷新* * 注意:创建FileWriter对象时boolean参数是是否追加,*      而创建打印流对象的boolean类型参数是是否自动刷新*/
public class PrintWriterDemo2 {public static void main(String[] args) throws IOException  {//method();//创建打印流对象//PrintWriter pw = new PrintWriter("d.txt");PrintWriter pw = new PrintWriter(new FileWriter("d.txt"),true);pw.println("hello");pw.println("world");pw.println("java");//释放资源//pw.close();}private static void method() throws FileNotFoundException {//创建打印流对象PrintWriter pw = new PrintWriter("c.txt");/*pw.write("hello");pw.write("world");pw.write("java");*/pw.print("hello");pw.println("world");pw.println("java");//释放资源pw.close();}
}1.3.3  案例代码五:利用打印流将根目录下的SystemInOutDemo.java复制到d:\\SystemInOutDemo.java下
package com.itheima_06;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;/** 使用打印流复制文本文件* * 数据源   SystemInOutDemo.java    BufferedReader* 目的地 d:\\SystemInOutDemo.java    PrintWriter* */
public class PrintWriterDemo3 {public static void main(String[] args) throws IOException  {//创建输入流对象BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java"));//创建打印流对象PrintWriter pw = new PrintWriter(new FileWriter("d:\\SystemInOutDemo.java"),true);String line;//用于存储读取到的每行数据while((line = br.readLine()) != null) {pw.println(line);}//释放资源pw.close();br.close();}}
第2章 对象操作流2.1    概述
用于从流中读取对象的
ObjectInputStream 称为 反序列化流,利用输入流从文件中读取对象
ObjectOutputStream 称为 序列化流,利用输出流向文件中写入对象
特点:用于操作对象。可以将对象写入到文件中,也可以从文件中读取对象。
package com.itheima_07;
/*  * 对象操作流:可以用于读写任意类型的对象*       ObjectOutputStream*                 writeObject *               ObjectOutputStream(OutputStream out) *      ObjectInputStream*              readObject*                 ObjectInputStream(InputStream in)* * 注意:*        使用对象输出流写出对象,只能使用对象输入流来读取对象*      只能将支持 java.io.Serializable 接口的对象写入流中* */
public class ObjectOutputStreamDemo2 {public static void main(String[] args)  {}}
2.2 利用序列化流读写对象
package com.itheima_07;import java.io.Serializable;public class Student implements Serializable {/*** */String name;int age;public Student(String name,int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age +"]";}
}package com.itheima_07;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;/*    * 使用对象输出流和读对象输入流写对象* Exception in thread "main" java.io.NotSerializableException: com.itheima_07.Student* Serializable:序列号,是一个标识接口,只起标识作用,没有方法*              当一个类的对象需要IO流进行读写的时候,这个类必须实现该接口* * Exception in thread "main" java.io.EOFException:当输入过程中意外到达文件或流的末尾时,抛出此异常。* */
public class ObjectOutputStreamDemo {public static void main(String[] args) throws IOException, ClassNotFoundException  {//method();//创建对象输入流的对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"));//读取对象/*Object obj = ois.readObject();System.out.println(obj);Object obj2 = ois.readObject();System.out.println(obj2);Object obj3 = ois.readObject();System.out.println(obj3);*/try {while(true) {Object obj = ois.readObject();System.out.println(obj);}} catch(EOFException e) {System.out.println("读到了文件的末尾");}//释放资源ois.close();}private static void method() throws IOException, FileNotFoundException {//创建对象输出流的对象//FileOutputStream fos = new FileOutputStream("a.txt");//ObjectOutputStream oos = new ObjectOutputStream(fos);ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));//创建学生对象Student s = new Student("zhangsan",18);Student s2 = new Student("lisi",19);//写出学生对象oos.writeObject(s);oos.writeObject(s2);//释放资源oos.close();}}
2.2.1   案例代码六:
package com.itheima_02;import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;/** 使用字符流复制文本文件* * 数据源       IODemo.java* 目的地        d:\\IODemo.java*    */
public class FileCopyDemo {public static void main(String[] args) throws IOException  {//创建字符输入流对象FileReader fr = new FileReader("IODemo.java");//创建字符输出流对象FileWriter fw = new FileWriter("d:\\IODemo.java");//一次读写一个字符/*int ch;while((ch = fr.read()) != -1) {fw.write(ch);fw.flush();}*///一次读写一个字符数组int len;//用于存储读到的字符个数char[] chs = new char[1024];while((len = fr.read(chs)) != -1) {fw.write(chs,0,len);fw.flush();}//释放资源fw.close();fr.close();}
}2.3    解决对象输入流读取对象出现异常的问题
2.3.1   案例代码七:
package com.itheima_07;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;/** 解决对象输入流读取对象出现异常的问题* */
public class ObjectOutputStreamDemo3 {public static void main(String[] args) throws IOException, ClassNotFoundException   {//method();//创建对象输入流的对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("b.txt"));//读取数据Object obj = ois.readObject(); //System.out.println(obj);//向下转型,获取具体的子类对象ArrayList<Student> list = (ArrayList<Student>) obj;for (Student student : list) {System.out.println(student);}//释放资源ois.close();}private static void method() throws IOException, FileNotFoundException {//创建对象输出流的对象ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("b.txt"));//创建集合对象ArrayList<Student> list = new ArrayList<Student>();//添加学生对象list.add(new Student("wangwu",30));list.add(new Student("zhaoliu",28));//写出集合对象oos.writeObject(list);//释放资源oos.close();}
}2.4    解决读写对象版本不一致问题2.4.1  案例代码八:
package com.itheima_07;import java.io.Serializable;public class Student implements Serializable {/*** */private static final long serialVersionUID = 6361890890437825953L;String name;int age;String gender;public Student(String name,int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + ", gender=" + gender + "]";}}package com.itheima_07;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;/** 解决对实现序列化接口出现的黄色警告问题* Exception in thread "main" java.io.InvalidClassException* 当 Serialization 运行时检测到某个类具有以下问题之一时,抛出此异常。 该类的序列版本号与从流中读取的类描述符的版本号不匹配 该类包含未知数据类型 该类没有可访问的无参数构造方法 * */
public class ObjectOutputStreamDemo4 {public static void main(String[] args) throws IOException, ClassNotFoundException  {//method();method2();}//读取学生对象private static void method2() throws IOException, FileNotFoundException, ClassNotFoundException {//创建对象输入流的对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c.txt"));//读取对象Object obj = ois.readObject();System.out.println(obj);//释放资源ois.close();}//写出学生对象private static void method() throws IOException, FileNotFoundException {//创建对象输出流的对象ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c.txt"));//创建的学生对象Student s = new Student("qianqi",28);//写出学生对象oos.writeObject(s);//释放资源oos.close();}}
第3章 Properties集合
3.1 Properties介绍
Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
特点:
1、Hashtable的子类,map集合中的方法都可以用。
2、该集合没有泛型。键值都是字符串。
3、它是一个可以持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备。
4、有和流技术相结合的方法。3.2   利用Properties存储键值对
3.2.1   案例代码九:package com.itheima_08;import java.util.Map;
import java.util.Properties;
import java.util.Set;/** Properties:表示了一个持久的属性集,属性列表中每个键及其对应值都是一个字符串* * 构造方法:*         Properties() */
public class PropertiesDemo2 {public static void main(String[] args) {//创建属性列表对象Properties prop = new Properties();//添加映射关系prop.put("CZBK001", "zhangsan");prop.put("CZBK002", "lisi");prop.put("CZBK003", "wangwu");//遍历属性列表//获取所有的key,通过key获取valueSet<Object> keys = prop.keySet();for (Object key : keys) {Object value = prop.get(key);System.out.println(key + "=" + value);}System.out.println("------------------");//获取所有的结婚证对象Set<Map.Entry<Object,Object>> entrys = prop.entrySet();for (Map.Entry<Object, Object> entry : entrys) {Object key = entry.getKey();Object value = entry.getValue();System.out.println(key + "=" + value);}}
}3.3    Properties与流结合使用
3.3.1   案例代码十:
package com.itheima_08;import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;/** Properties和IO流结合的功能: void load(Reader reader) void list(PrintWriter out)void store(Writer writer, String comments) **/
public class PropertiesDemo2 {public static void main(String[] args) throws IOException{//method();//method2();//创建属性列表对象Properties prop = new Properties();//添加映射关系prop.setProperty("CZBK001", "zhangsan");prop.setProperty("CZBK002", "lisi");prop.setProperty("CZBK003", "wangwu");//创建输出流对象FileWriter fw = new FileWriter("e.txt");//void store(Writer writer, String comments) prop.store(fw, "hello world");//释放资源fw.close();}private static void method2() throws FileNotFoundException, IOException {//创建属性列表对象Properties prop = new Properties();//创建一个输入流对象FileReader fr = new FileReader("d.txt");//void load(Reader reader) prop.load(fr);//释放资源fr.close();System.out.println(prop);}private static void method() throws FileNotFoundException {//创建属性列表对象Properties prop = new Properties();//添加映射关系prop.setProperty("CZBK001", "zhangsan");prop.setProperty("CZBK002", "lisi");prop.setProperty("CZBK003", "wangwu");//创建打印流对象PrintWriter out = new PrintWriter("d.txt");//void list(PrintWriter out)  prop.list(out);//释放资源out.close();}
}第4章    编码表
4.1 编码表的概述
编码表:把计算机底层的二进制数据转换成我们能看到的字符*         ASCII* *        GB2312  --- GBK*        Unicode 所有的字符都占2个字节*        UTF-8   长度可变的码表* * ANSI:本地编码表    gbk* Java中的字符串默认使用的ANSI(gbk)* * 乱码:编码保持前后一致即可解决
4.2 Java中字符串的编码
4.2.1   常用方法
构造方法(字节数组转字符串):
String():初始化一个新创建的 String 对象,使其表示一个空字符序列
String(byte[] bytes) 使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String
String(byte[] bytes, Charset charset) 通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String
成员方法(字符串转字节数组)getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中getBytes(Charset charset) 使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组4.2.2   案例代码十一
package com.itheima_09;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;/** 编码表:把计算机底层的二进制数据转换成我们能看到的字符*         ASCII* *        GB2312  --- GBK*        Unicode 所有的字符都占2个字节*        UTF-8   长度可变的码表* * ANSI:本地编码表    gbk* Java中的字符串默认使用的ANSI(gbk)* * 乱码:编码保持前后一致即可解决* */
public class EncoderDemo {public static void main(String[] args) throws IOException   {//method();FileInputStream fis = new FileInputStream("a.txt");byte[] bys = new byte[1024];int len = fis.read(bys);//System.out.println(new String(bys,0,len));System.out.println(new String(bys,0,len,"UTF-8"));}private static void method() throws UnsupportedEncodingException, FileNotFoundException, IOException {String s = "高薪就业";//byte[] bys = s.getBytes();//通过默认编码转换成数组byte[] bys = s.getBytes("UTF-8");FileOutputStream fos = new FileOutputStream("a.txt");fos.write(bys);fos.close();}}4.3    字符流中的编码
4.3.1   常见对象
InputStreamReader(InputStream in, CharsetDecoder dec) 创建使用给定字符集解码器的 InputStreamReaderOutputStreamWriter(OutputStream out, CharsetEncoder enc) 创建使用给定字符集编码器的 OutputStreamWriter
4.3.2   案例代码十二
package com.itheima_09;import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;/** 字符流中的编码* * 字符流 = 字节流 + 编码* */
public class EncoderDemo2 {public static void main(String[] args) throws IOException {//method();OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"),"UTF-8");//OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"));String s = "迎娶白富美";osw.write(s);osw.close();}private static void method() throws IOException, UnsupportedEncodingException {FileWriter fw = new FileWriter("b.txt");String s = "月薪过万";byte[] bys = s.getBytes("UTF-8");//fw.write(s);fw.write(new String(bys));fw.close();}}

21 字符流与字节流相关推荐

  1. 笔记整理5----Java语言高级(五--完结)21 字符流与字节流+22 多线程+23 网络编程

    21 字符流与字节流+22 多线程+23 网络编程 第10天 IO流 今日内容介绍  标准输入流 & 转换流 & 打印流  对象操作流  Properties集合 第1章标准输入 ...

  2. java 字符流与字节流区别_JAVA 字符流与字节流的区别

    Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 U ...

  3. java中字符流 字节流_理解Java中字符流与字节流的区别

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个"流动的方向",通常可 ...

  4. java字符流和字节流的区别_java字符流与字节流的区别是什么

    java中字符流与字节流的区别: 1.字节流操作的基本单元为字节:字符流操作的基本单元为Unicode码元. 2.字节流默认不使用缓冲区:字符流使用缓冲区. 3.字节流通常用于处理二进制数据,实际上它 ...

  5. java binaryreader_Java字符流与字节流区别与用法分析

    本文实例讲述了Java字符流与字节流区别与用法.分享给大家供大家参考,具体如下: 字节流与字符流主要的区别是他们的的处理方式 流分类: 1.Java的字节流 InputStream是所有字节输入流的祖 ...

  6. JAVA I/O流 字符流和字节流、节点流和处理流(包装流、过滤流)、缓冲流

    JAVA IO流 一.相关概念 1.分类: 区别和联系 代码 嵌套的IO流关闭的问题 一.相关概念 I/O流: Input/Output Stream,文件输入输出流. 1.分类: 输入流 和 输出流 ...

  7. 01-21 IO流(字符流与字节流)

    IO流(字符流与字节流) 今日内容介绍  标准输入流 & 转换流 & 打印流  对象操作流  Properties集合 第1章标准输入流 & 转换流 & 打印流 ...

  8. 【Java网络编程与IO流】Java中IO流分为几种?字符流、字节流、缓冲流、输入流、输出流、节点流、处理流

    Java网络编程与IO流目录: [Java网络编程与IO流]Java中IO流分为几种?字符流.字节流.缓冲流.输入流.输出流.节点流.处理流 [Java网络编程与IO流]计算机网络常见面试题高频核心考 ...

  9. 字符流与字节流的相互转换原理及代码(Linux C)

    文章目录 一. 两者的区别 二. 还需要了解 三. 字节流转字符流实现 三. 字符流转字节流实现 四. 测试程序 4.1 头文件 4.2 用于测试的程序 4.2 简单写一个makefile 4.3 运 ...

最新文章

  1. go 的des加解密
  2. coso全称是什么_国际贸易术语的全称是什么?
  3. python gui测试框架_八款常用的 Python GUI 开发框架推荐
  4. MFC中的Document-View结构
  5. 寒假万恶之源3:抓老鼠啊~亏了还是赚了?
  6. 一般的模式匹配算法(求子串位置)
  7. Spring Data MongoDB示例
  8. 没想到,我们的分布式缓存竟这样把注册中心搞垮!
  9. C# LINQ 对象克隆
  10. CStdioFile UNICODE编译 读取中文汉字乱码 .
  11. SpringBoot整合Minio实现文件上传、下载
  12. 真正提升关键词排名的外链应该怎样发?
  13. 公排系统php,全球公排自动滑落二二复制多级分销系统PHP二二复制多级分销源码...
  14. HashMap常见面试题
  15. linux病毒通过U盘传播,一个通过U盘传播的病毒详细分析,近期抓的但是是09年的病毒...
  16. STM8S003F3和N76E003功能引脚对比
  17. 小程序重构 [cnode社区]:mpvue + 开源api,现已上线!
  18. 深度剖析ConcurrentHashMap
  19. 如何写一个好的Github项目文档
  20. K8S篇-安装Syncthing

热门文章

  1. 【渝粤题库】陕西师范大学151108 会计信息化 作业(高起专)
  2. RoadFlow的表单设计中的数据表格
  3. 2022第一波行业红利,“东数西算”时代的云网智能新机会
  4. arduino连接热敏打印机的资料
  5. linux 查看公网ip
  6. 三分钟搭建开源堡垒机JumpServer
  7. android 字体百分比,android 解决百分比布局适配时Textview的字体Textsize比例缩放问题...
  8. 项目组小型任务管理工具-ToDoList
  9. word排版快捷指令_十个绝对经典的word排版小技巧+WORD经典快捷100招
  10. coscon(cosco南京)