打印流
PrintStream/PrintWriter(打印流)
- 作用:打印流可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去。
PrintStream提供的打印数据的方案
构造器 | 说明 |
---|
public PrintStream(OutputStream/File/String) | 打印流直接通向字节输出流/文件/文件路径 |
public PrintStream(String fileName,Charset charset) | 可以指定写出去的字符编码 |
public PrintStream(OutputStream out,boolean autoFlush) | 可以指定实现自带刷新 |
public PrintStream(OutputStream out,boolean autoFlush,String encoding) | 可以指定实现自带刷新,并可指定字符的编码 |
方法 | 说明 |
---|
public void println(Xxx xx) | 打印任意类型的数据出去 |
public void write(int/byte[ ]/byte[ ]一部分) | 可以支持写字节数据出去 |
import java.io.PrintStream;
public class Test {
public static void main(String[] args){
try (
//创建一个打印流管道
PrintStream ps = new PrintStream("src\\com\\123.txt");
){
ps.println(97);
ps.println('a');
ps.println("我爱中国");
ps.println(true);
ps.println(99.5);
ps.write(97);
} catch (Exception e) {
e.printStackTrace();
}
}
}
PrintWriter提供的打印数据的方案
构造器 | 说明 |
---|
public PrintWriter(OutputStream/File/String) | 打印流直接通向字节输出流/文件/文件路径 |
public PrintWriter(String fileName,Charset charset) | 可以指定写出去的字符编码 |
public PrintWriter(OutputStream out,boolean autoFlush) | 可以指定实现自带刷新 |
public PrintWriter(OutputStream out,boolean autoFlush,String encoding) | 可以指定实现自带刷新,并可指定字符的编码 |
方法· | 说明 |
---|
public void println(Xxx xx) | 打印任意类型的数据出去 |
public void write(int/String/char[ ]/...) | 可以支持字符数据出去 |
PrintStream和PrintWriter的区别
- 打印数据的功能上是一模一样的:都是使用方便,性能高效(核心优势)
- PrintStream继承自字节输出流OutputStream,因此支持写字节数据的方法
- PrintWriter继承自字符输出流Writer,因此支持写字符数据出去
打印流的一种应用:输出语句的重定向
import java.io.PrintStream;
public class Test {
public static void main(String[] args){
System.out.println("老骥伏枥");
System.out.println("志在千里");
try (
PrintStream ps = new PrintStream("src\\com\\123.txt");
){
// 把系统默认的打印流对象改成自己盒子的打印流
System.setOut(ps);
System.out.println("烈士暮年");
System.out.println("壮心不已");
} catch (Exception e) {
e.printStackTrace();
}
}
}
数据流
DataOutputStream(数据输出流)
构造器 | 说明 |
---|
public DataOutputStream(OutputStream out) | 创建新数据输出流包装基础的自己输出流 |
方法 | 说明 |
---|
public final void writeByte(int v)throw IOException | 将byte类型的数据写入基础的自己输出流 |
public final void writeInt(int v)throw IOException | 将int类型的数据写入基础的自己输出流 |
public final void writeDouble(Double v)throw IOException | 将double类型的数据写入基础的自己输出流 |
public final void writeUTF(String str)throw IOException | 将字符串数据以UTF-8编码成字节类型的数据写入基础的自己输出流 |
public void write(int v/byte[ ]一部分) | 支持写字节数据出去 |
DataInputStream(数据输入流)
构造器 | 说明 |
---|
public DataInputStream(InputStream is) | 创建新数据输入流包装基础的字节输入流 |
方法 | 说明 |
---|
public final byte readByte()throw IOException | 读取字节数据返回 |
public final int readInt()throw IOException | 读取int类型的数据返回 |
public final double readDouble()throw IOException | 读取double类型的数据返回 |
public final String readUTF()throw IOException | 读取字符串数据(UTF-8)返回 |
public int readInt/read(byte[ ]) | 支持读字节数据进来 |
序列化流
ObjectOutputStream(对象字节输出流)
- 可以把Java对象进行序列化:把Java对象存入到文件中去
构造器 | 说明 |
---|
public ObjectOutputStream(OutputStream out) | 创建对象字节输出流,包装基础的字节输出流 |
方法 | 说明 |
---|
public final void writeObject(object o)throw IOException | 把对象写出去 |
注意:对象如果要参与序列化,必须实现序列化接口(java.io.Serializable)
User类
// 注意:对象如果需要序列化,必须实现序列化接口
public class User implements Serializable {
private String loginName;
private String userName;
private int age;
private String passWord;
public User() {
}
public User(String loginName, String userName, int age, String passWord) {
this.loginName = loginName;
this.userName = userName;
this.age = age;
this.passWord = passWord;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
@Override
public String toString() {
return "User{" +
"loginName='" + loginName + '\'' +
", userName='" + userName + '\'' +
", age=" + age +
", passWord='" + passWord + '\'' +
'}';
}
}
Test类
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class Test {
public static void main(String[] args){
try (
// 创建一个对象字节输出流包装原始的字节输出流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("src\\com\\abc.txt"));
){
// 创建一个Java对象
User u = new User("admin","张三",22,"88888888");
// 序列化对象到文件中去
oos.writeObject(u);
System.out.println("序列化成功");;
} catch (Exception e) {
e.printStackTrace();
}
}
}
ObjectInputStream(对象字节输入流)
- 可以把Java对象仅反序列化:把存储在文件中的Java对象读入到内存中来
构造器 | 说明 |
---|
public ObjectInputStream(InputStris) | 创建对象字节输入流,包装基础的字节输入流 |
方法 | 说明 |
---|
public final Object readObject() | 把存储在文件中的Java对象读出来 |
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class Test {
public static void main(String[] args){
try (
// 创建一个对象字节输入流管道,包装低级的字节输入流与源文件连通
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("src\\com\\abc.txt"))
){
User u = (User) ois.readObject();
System.out.println(u);
} catch (Exception e) {
e.printStackTrace();
}
}
}
如果要一次序列化多个对象,要怎么办?
用一个ArrayList集合存储多个对象,而后直接对集合进行序列化即可
注意:ArrayList集合以及实现了序列化接口
补充知识:IO框架
什么是框架
- 解决某类问题,编写的一套类、接口等,可以理解成一个半成品,大多框架都是第三方研发的
- 好处:在框架的基础上开发,可以得到优秀的软件架构,并提高开发效率
- 框架的形式:一般是把类、接口等编译成class形式,再压缩成一个.jar结尾的文件发行出去
什么是IO框架
- 封装了Java提高的对文件、数据进行操作的代码,对外提高了更简单的方式来对文件进行操作,对数据进行读写等
Commons-io
- Commons-io是apache开源基金组织提供的一组由关IO操作的小框架,目的是提高IO流的开发效率。
FileUtils类提供的部分方法展示 | 说明 |
---|
public static void copyFile(File srcFile,File destFile) | 复制文件 |
public static void copyDirectory(File srcFile,File destDir) | 复制文件夹 |
public static void deleteDirectory(File directory) | 删除文件夹 |
public static String readFileToString(File file,String encoding) | 读数据 |
public static void writeStringToFile(File file,String data,String charname,boolean append) | 写数据 |
IOUtils类提供的部分方法展示 | 说明 |
---|
public static int copy(InputStram inputStream,OutputStream outputStream) | 复制文件 |
public static int copy(Reader reader,Writer writer) | 复制文件 |
public static void write(String data,OutputStream output,String charsetName) | 写数据 |
步骤:导入commons-io-2.15.1.jar框架到项目中去
- 在项目中创建一个文件夹:lib
- 将commons-io-2.15.1.jar文件复制到lib文件夹
- 在jar文件上点右键,选择Add as Library -> 点击OK
- 在类中导包使用