JavaI/O(二)

目录

一. 转换流:字节流--->字符流

二. 字符编码

1. GBK、GB2312

2. UNICODE

3. ISO-8859-1

4. UTF编码(UTF-8)

三. 内存流

四. 打印流

五. 两种输入流

1. BufferedReader

2. Scanner

六. 序列化与反序列化

1. 定义

2. 实现

3. 序列化与反序列化操作


 

 

一. 转换流:字节流--->字符流


转换流用于将底层的字节流转换为字符流供子类使用。

OutputStreamWriter:字节输出流--->字符输出流

InputStreamReader:字节输入流--->字节输出流

例:文件拷贝

import java.io.*;

public class Test {
    public static void main(String[] args) throws IOException {
        String sourceFilePath = "C:"+File.separator+"Users"+File.separator
                +"Administrator"+File.separator+"Desktop"+File.separator+
                "Test.txt";
        String destFilePath = "C:"+File.separator+"Users"+File.separator
                +"Administrator"+File.separator+"Desktop"+File.separator+
                "Copy.txt";
        copyFile(sourceFilePath,destFilePath);
    }

    /**
     * 文件拷贝
     * @param sourceFilePath  源文件绝对路径
     * @param destFilePath  目标文件绝对路径
     * @return
     * @throws IOException
     */
    public static boolean copyFile(String sourceFilePath, String destFilePath) throws IOException {
        //1.取得文件对象
        File file = new File(sourceFilePath);
        //取得输入输出流
        InputStream in = new FileInputStream(sourceFilePath);
        OutputStream out = new FileOutputStream(destFilePath);
        //3.数据的输入输出
        long start = System.currentTimeMillis();
        byte[] data = new byte[1024];
        int len = 0;
        //设置一个缓冲区
        while ((len = in.read(data)) != -1){
            out.write(data,0,len);
        }
        long end = System.currentTimeMillis();
        System.out.println("文件拷贝结束,共耗时"+(end-start)+"毫秒");
        return true;
    }
}

 

二. 字符编码


1. GBK、GB2312

GBK和GB2312都是国标编码。

GBK既包含简体中文也包含繁体中文,而GB2312只包含简体中文。

 

2. UNICODE

UNICODE是Java提供的十六进制编码,可以描述世界上任意文字。

但由于采用十六进制编码,导致编码的体积太大,造成网络传输负担。

 

3. ISO-8859-1

浏览器默认编码,国际通用编码,不支持中文。

 

4. UTF编码(UTF-8)

相当于结合了ISO-8859-1和UNICODE编码,支持所有语言且体积较小。

 

三. 内存流


定义:除了文件之外,I/O操作也可以发生在内存中,发生在内存中的操作流称为内存流。

内存流分为两类:

  1. 字节内存流:ByteArrayInputStream、ByteArrayOutputStream
  2. 字符内存流:CharArrayReader、CharArrayWriter

字节内存流的构造方法:

例:内存流实现字母转换

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

public class Test {
    public static void main(String[] args) {
        String str = "world";
        //取得内存流
        ByteArrayInputStream inputStream = new ByteArrayInputStream(str.getBytes());
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        int len = 0;
        while((len = inputStream.read()) != -1){
            outputStream.write(Character.toUpperCase(len));
        }
        //直接将内存输出流输出
        System.out.println(outputStream);
    }
}

 

四. 打印流


系统提供的两大打印流:

  1. 字节打印流:PrintStream
  2. 字符打印流:PrintWriter

补充:

打印流应用的是装饰设计模式(基于抽象类的设计模式):核心依然是某个类的功能,但是为了得到更好的操作效果,让其支持的功能更多。

装饰设计模式的优缺点:

  • 优点:扩展功能特别方便,需要不同的功能时,只需要更换装饰类即可。
  • 缺点:类结构复杂。

 

五. 两种输入流


1. BufferedReader

读取一行输入:

 

2. Scanner

判断是否有指定类型数据输入:public boolean hasNextXXX()

 

取得指定数据类型:public 数据类型 nextXXX()

 

自定义分隔符:public Scanner useDelimiter(Pattern pattern)

建议:在写程序的过程中,要进行数据的输入输出的时候,记住,输出就用打印流,输入就用Scanner

 

六. 序列化与反序列化


1. 定义

将内存中的对象变为二进制流的形式进行传输或保存在文本中。

 

2. 实现

Java中类若是被序列化输出,该类必须实现Serializable接口。

该接口是一个标识接口,表示该类具有序列化的功能。

 

3. 序列化与反序列化操作

要想实现序列化与反序列化的对象操作,需要使用io包提供的两个类:ObjectOutputStream、ObjectInputStream

3.1 对象序列化输出---ObjectOutputStream

将对象序列化输出方法:

例: 对象序列化输出

import java.io.*;

class Person implements Serializable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class Test {
    public static void main(String[] args) throws IOException {
        //1.取得File对象
        File file = new File("C:"+File.separator+"Users"+File.separator +
                "Administrator"+File.separator+"Desktop"+File.separator +
                "Test.txt");
        //2.取得相应的输出流
        Person person = new Person("张三",20);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
        //3.数据输出
        objectOutputStream.writeObject(person);
        //4.关闭流
        objectOutputStream.close();
    }
}

3.2 对象反序列化输入---ObjectInputStream

将对象反序列化输入方法:

例:将对象反序列化输入

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //1.取得File对象
        File file = new File("C:"+File.separator+"Users"+File.separator +
                "Administrator"+File.separator+"Desktop"+File.separator +
                "Test.txt");
        //2.取得输入流
        ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(file));
        //3.取得数据
        Object res = inputStream.readObject();
        System.out.println(res);
        //4.关闭流
        inputStream.close();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值