JavaSE:Java基础3:IO流
作为开发人员,提到io流,第一反应就是上传和下载,设计模式中的装饰者模式。
首先还是要解释一下流的概念:在java中,不同的输入输出设备之间的数据传输称为流。
io流又分为字节流和字符流。在计算机中,所有的文件(包括但不限于文本、图片、音视频)都是以二进制(字节)形式存在,io流中针对字节的输入输出提供了一系列的流。有时候我们希望在程序中操作字符,所以jdk提供了字符流。
字节流是程序中最常用的流,根据数据的传输方向可将其分为字节输入流和字节输出流。在jdk中,提供了两个抽象类InputStream和OutputStream,它们是字节流的*父类,好比Obeject是所有java类的父类,所有的字节输入流都继承自InputStream,所有的字节输出流都继承自OuputStream。
截图标红部分为常用方法。
读写io流一般建议使用字节流的缓冲区,经过demo验证,使用缓冲区可以有效提高数据的读写效率。
io中的装饰模式:装饰模式(Decorator)的定义:又名包装(Wrapper)模式,装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。装饰模式以对客户端透明的方式动态的给一个对象附加上更多的责任。换言之客户端并不会觉的对象在装饰前和装饰后有什么区别。装饰模式可以在不创造更多的子类的模式下,将对象的功能加以扩展。
public class ZhuangShiDemo {
public static void main(String[] args) {
House middleHouse = new House("90平米房子");
System.out.println("‐‐‐‐‐‐‐‐包装前‐‐‐‐‐‐‐‐");
middleHouse.show();
System.out.println("‐‐‐‐‐‐‐‐包装后‐‐‐‐‐‐‐‐");
DecorateHouse decoratedHouse = new DecorateHouse(middleHouse);
decoratedHouse.show();
}
}
// 定义一个房子类
class House {
private String houseName;
public Car(String houseName) {
this.houseName = houseName;
}
public void live() {
System.out.println("我是" + houseName + ",具有基本的居住功能");
}
}
// 定义一个类DecorateHouse
class DecorateHouse {
public House myHouse;
// 通过构造方法接收被包装的对象
public DecorateHouse(House myHouse) {
this.myHouse = myHouse;
}
// 实现功能的增强
public void show() {
myHouse.live();
System.out.println("具有娱乐休闲功能");
}
}
转换流:IO流根据操作数据类型可分为字节流和字符流,有时候需要在字节流和字符流之间进行转换。在JDK中提供了两个类
可以将字节流转换为字符流,它们分别是OutputStreamWriter和InputStreamReader。OutputStreamWriter是一种包装流,能把字节输出流包装成字符输出流,方便写入字符,而InputStreamReader能把字节流包装成字符流,方便程序直接读取字符。
注意:转换流只能针对操作文本的字节流进行转换,如果字节操作的是一张图片,此时转换为字符流就会造成数据丢失。
转换流自然涉及到字符编码和解码。
相信大家接触最多的就是utf-8和gbk了,简单解释下,都是中文码,前者是国际编码,后者是国产的。
字符的编码与解码
编码:Encode,就是把人类文字按照指定的字符集转换成计算机能识别的字节,这就是编码。
解码:Decode,就是把计算机的字节序列转换成人类能识别的文字就是解码。
编码:可以使用String类的getByte(String charsetName)方法获取当前字符串的指定字符集的编码,返回一个字节数组。
前人踩坑,后人平趟:使用什么字符集进行编码,那么必须使用相同的字符集进行解码!
扩展:标准输入输出流
在System类中定义了三个常量:in、out、err,它们是标准的输入输出流。其中in是InputStream类型,默认从键盘录入
读取数据,out和err是PrintStream类型,默认将数据输出到命令行窗口,err是标准错误输出流,它也是把数据输出到
控制台。
System.in
System.in是一个典型的连接控制台程序和键盘输入的InputStream流。通常当数据通过命令行参数或者配置文件传递给命令行Java程序的时候,System.in并不是很常用。图形界面程序通过界面传递参数给程序,这是一块单独的Java IO输入机制。
System.out
System.out是一个PrintStream流。System.out一般会把你写到其中的数据输出到控制台上。System.out通常仅用在类似命令行工具的控制台程序上。System.out也经常用于打印程序的调试信息(尽管它可能并不是获取程序调试信息的最佳方式)。
System.err
System.err是一个PrintStream流。System.err与System.out的运行方式类似,但它更多的是用于打印错误文本。一些类似Eclipse的程序,为了让错误信息更加显眼,会将错误信息以红色文本的形式通过System.err输出到控制台上。
ps:觉得看的不过瘾,可以看看陆少侠的链接:https://blog.csdn.net/a724888/article/details/80201802。