day12-IO【转换流,打印流,序列化】

1.IO回顾

字符流:是用来读写字符数据的流;

输出流:
    FileWriter类
        方法:
            void write(char c):把字符c对应的字符写到文件中;
            void write(char[] cArray):把字符数组中的数据写到文件中;
            void write(char[] cArray,int index,int len):把字符数组的一部分数据写到文件中;
                ......
    BufferedWriter类
        方法:
            同上;
输入流:
    FileReader 类
        方法:
            int read():读取一个字符,返回这个字符对应的ASCII数字;
            int read(char[] cArray):读多个数字的字符,把独到的字符都放在cArray数组中;
    BufferedReader 类
        方法:
            同上;
            String readLine():读一行字符串,返回的是这一行字符串的内容;

字节流

输出流:
    outputstream 类:
        是一个抽象父类,是所有字节输出流的父类,里面定义了所有字节输出流最基本的功能;
    fileoutputstream 子类:
        以字节数据写到文件中;
        方法:
            ......
    bufferedoutputstream 类
        缓冲字节输出流,里面包含两部分:基本的字节输出流和缓冲区;
        基本的字节输出流:是用来写数据的,是把数据写到缓冲区中;
        缓冲区:当缓冲区的空间被沾满或者调用flush方法或者调用close方法,才把缓冲区的数据写到文件中;
        写的效率高;

        方法:
            .....
输入流:

    inputstream类:
        是一个抽象父类,是所有字节输入功流的父类;里面定义了所有字节输入流最基本的功能;
    fileinputstream 子类:
        从文件中读取字节数据,读入到内存中;
        方法:
            int read();
            int read(byte[] bArray);
    bufferedinputstream 类
        缓冲字节输入流,里面包含两部分:基本的字节输入流和缓冲区;
        方法:
            .....

2.文件中的编码

ASCII:美国标准信息交换码。(128个字符)

ISO8859-1:拉丁码表。欧洲码表,不能对中文进行编码;

GB2312:中国的简体中文编码表;

GBK:中国的中文编码表升级,融合了更多的中文文字符号。(中文默认编码表)

GB18030:罪行的中文码表,目前还没有正式使用;

Unicode:国际标准码,融合了多种文字;

所有文字都用两个字节来表示,Java语言使用的就是Unicode。

UTF-8(基于Unicode):最多用三个字节,至少使用一个字节来表示一个字符。(编码的长度是变化的)

UTF-8不同,它定义了一种“区间规则”,这种规则可以和ASCII编码保持最大程度的兼容;

*在中文的操作系统保存文件时,采用的是GBK编码表

英文字符—>文件中—->1一个字节

中文字符—>文件中—->2一个字节

*记住常用的编码

ASCII ISO8859-1 GBK Unicode UTF-8

以后做项目是项目的字符编码统一使用UTF-8的编码;

3.转换流

是介于字符流与字节流之间的一种流;

可以把字节转成字符数据,也可以把字符转成字节数据;

3.1 OutputStreamWriter 类
    输出流,可以按照指定的字符集编码  把字符转换成字节数据。

    编码:把字符数据转换成字节数据; 字符数据->二进制数据

    解码:把字节数据转换成字符数据;二进制数据->字符数据

    构造方法:
        1.OutputStreamWriter(OutputStream  out):是用指定的字节输出流对象和默认的字符集编码,创建转换流对象;
        2.OutputStreamWriter(OutputStream out,String charsetName):使用指定的字节输出流对象和指定的字符集编码创建转换流对象;

    成员方法:
        void write(int c):按照指定的编码把数字转成字节数据,然后存储到文件中;
        void write(char[] cbuf, int off, int len):把字符数组中的一部分元素,按照指定的编码转成字节数据,然后存储到文件中;
        void write(String str, int off, int len):把字符串中的一部分数据,按照指定的编码转成字节数据,然后存储到文件中;
3.2 InputStreamReader类
    输入流,可以按照指定的字符集编码,把字节数据转换成字符数据;

    构造方法:
        1.InputStreamReader(InputStream in):按照指定的字节输入流和默认的字符集编码,创建转换流对象;
        2.InputStreamReader(InputStream in, String charsetName):按照指定的字节输入流和指定的字符集编码,创建转换流对象;

    成员方法:
        1. int read():读取一个字符,返回这个字符对应的ASCII数字;
        2. int read(char[] cbuf) :读取多个字符,将字符读入到数组中,返回的是读到的字符的个数;

解决中文乱码的方法:
    保证读写数据使用的字符集编码一样;

4.序列化和返回序列化

4.1序列化

把Java对象对应的二进制数据(字节数据)存储到文件中;  Java->二进制->存到文件中;

ObjectOutputStream类:
    序列化用到这个类;

    构造方法:
        ObjectOutputStream(OutputStream out):根据字节数出流对象创建序列化流的对象;
    成员方法:
        void writeObject(Object  obj):序列化,把Java数据转换成二进制数据写入文件中;

示例代码:

    private static void method01() throws IOException {
    // 1. ObjectOutputStream (OutputStream out):根据指定的字节输出流对象创建序列化流的对象;
        FileOutputStream fos = new FileOutputStream("E:\\obj.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        // 把字符串对象序列化到文件中
            oos.writeObject("中国");
            oos.close();
    }

4.2 反序列化

把文件中对象的二进制数据 转成Java对象;
读文件中二进制数据->Java对象;

ObjectOutputStream类:类:

    构造方法:
        ObjectInputStream(InputStream in):根据输入流创建反序列化流的对象;

    成员方法:
        Object readObject():反序列化,把文件中的二进制数据转换成Java数据;

示例代码:

public class ObjectInputStreamDemo {

    public static void main(String[] args) throws Exception {

        FileInputStream fis = new FileInputStream("E:\\obj.txt");

        // 1.创建 反序列化流的对象
        ObjectInputStream ois = new ObjectInputStream(fis);

        // 2.调用反序列化的方法
        Object obj = ois.readObject();

        System.out.println(obj);

        // 3.关闭流
        ois.close();
        }
}

4.3瞬态关键字transient

是用来修饰变量的,被他修饰的变量不能被序列化到文件中;

5.打印流

可以把数据打印在控制台或者指定的文件中;

有两类:

1.字节打印流 PrintStream类:可以打印任何类型的数据;

2.字符打印流 PrintWriter类:只能打印文本类型的数据;

6. Commons-IO框架

框架:

别人写Java代码变成class文件,然后把class文件压缩到一个jar文件中。

commons-IO 框架是 apache 组织开发;
commons-IO 框架中有一个类FileUtils非常好用,因为里面封装了想文件中写数据,从文件中读数据,拷贝文件,拷贝目录功能方法;
我们开发时,只需要调用这个类相应的方法就可以了,不要自己手工的写那些具体的代码,可以简化工作量,提高工作效率;

在项目中引用第三方框架:
    1.在自己工程的根目录下创建一个lib文件夹;
    2.把第三方框架的jar包拷贝lib目录下,并jar包添加到 build path 下,右键点击lib下的jar文件->Build Path->add to build;
    3.在自己的程序中使用jar中的类;

示例代码:

public class CommonsIoDemo {

    public static void main(String[] args) throws IOException {

        // File srcFile = new File("E:\\1.jpg");
        // File destFile = new File("E:\\2.jpg");
        // 1.copyFile方法:复制文件
        // srcFile源文件;
        // destFile目标文件;
        // FileUtils.copyFile(srcFile, destFile);


        // 2. copyDirectory:拷贝目录
        // 源目录
        File srcDir = new File("E:\\projects");
        // 目标目录
        File destDir = new File("E:\\test");
        FileUtils.copyDirectory(srcDir, destDir);

        // 3.FileUtils.writeStringToFile(file, data):把date写到file中;
        // 4.FileUtils.readFileToString(file):从file中读取数据;
    }

}

7.Properties 属性集合

Property 属性Properties复数

属性包含属性名和属性值,就是key 和 value;

作用:

1.可以存储多个键值对,与map集合类似;
2.可以把键值对存储到文件中;
3.可以把文件中的键值对兑取到Properties对象中;

构造方法:

Properyies():创建一个控的属性列表。

成员方法:

String getProperty(String key):根据key从Properties对象中得到value;
String getProperty(String key,String defaultValue):根据key从Properties对象中的到value,如果没有得到就返回默认值;
void load(InputStream inStream):从文件中加载键值对,把键值对存储到Properties对象中;
void store(OutputStream out, String comments):通过输出流把Properties对象中键值对写到文件中,comments是注释文件,也会写到文件中;
Object setProperty(String key, String value): 向Properties对象中添加一个键值对,与map的put方法作用一样;

示例:

public class PropertiesDemo {
public static void main(String[] args) throws IOException {
// 创建一个空的属性列表;
    Properties pros = new Properties();
    System.out.println(pros);
// 1.Object setProperty(String key, String value): 向Properties对象中添加一个键值对,与map的put方法作用一样
    pros.setProperty("小样吧", "咋滴");
    pros.setProperty("不服是不", "是啊,咋滴");
    pros.setProperty("打你信不", "不信啊,有本事你试试");
    pros.setProperty("诶呦喂,这牛逼啊", "就这么牛逼,咋滴");
    System.out.println(pros);
// 2. String getProperty(String key):根据key从Properties对象中得到value;
    String s1 = pros.getProperty("小样吧");
    System.out.println(s1);
// 3. void store(OutputStream out, String comments):通过输出流把Properties对象中键值对写到文件中,comments是注释文件,也会写到文件中;
    Properties pors2=new Properties();
    pors2.setProperty("made", "gan");
    FileOutputStream fos=new FileOutputStream("E:\\41\\copy.txt");
    pors2.store(fos, "comments");
    fos.close();
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值