IO流

用来处理设备之间的数据传输,java对数据的操作是通过流的方式,java用于操作流的对象都在IO包中

按操作数据分为:字节流和字符流;按流向分为:输入流和输出流

程序从输入流中读取数据,向输出流中写入数据

字节流的抽象基类:Inputstream  和 OutputStream;字符流的抽象基类:Reader 和 Writer

其他流均是继承这4个抽象类而来的。

转换流

转换流也是一种包装流,其中OutputStreamWriter是Writer的子类,可以将一个字节流输出流包装成字符输出流,方便直接写入字符,而InputStreamReader是Reader的子类,它可以将一个字节输入流包装成字符输入流,方便直接读取字符。

InputStreamReader读取转换流--------字节流通向字符流的桥梁

步骤 :

1.获取键盘录入对象

Inputstream in=System.in

2.将字节流对象转换成字符流对象,使用转换流InputStreamReader

InputStreamReader isr=new InputStreamReader(in);

3.提高效率使用字符流缓冲区 BufferedReader进行读取

BufferedReader bf=new BufferedReader(isr);

String line=null;
    while((line=bf.readLine())!=null) {
        if("over".equals(line))
        break;
        sop(line);
    }
    bufr.close;

OutputStreamReader写入转换流----------字符流通向字节流的桥梁
步骤 :

1.获取输出对象

Outputstream out=System.out

2.将字符流对象转换成字节流对象,使用转换流OutputstreamWriter

OutputstreamWriter osw=new OutputstreamWriter(out);

3.提高效率使用字符流缓冲区 BufferedWriter进行写入

BufferedWriter bw=new BufferedWriter(osw);

String line=null;
    while((line=bf.readLine())!=null) {
       if("over".equals(line))
        break;
        bw.write(line);
        bufw.newLine();
    }
    bufr.close;

常用流

字节流
    InputStream
    int read()
    int read(byte[])
    int read(byte[], int, int)
        FileInputStream
        AudioInputStream
        ByteArrayInputStream
        ObjectInputStream
        PipedInputStream
    int available()
    void close()
    OutputStream
    write(int)
    write(byte[])
    write(byte[], int, int)
        FileOutputStream
        ByteArrayOutputStream
        ObjectOutputStream
        PipedOutputStream
    flush()
    close()
字符流
    Reader
    FileReader节点流
    BufferedReader过滤流(处理流)
    InputStreamReader转换流
    Writer
    FileWriter节点流
    BufferedWriter过滤流(处理流)
    OutputStreamWriter转换流

读取键盘录入
System.out:对应的是标准输出设备,控制台
System.in:对应的标准输入设备,键盘
    InputStream in=System.in;
    int by=in.read();
    sop(by);
    in.close();  //结束录入

流操作规律

基本规律

1.明确源和目的

源:输入流。InputStream字节流  Reader 字符流

目的:输出流 OutPutStream 字节流  Writer 字符流

2.操作的数据是否是纯文本

是就是字符流,如果设备是键盘 就将字节流转换为字符流

不是就是字节流

3.当体系明确后,在明确要是用那个具体的对象

通过设备来区分:

源设备  内存 硬盘 键盘

目的设备  内存  硬盘  控制台

4.是否需要提高效率

是 BufferedReader  BufferedInputStream

否 BuffreredWriter BufferedOutputStream

案例分析

1.将一个文本文件中的数据存储到另一个文件中,复制文件

源:InputStream字节流  Reader 字符流
       是否是纯文本 是  Reader
       设备: 文件   操作文件的对象 就是FileReader
       是否需要高效 
       是  BufferedReader
       FileReader fr=new FileReader("a.txt");
       BufferedReader bufr=new BufferedReader(fr);
 
目的:OutPutStream 字节流  Writer 字符流
          是否是纯文本 :是 Writer 
          设备: 文件 写入文件的对象 就是 FileWriter 
          是否需要高效  是   BufferedWriter
          FileWriter fw=new FileWriter("b.txt");
          BufferedWriter bufw=new BufferedWriter(fw);

2.将一个图片文件数据存储到另一个文件中,复制文件。
源:是否是纯文本 : 不是  InputStream
     设备 文件 就是 FileInputStream
     是否高效 是
     BufferedInputStream
     FileInputStream isr=new FileInputStream("a.jpg");
     BufferedInputStream bufis=new BufferedInputStream(isr);
目的:是否纯文本 :不是 OutPutStream
     设备:文件 FileOutPutStream
     是否高效 是
     BufferedOutputStream
     FileOutPutStream osw=new FileOutPutStream("b.jpg");
     BufferedOutputStream bufos=new BufferedOutputStream(osw);

3.需求将键盘录入的数据保存到一个文件中 。

源:键盘  字节流

是否纯文本  Reader

设备 :键盘  ,对应的对象时 System.in 对应的是字节流 ,为了操作方便 转成字符流

既然明确了Reader 就将System.in 转换成字符流 InputStreamReader

InputStreamReader isr=new InputStreamReader(System.in);

需要高效吗 ?

BufferedReader bufr=new BufferedReader(isr);

目的: 文件

是否纯文本 是  Writer
    设备:文件 FileWriter

需要高效吗?

是 BufferedWriter

4.扩展 :想要把录入的数据按照指定的编码表(utf-8)将数据存到文件中

目的:OutPutStream 字节流  Writer 字符流

是否是存文本:是  Writer

设备 :文件 fileWriter

默认编码表是 gbk

编码标只有转换流可以指定。所以要使用的对象是写入转换流 OutputStreamWriter

转换流需要接受一个自己输出流,操作字节输出流的是FileOutputStream

OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("b.txt"),"utf-8");

BufferedWriter bufw=new BufferedWriter (osw);

通常涉及到字符编码转换的时候,就需要用到转换流。

字符编码

字符码表

字符码表是一种可以方便计算机识别的特定字符集,它是将每一个字符和一个唯一的数字对应而形成的一张表。ASCII、ISO8859-1、GB2312、GBK、Unicode、UTF-8

字符编码和解码

把字符串转换成计算机识别的字节序列称为编码

把字节序列转换为普通人能看懂的明文字符串称为解码

字符传输

通过构造方法InputStreamReader(InputStream in,String charsetName)和OutputStreamReader(OutputStream in,String charsetName)创建流对象时,可以对需要读写的数据指定编码格式

两种设计模式

适配器模式

将字节流适配成可以用字符的方式操作的字符流

适配:把不兼容的(接口)变成兼容的(接口)

InputStreamReader
OutuptStreamWriter

装潢模式

处理流(过滤流)基本上都是用了装潢模式

BufferedReader / BufferedWriter
PrintStream / PrintWriter
DataInputStream / DataOutputStream

Java精选笔记_IO流(转换流、常用流、流操作规律、字符编码)的更多相关文章

  1. Java精选笔记_IO流【File(文件)类、遍历目录下的文件、删除文件及目录】

    File(文件)类 File类用于封装一个路径,该路径可以是从系统盘符开始的绝对路径,也可以是相对于当前目录而言的相对路径 File类内部封装的路径可以指向一个文件,也可以指向一个目录,在使用File ...

  2. Java精选笔记_IO流(字符输入输出流、字符文件输入输出流、字符流的缓冲区)

    字符流 Reader是字符输入流的基类,用于从某个源设备读取字符 Writer是字符输出流,用于向某个目标设备写入字符 字符流操作文件 字符输入流FileReader,通过此流可以从关联的文件中读取一 ...

  3. Java精选笔记_IO流(字节流、InputStream、OutputStream、字节文件、缓冲区输入输出流)

    字节流 操作图片数据就要用到字节流. 字符流使用的是字符数组char[],字节流使用的是字节数组byte[]. 字节流读写文件 针对文件的读写,JDK专门提供了两个类,分别是FileInputStre ...

  4. JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码

    JAVA之旅(三十)--打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 三十篇了,又是一个 ...

  5. Java学习笔记39(转换流)

    转换流:字符流和字节流之间的桥梁 用于处理程序的编码问题 OutputStreamWriter类:字符转字节流 写文本文件: package demo; import java.io.FileOutp ...

  6. Java IO流体系中常用的流分类

    Java输入/输出流体系中常用的流分类(表内容来自java疯狂讲义) 注:下表中带下划线的是抽象类,不能创建对象.粗体部分是节点流,其他就是常用的处理流. 流分类 使用分类 字节输入流 字节输出流 字 ...

  7. Java精选笔记_JSP技术

    JSP技术 JSP概述 什么是JSP 在JSP全名是Java Server Page,它是建立在Servlet规范之上的动态网页开发技术. 在JSP文件中,HTML代码与Java代码共同存在,其中,H ...

  8. Java精选笔记_文件上传与下载

    文件上传与下载 如何实现文件上传 在Web应用中,由于大多数文件的上传都是通过表单的形式提交给服务器的,因此,要想在程序中实现文件上传的功能,首先得创建一个用于提交上传文件的表单页面. 为了使Serv ...

  9. Java精选笔记_JSTL(JSP标准标签库)

    JSTL(JSP标准标签库) JSTL入门 JavaServer Pages Standard Tag Library:JSP标准标签库 在JSP中可以通过Java代码来获取信息,但是过多的Java代 ...

随机推荐

  1. Freemarker-2.3.22 Demo - No03_使用map绑定多个参数

    package No03_使用map绑定多个参数; import java.io.File; import java.io.FileOutputStream; import java.io.Outpu ...

  2. vue的面包屑导航组件

    用来将其放到navbar中: Breadcrumb/index.vue <template> <el-breadcrumb class="app-breadcrumb&qu ...

  3. SQL server 2005如何设置一个或几个字段唯一约束?

    --建立是在三个字段上的唯一约束 alter table Tab add constraint uq_id unique(shipType, shipsession, Territory)

  4. C语言 · 龟兔赛跑预测

    基础练习 龟兔赛跑预测   时间限制:1.0s   内存限制:512.0MB        锦囊1 模拟.   问题描述 话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共 ...

  5. SpringBoot配置成Liunx服务

    spring boot 可以打包成可执行的脚本来启动,其原理是在打成包时,将shell脚本注入到jar包中 #参考:https://docs.spring.io/spring-boot/docs/1. ...

  6. WHAT EXACTLY IS WASM ?!

    终于, 我入门了当初很仇视的技术.... 什么是WebAssembly? WebAssembly或WASM是一个编译器目标(由编译器生成的代码),具有二进制格式,允许我们在浏览器上执行C,C ++和R ...

  7. 二叉树的java实现

    一.分析 一个二叉树节点有三个部分,一个是指向左子树的部分,一个是指向右子树的部分,另外一个是数据部分.可以把这个节点抽象成一个节点对象,给对象有两个节点对象属性和一个数据属性.如下图: 一个二叉树有 ...

  8. 创建ajax对象并兼容多个浏览器方法简单记录

    这篇文章主要介绍了如何创建ajax对象并兼容多个浏览器,需要的朋友可以参考下<script> function createAjax(){ var request=false; //win ...

  9. 【转】java基本数据类型vs封装数据类型

    1.基本概念 说java是面向对象的语言是正确的,但是她不纯,基本数据类型就不是对象. 基本数据类型可以大致分为三类:数据型:int.short.long.byte.float.double字符型:c ...

  10. View与Model绑定注意事项 (视图无数据显示)

    Qt 中视图与模型绑定时,模型必须使用new来创建.否则刚开始初始化的时候,视图无数据显示,或者后期视图不能随着模型的改变而改变. 具体原因:我猜测是局部变量生命周期的问题.new 的变量在堆中,除非 ...