转换流

1.1                OutputStreamWriter类

OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节。它的作用的就是,将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去。

package com.oracle.reader;

public class Demo04 {

public static void main(String[] args) throws IOException {

FileOutputStream fw=new FileOutputStream("E:\\test\\c.txt",true);

//给字符流添加指定码表的功能

OutputStreamWriter osw=new OutputStreamWriter(fw, "UTF-8");

osw.write("你好吗");

osw.close();

}

其实在OutputStreamWriter流中维护自己的缓冲区,当我们调用OutputStreamWriter对象的write方法时,会拿着字符到指定的码表中进行查询,把查到的字符编码值转成字节数存放到OutputStreamWriter缓冲区中。然后再调用刷新功能,或者关闭流,或者缓冲区存满后会把缓冲区中的字节数据使用字节流写到指定的文件中

1.2                InputStreamReader类

package com.oracle.reader;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.UnsupportedEncodingException;

public class Demo04 {

public static void main(String[] args) throws IOException {

//读取文件的字节流对象

FileInputStream fis=new FileInputStream("E:\\test\\c.txt");

//创建转换流对象

InputStreamReader isr=new InputStreamReader(fis, "UTF-8");

//使用转换流去读字节流中的字节

int len=0;

while ((len=isr.read())!=-1) {

System.out.print((char)len);

}

//释放资源

isr.close();

}

}

运行结果:

注意:在读取指定的编码的文件时,一定要指定编码格式,否则就会发生解码错误,而发生乱码现象。

1.3                转换流和子类区别

发现有如下继承关系:

OutputStreamWriter:

|--FileWriter:

InputStreamReader:

|--FileReader;

父类和子类的功能有什么区别呢?

OutputStreamWriter和InputStreamReader是字符和字节的桥梁:也可以称之为字符转换流。字符转换流原理:字节流+编码表。

FileWriter和FileReader:作为子类,仅作为操作字符文件的便捷类存在。当操作的字符文件,使用的是默认编码表时可以不用父类,而直接用子类就完成操作了,简化了代码。

InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//默认字符集。

InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"GBK");//指定GBK字符集。

FileReader fr = new FileReader("a.txt");

这三句代码的功能是一样的,其中第三句最为便捷。

注意:一旦要指定其他编码时,绝对不能用子类,必须使用字符转换流。什么时候用子类呢?

条件:

1、操作的是文件。2、使用默认编码。

总结:

字节--->字符 : 看不懂的--->看的懂的。  需要读。输入流。 InputStreamReader

字符--->字节 : 看的懂的--->看不懂的。  需要写。输出流。 OutputStreamWriter

缓冲流

缓冲流,根据流的分类分类字节缓冲流与字符缓冲流。

2.1                字节缓冲流

字节缓冲流根据流的方向,共有2个

写入数据到流中,字节缓冲输出流 BufferedOutputStream

读取流中的数据,字节缓冲输入流 BufferedInputStream

2.1.1            字节缓冲输出流BufferedOutputStream

构造方法

public BufferedOutputStream(OutputStream out)创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

package com.oracle.huanchongliu;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

public class Demo01 {

public static void main(String[] args) throws IOException {

method1();

}

//缓冲字节流输出

public static void method1() throws IOException{

FileOutputStream fos=new FileOutputStream("E://test//a.txt");

//续写

//FileOutputStream fos=new FileOutputStream("E://test//a.txt",true);

BufferedOutputStream bos=new BufferedOutputStream(fos);

bos.write(100);

bos.write("你好吗".getBytes());//字符数组

//资源释放

bos.close();

}

}

运行结果:

2.1.2            字节缓冲输入流 BufferedInputStream

构造方法

public BufferedInputStream(InputStream in)

package com.oracle.huanchongliu;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

public class Demo01 {

public static void main(String[] args) throws IOException {

method2();

}

//缓冲字节输入流

public static void method2() throws IOException{

FileInputStream fis=new FileInputStream("E://test//a.txt");

BufferedInputStream bis=new BufferedInputStream(fis);

int line=0;

while ((line=bis.read())!=-1) {

System.out.print((char)line);

}

//释放资源

bis.close();//中文用字符流读

}

}

运行结果:

2.2                字符缓冲流

字符缓冲输入流 BufferedReader

字符缓冲输出流 BufferedWriter

2.2.1            字符缓冲输出流 BufferedWriter

package com.oracle.huanchongliu;

import java.io.BufferedWriter;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

public class zifuhuanchongliu {

public static void main(String[] args) throws IOException {

method1();

}

//缓冲字符输出流

//win 换行 \r\n

//linux 换行 \n

public static void method1() throws IOException{

FileWriter fw=new FileWriter("E://test/b.txt");

BufferedWriter bw=new BufferedWriter(fw);

//字符数组

bw.write("你好吗".toCharArray());

//刷新一下(可有可无,最好刷新)

bw.flush();

//换行

bw.newLine();//可以实现平台无关性

bw.write("我还好");

bw.flush();

bw.newLine();

bw.write(100);

//释放资源

bw.close();

}

}

运行结果:

2.2.2            字符缓冲输入流 BufferedReader

方法

public String readLine() 读取一个文本行,包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null

package com.oracle.huanchongliu;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

public class zifuhuanchongliu {

public static void main(String[] args) throws IOException {

method2();

}

//缓冲字符输入流

public static void method2() throws IOException{

//创建流对象

FileReader fr=new FileReader("E://test//b.txt");

BufferedReader br=new BufferedReader(fr);

String line=null;

int sum=0;//计数器

while ((line=br.readLine())!=null) {

sum++;

System.out.println(sum+"    "+line);

}

//释放资源

br.close();

}

}

运行结果:

2.2.3            使用字符缓冲流完成文本文件的复制

package com.oracle.huanchongliu;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

public class zifuhuanchongliu {

public static void main(String[] args) throws IOException {

method3();

}

//缓冲字符流的复制

public static void method3() throws IOException{

//明确数据源

FileReader fr=new FileReader("E://test//a.txt");

BufferedReader br=new BufferedReader(fr);

//明确数据目的

FileWriter fw=new FileWriter("E://test//e//a.txt");

BufferedWriter bw=new BufferedWriter(fw);

//开始复制

String line=null;

while ((line=br.readLine())!=null) {

bw.write(line);

bw.newLine();

bw.flush();

}

//释放资源

br.close();

bw.close();

}

}

运行结果:

流的操作规律

l  明确一:要操作的数据是数据源还是数据目的。

源:InputStream    Reader

目的:OutputStream Writer

先根据需求明确要读,还是要写。

l  明确二:要操作的数据是字节还是文本呢?

源:

字节:InputStream

文本:Reader

目的:

字节:OutputStream

文本:Writer

已经明确到了具体的体系上。

l  明确三:明确数据所在的具体设备。

源设备:

硬盘:文件  File开头。

内存:数组,字符串。

键盘:System.in;

网络:Socket

目的设备:

硬盘:文件  File开头。

内存:数组,字符串。

屏幕:System.out

网络:Socket

完全可以明确具体要使用哪个流对象。

l  明确四:是否需要额外功能呢?

额外功能:

转换吗?转换流。InputStreamReader OutputStreamWriter

高效吗?缓冲区对象。BufferedXXX

InputStream

FileInputStream

BufferedInputStream

OuputStream

FileOutputStream

BufferedOuputStream

Writer

OutputStreamWriter

FileWriter

BufferedWriter

Reader

InputStreamReader

FileReader

BufferedReader

Java转换流、缓冲流、流操作规律整理的更多相关文章

  1. 缓冲字符流 java.io.BufferedWriter ,java.io.BufferedReader,缓冲字符输出流:PrintWriter

    package seday07; import java.io.IOException;import java.io.PrintWriter; /*** @author xingsir * 缓冲字符流 ...

  2. Java精选笔记_IO流(转换流、常用流、流操作规律、字符编码)

    IO流 用来处理设备之间的数据传输,java对数据的操作是通过流的方式,java用于操作流的对象都在IO包中 按操作数据分为:字节流和字符流:按流向分为:输入流和输出流. 程序从输入流中读取数据,向输 ...

  3. Java基础---IO(一)---IO流概述、字符流、字节流、流操作规律

    第一讲     IO概述 概述 1.IO流:即InputOutput的缩写. 2.特点: 1)IO流用来处理设备间的数据传输. 2)Java对数据的操作是通过流的方式. 3)Java用于操作流的对象都 ...

  4. Java第三阶段学习(五、流的操作规律、Properties流、序列化流与反序列化流、打印流、commons-IO jar包)

    一.流的操作规律 四个明确: 明确一:明确要操作的数据是数据源还是数据目的地 源:InputStream   Reader 目的地:OutputStream Writer 先根据需求明确是要读还是写 ...

  5. -1-4 java io java流 常用流 分类 File类 文件 字节流 字符流 缓冲流 内存操作流 合并序列流

      File类 •文件和目录路径名的抽象表示形式 构造方法 •public File(String pathname) •public File(String parent,Stringchild) ...

  6. java:IO流(处理流(缓冲流,转换流,数据流),对象的序列化,Properties)

    字节缓冲流:(BufferedInputStream,BufferedOutStream) *按照流的功能来分:节点流和处理流 *节点流可以直接操作数据源: *InputStream *--FileI ...

  7. java 节点流(字符流,字节流)和包装流(缓冲流,转换流)

    结点流:直接对File类进行操作的文件流 package stream; import java.io.File; import java.io.FileNotFoundException; impo ...

  8. 我爱Java系列之《JavaEE学习笔记day12》---【缓冲流、转换流、序列/反序列化流、打印流】

    [缓冲流.转换流.序列/反序列化流.打印流] 一.缓冲流 1.字节缓冲输出流 java.io.BufferedOutputStream extends OutputStream 高效字节输出流 写入文 ...

  9. Java---IO加强(3)-IO流的操作规律

    一般写关于操作文件的读取的几个通用步骤!!! 1.明确源和目的. 源:InputStream Reader 一定是被读取的. 目的:OutputStream Writer 一定是被写入的. 2.处理的 ...

随机推荐

  1. python调用C程序代码

    DHT11的驱动使用C语言编写   然后用python调用C的程序 显示温湿度 pycall.py文件如下: #!/usr/bin/env python # -*- coding:utf-8 -*- ...

  2. python3 dict(字典)

    clear(清空字典内容) stu = { 'num1':'Tom', 'num2':'Lucy', 'num3':'Sam', } print(stu.clear()) #输出:None copy( ...

  3. 【字】biang

    biang biang面的名字由来:biangbiang面是陕西关中地区的一中地区美食,因为在做这种面时会发出biang biang的声音,biang biang面因此得名.biang字简体共有42笔 ...

  4. 【Python使用】使用pip安装卸载Python包(含离线安装Python包)未完成???

    pip 是 Python 包管理工具,该工具提供了对Python包的查找.下载.安装.卸载的功能.Python 2.7.9 + 或 Python 3.4+ 以上版本都自带 pip 工具. pip使用( ...

  5. kafka-rest:A Comprehensive, Open Source REST Proxy for Kafka

    Ewen Cheslack-Postava  March 25, 2015  时间有点久,但讲的还是很清楚的 As part of Confluent Platform 1.0 released ab ...

  6. 微信小程序设置域名、不校验域名

    设置--项目设置 将不校验域名勾上就可以了,不再校验域名了通过 url: 'https://localhost:8443/spring4/user/list.do',就可以访问后台了. 若要配置域名则 ...

  7. loadrunner脚本函数讲解

    一. get请求和post请求区别:web_link(get).web_submit_form(post)依赖上下文,web_url.web_submit_data不依赖上下文,建议使用web_url ...

  8. tensorboard 可视化网络运行过程

    在 tf.summary 里设置好要查看保存的参数后运行会生成 events.out.tfevents.{time}.{machine-name} 的文件,这个就是用 tensorboard 来查看的 ...

  9. 移动端无限滚动 TScroll.vue组件

    // 先看使用TScroll.vue的几个demo 1.https://sorrowx.github.io/TScroll/#/ 2. https://sorrowx.github.io/TScrol ...

  10. TensorRT&Sample&Python[introductory_parser_samples]

    本文是基于TensorRT 5.0.2基础上,关于其内部的introductory_parser_samples例子的分析和介绍. 1 引言 假设当前路径为: TensorRT-5.0.2.6/sam ...