1.字节流和字符流

在IO有两种数据传输格式一个是字符流还一个是字节流,但是字符流就会涉及到编码的问题。

  1. 一开始美国使用的自己的编码表就是ASCII表
  2. 中国的字符需要被识别也需要编码表于是就有了GB2312
  3. 但是由于中国的子很多,还有少数名族等等后来又进行了优化扩容就出现了GBK
  4. 最后国际标准组织制定了一个包含所有国家所有地区的码表就是Unicode
  5. 之后对Unicode进行了优化也就是以前是所有的字符都是两个字节表示,但是现在就可以一个字节或者三个字节,具体看情况的UTF_8

    字符流一般都包含了编码表,也就是在传输的时候你可以指定编码方式然后IO流帮你转换

2.在IO流里面就是有四个抽象的顶层接口

  • 字节流的:

    InputStream OutputStream
  • 字符流:

    Reader Writer

3.装饰设计模式:

也就是基于原理已经有的对象,在此对象的基础上提供更强大的功能,也就是能达到不修源码的情况下扩展原来的类的功能

用于增强的的类称为装饰类,这个类一般都是用构造函数来接受需要被装饰的类的对象就例如BufferedRead()内部就调用了 FileReader的read方法

一说到功能扩展自然就会想到继承,这里就要说一下有时候为什么还需要装饰模式。

假如说有以下类层次结构:

---ReadText
---ReadMedia
---ReadData
那么我们要用缓冲区读的话我们就会有以下的类层次结构:
    ---ReadText
|--BufferedReadText
---ReadMedia
|--BufferedReadMedia
---ReadData
|--BufferedReadData
类层级就非常臃肿
所以我们想到就用装饰者模式:
假如有以下装饰类:
   class BufferedReader{
BufferedReader(ReadText readText){ }
BufferedReader(ReadMedia readMedia){ }
BufferedReader(ReadData readData){ }
}

这样虽然可以,但是我们要拓展Read的子类这个装饰类必须要修改,拓展性很差

所以我们直接就用多态性质

   class BufferedReader extends Read{
private Read read;
BufferedReader(Read read){ } public int read(char cbuf[], int off, int len){
return read.read( cbuf[], off, len);//这里我们必须要复写Read里面的抽象方法,但是我们不知道这个read怎么实现,所以我们直接调用传进来的子类的对象的read方法 } public boolean close(){
return read.close(); //同上
}
}

这样一来类层级结构就是:

  ---Read
|---ReadText
|---ReadMedia
|---ReadData
|---BufferedRead

注意装饰类是Read的子类,并且他和被装饰类是同一个层次,因为他是更强的被装饰类,所以他们是同一个层级

4.字节流的处理

    InputStream
|--FileInputStream
OutputStream
|--FileOutputStream

这两个类的处理方式和上面的字符流完全一样,唯一一点的不同就是,它里面读取的时候还有一个avaliable方法可以确定文件中字节大小,还有就是他是以字节为单位的

public class FileInputStreamDemo {
public static void main(String[] args) throws IOException{
FileInputStream fileInputStream=new FileInputStream("a.txt");
read_3(fileInputStream);
} public static void read_1(FileInputStream fileInputStream)throws IOException{
byte by;
while ((by= (byte) fileInputStream.read())!=-1){
System.out.print((char) by);
}
} public static void read_2(FileInputStream fileInputStream)throws IOException{
byte[] buffer=new byte[1024];
char[] buf=new char[1024];
int num=0;
StringBuilder builder=new StringBuilder();
while ((num=fileInputStream.read(buffer))!=-1){
// TODO: 2017/7/16 转数组为字符串的问题 尤其是基本类型转字符串的问题 是不是还有什么好的对象去做这件事
for (byte b:buffer){
builder.append((char) b);
}
}
System.out.println(builder);
} public static void read_3(FileInputStream fileInputStream) throws IOException{
byte[] by=new byte[fileInputStream.available()]; //这个函数就可以确定字节个数 不过只能用于较小的文件 大文件开辟太大的缓冲区会出问题
fileInputStream.read(by);
StringBuilder stringBuilder=new StringBuilder();
for (byte bys:by){
// TODO: 2017/7/16 转数组为字符串的问题 尤其是基本类型转字符串的问题 是不是还有什么好的对象去做这件事
stringBuilder.append((char)bys);
}
System.out.println(stringBuilder); }
}

5.当然也是有BufferedInputStream和BufferedOutputStream这两个装饰类 注意这个和前面的一模一样

6.流对象的使用,流对象的使用它们的类别太多,这里为了区分使用哪一个流对象我们就具体分析一下:

  1. 明确源和目的:

    源的话我们就是用InputStream和Reader

    目的则是OutputStream和Writer
  2. 之后就是确定是否为纯文本:

    是:字符流

    否:字节流
  3. 确定具体的对象:

    通过设备来区分:硬盘,控制台,内存等等 分别使用合适的子类

    然后根据是否需要更强的功能,更快的速度使用Buffered包装类

JavaIO的更多相关文章

  1. JavaIO学习笔记(五)

    JavaIO前期准备 什么是同步 指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪 什么是异步 异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO ...

  2. javaIO系统----再看装饰者模式

    javaIO系统拥有各种各样的类,尤其是每次要进行读写操作时,总会一层套一层的new,以前不明白为什么要这样做,不过学习了适配器模式后,对于这种做法立刻了解了:动态扩展IO的功能,使之符合使用者的习惯 ...

  3. Java学习日记之 Java-IO流

    Java中的IO流在处理上分为字节流和字符流.字节流和字符流的区别 : 1.字节流读取的时候,读到一个字节就返回一个字节:  字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8 ...

  4. javaIO框架小析

    IO即数据读写.数据是应用的中心要素,而数据读写的能力和可扩展性是编程平台的基础支撑. 概念框架 方式: 字节流 Byte 和 字符流 Char 方向: 输入 Input 和 输出 Output : ...

  5. javaIO流实现读写txt文件

    javaIO流实现文件读写 文件写入: InputStreamReader BufferedReader 文件读取: FileOutputStream package javatest.basic22 ...

  6. javaIO操作之字节输出流--OutputStream

    OutputStream /** * <li>输出单个字节:public abstract void write(int b) throws IOException ; * <li& ...

  7. [零] JavaIO入门简介 程序设计语言 为什么需要IO库

     本文旨在引申出来Java IO的概念含义,作为学习JavaIO一个起步的了解知识点 部分内容引自<计算机操作系统第三版>  操作系统的文件管理   "在现代计算机系统中,要用到 ...

  8. [三]JavaIO之IO体系类整体设计思路 流的概念以及四大基础分类

    从本文开始,将正式进入JavaIO的简介 在继续javaIO系列的文章之前 可以过去看一下 本人博客上的设计模式中的 适配器模式和装饰器模式 这会对接下来的阅读大有帮助   本文是从逻辑上介绍整个的J ...

  9. [四] JavaIO之类层次体系结构横向比对

      IO家族类层次体系结构横向匹配   上一篇文章中主要介绍了JavaIO流家族的整体设计思路,简单回顾下 基本逻辑涉及数据源 流的方向,以及流的数据形式这三个部分的组合 按照流的数据形式和流的方向, ...

  10. [七]JavaIO之 PipedInputStream 和 PipedInputStream

    管道简介

随机推荐

  1. 2_Add Two Numbers --LeetCode

    原题如下: 思路:在一个while中遍历两个链表,直到最长的链表为空,或者没有进位.每一步获取两个链表对应的结点的值a,b,然后相加a+b.如果上一步又进位,那就加a+b+1,若由于进位加1后还产生进 ...

  2. Qemu,KVM,Virsh傻傻的分不清

    当你安装了一台Linux,想启动一个KVM虚拟机的时候,你会发现需要安装不同的软件,启动虚拟机的时候,有多种方法: virsh start kvm命令 qemu命令 qemu-kvm命令 qemu-s ...

  3. SystemVerilog语言简介(二)

    6. 用户定义的类型 Verilog不允许用户定义新的数据类型.SystemVerilog通过使用typedef提供了一种方法来定义新的数据类型,这一点与C语言类似.用户定义的类型可以与其它数据类型一 ...

  4. Flex动态获取方法报错

    1.错误描述 2.错误原因 由于Flex文件修改后,需要将其编译成swf文件,刚修改的方法没有编译,再加上历史缓存的原因,导致报错 3.解决办法 将Flex项目重新clean一下,并将MyEclips ...

  5. OpenStack_I版 4.Dashboard部署

    由python的DjangoWeb框架开发的   使用keystone默认的角色来访问各种服务   Dashboard安装       Dashboard是openstack的Web管理界面,需要将它 ...

  6. DELL XPS 13 9350 装Win7系统(坑爹)

    0.记一次悲惨的装机记录 1.为什么这么难装呢? 因为这个NB本身是为Win10设计的,所以官网没有Win7驱动,系统设置各种不兼容 2.希望你能看到本文最后 因为你看到最后,你就不会给这个逗比装Wi ...

  7. 原根求解算法 && NTT算法

    原根求解算法: 获取一个数\(N\)的原根\(root\)的算法 #include<bits/stdc++.h> #define ll long long #define IL inlin ...

  8. 【BZOJ2190】仪仗队(数论)

    [BZOJ2190]仪仗队(数论) 题面 粘链接,题目中有图片 题解 对于题意,可以考虑 如果有\((i,j)\)能够被看见 那么,\((ki,kj)\)就一定不能看见 所以,如果一个点能够被看见,则 ...

  9. Luogu[POI2005]KOS-Dicing

    题面 二分后用网络流判定 S->人,流量为二分的mid 人->比赛,流量为1 比赛->T,流量为1 输出方案只要判断a就可以了 # include <bits/stdc++.h ...

  10. 【xsy2140】计数

    Time Limit: 1000 ms Memory Limit: 256 MB description 吐槽 所以说..组合数的题是不是都是知道大致思路但是就是不会写qwq菜醒qwq 正题 这题其实 ...