目录
一. 转换流:字节流--->字符流
转换流用于将底层的字节流转换为字符流供子类使用。
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操作也可以发生在内存中,发生在内存中的操作流称为内存流。
内存流分为两类:
- 字节内存流:ByteArrayInputStream、ByteArrayOutputStream
- 字符内存流: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);
}
}
四. 打印流
系统提供的两大打印流:
- 字节打印流:PrintStream
- 字符打印流: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();
}
}