转换流:

InputStreamReader:字节到字符的桥梁。解码

OutputStreamWriter:字符到字节的桥梁。编码

流的基本规律

1.明白源和汇

源:InputStream、Reader

汇:OutputStream、Writer

2.明白数据是否是纯文本数据

源:假设是。Reader。否,InputStream

汇:假设是,Writer,否,OutputStream

前两点明白后院,体系也就明白了

3.明白详细的设备

源设备:

硬盘:File

键盘:System.in

内存: 数组

网络:Socket流

汇设备:

硬盘:File

控制台:System.out

内存:数组

网络:Socket流

4.是否须要其它额外功能(对上述增强)

1.是否须要高效(缓冲区),

是,就加上buffer

2.是否须要转换

字节->字符:InputStreamReader:

InputStreamReader isr = new InputStreamReader(System.in);

FileWriter fe = new FileWriter("ACM.txt");

字符->字节:OutputStreamWriter:

OutputStreamWriter osw = new OutputStreamWriter(System.out)

练习:

1.复制一个文本文件:

(1)明白源和汇:源:InputStream Reader 汇:OutputStream Writer

 (2)是否是纯文本:是,源:Reader 汇:Writer

 (3)明白设备:源:File 汇:File  

FileReader fr = new FileReader(); FileWriter fw = new FileWriter();

 (4)须要高效:BufferedReader br = new BufferedReader(new FileReader("acm.txt"));

     BufferedWriter bw = new BufferedWriter(new FileWriter("ACM.txt"));

2.读取键盘信息,并写入一个文件里

 (1)明白源和汇:源:InputStream、 Reader 汇:OutputStream 、Writer

 (2)是否是纯文本:是。源:Reader 汇:Writer

 (3)明白设备:源:键盘 (System.in) 汇:硬盘 (File) 

InputStream is = System.in(); FileWriter fw = new FileWriter("ACM.txt");

(4)须要功能:1.转换,由于已明白源是Reader,这样更便捷

InputStreamReader isr = new InputStreamReader(System.in);

FileWriter fe = new FileWriter("ACM.txt");

   2.高效:BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

BufferedWriter bw = new BufferedWriter(new FileWriter("ACM.txt"))

3.将文本文件的数据显示到控制台上

(1)明白源和汇:源:InputStream、 Reader 汇:OutputStream 、Writer

(2)是否是纯文本:是。源:Reader 汇:Writer

(3)明白设备:源:硬盘(File) 汇:控制台(System.out)

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

OutStream out = System.ou;

(4)须要功能:

转换:FileReader fr  = new FileReader("acm.txt");

OutputStreamWriter osw = new OutputStreamWriter(System.out);

高效:BufferedReader br = new BufferedReader(new FileReader("acm.txt"))

      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));



4.读取键盘数据,显示到控制台

(1)明白源和汇:源:InputStream、 Reader 汇:OutputStream 、Writer

(2)是否是纯文本:是。源:Reader 汇:Writer

(3)明白设备:源:键盘 (System.in) 汇:控制台(System.out)

InputSream in = System.in

OutputStream out = System.out;

(4)须要转换,都是字节流。操作文本数据,使用字符流操作,更方便。一次读取一行

InputStreamReader isr = new InputStreamReader(System.in);

OutputStreamWriter osw = new OutputStreamWriter(System.out);

高效:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.ou))

5.转换流的编码解码

将中文字符串数据依照指定的编码表写到文本文件里



(1).明白源和汇:汇:OutputStream 、Writer

(2)是否是纯文本:是,汇:Writer

(3)明白设备: 汇:硬盘 (File) 

FilrWriter fw = new FileWriter("acm.txt");此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的

fw.write("你好");//中文占两个字节

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("x.txt"),"GBK");

FileWriter fw = new FileWriter("gbk.txt");

这两句代码的功能是等同的。

FileWriter:事实上就是转换流指定了本机默认码表的体现,并且这个转换流的子类对象,能够方便操作文本文件,简单说,操作文件的字节流+本机默认的编码表

假设操作文本文件须要详细的编码表,就必须使用转换流

(4)须要高效

BufferedWriter bw = new BufferedWriter(osw);

import java.io.*;

public class Main
{
public static void main(String[] args) throws IOException { //Demo_1();
Demo_2();
Demo_3();
} public static void Demo_3() throws IOException {
// TODO Auto-generated method stub
//FileReader fr = new FileReader("gbk.txt");
InputStreamReader isr = new InputStreamReader(new FileInputStream("gbk.txt"),"GBK"); char[] by = new char[20];
//int len = fr.read(by);
int len = isr.read(by);
String str = new String(by,0,len);
System.out.println(str);
// fr.close();
isr.close();
} public static void Demo_2() throws IOException {
//OutputStreamWriter(OutputStream out, String charsetName) ,创建使用指定编码表。
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk.txt"),"GBK");//
BufferedWriter bw = new BufferedWriter(osw);
bw.write("你好");
bw.close();
} public static void Demo() throws IOException{
FileWriter fw = new FileWriter("gbk.txt");
fw.write("你好");
fw.close();
}
}

注意既然需求中已经指定编码表的动作,那就不能够使用FileWriter。由于FileWriter内部使用的是默认的本地码表,仅仅能使用其父类。OuptStreamWriter,而OutputStreamWriter接收一个字节输出的对象,并且是文件操作,那么对象就应该是FileOuputStream

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("x.txt"),"GBK");



转换流什么时候用?



1.源或汇相应的设备是字节流,可是操作的是文本数据,能够是用转换做桥梁,提高文本操作的便捷

2.一旦操作文本涉及到详细的指定的编码表时,必须使用转换流



JAVA学习第五十一课 — IO流(五)流的操作基本规律的更多相关文章

  1. JAVA学习第四十七课 — IO流(一):文件的读写

    输入流和输出流相对于内存 将外部设备的数据读取到内存中:输入 将内存中的数据写入外部设备中:输出 IO流经常使用基类 字节流的抽象基类:InputStream,OutputStream 字符的抽象基类 ...

  2. Java学习之路(十一):IO流<前戏>

    File类的概述和构造方法 构造方法: File(String pathname):根据一个路径得到File对象 File(String parent,String child):根据一个目录和一个子 ...

  3. java基础(二十一)IO流(四)

    这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...

  4. 【java学习笔记】文件读写(IO流)

    1.字节流 FileInputStream.FileOutputStream ①FileInputStream import java.io.FileInputStream; public class ...

  5. 【Java学习笔记之三十一】详解Java8 lambda表达式

    Java 8 发布日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Java 8之前 ...

  6. JAVA学习第五十七课 — IO流(十一)

    一.管道流 PipedInputStream 和 PipedOutPutStream 输入和输出能够直接进行连接.结合线程使用 管道流,顾名思义,写一个读一个.连成一个管子 API文档:管道输入流应该 ...

  7. java学习第21天(IO流的使用)

    IO流分类: A:流向 输入流 读取数据 输出流 写出数据 B:数据类型 字节流 字节输入流 字节输出流 字符流 字符输入流 字符输出流 注意: a:如果我们没有明确说明按照什么分,默认按照数据类型分 ...

  8. 【Python】Java程序员学习Python(十一)— IO

    一.前言 io的内容其实还是有很多的,现在我也只是了解初步用法,当然详细内容还是应该参照官方api的: 官方api:https://docs.python.org/3/library/os.html. ...

  9. java学习第20天(IO流)

    构造方法File file = new File("e:\\demo"); 创建文件夹 File file = new File("e:\\demo"); fi ...

随机推荐

  1. 火狐Vimperator插件

    http://www.iplaysoft.com/vimium-and-vimperator.html http://wangbixi.com/x2923/comment-page-1/

  2. Redis Sentinel哨兵配置

    概述 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都 ...

  3. 第一个"hello python!"

    第一个python程序"hello python!" 首先打开我们的编辑器,在安装好python后,直接在windows快捷方式里,输入IDLE,就可以看到我们的python默认自 ...

  4. ps -aux ,ps aux ,ps -ef 的区别

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...

  5. NOIP2013T1 转圈游戏 快速幂

    描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置, --, 依此 ...

  6. WPF 漏斗控件 等待沙漏效果

    由于WPF中不支持gif图片因此要实现一个漏斗沙漏效果有点小麻烦. 网上有一款开源的控件 理论上完全开源 官网 http://wpfspark.codeplex.com/贴一下效果图 大家感觉需要就在 ...

  7. TypeScript简单的代码片段

    TypeScript中,接口.接口实现.函数重载: interface IThing{ name:string; age:number; sayHello:{ (name:string):string ...

  8. 02--读书笔记之:C++ Primer (第4版)及习题

    推荐博客:http://www.cnblogs.com/xkfz007/archive/2012/08/15/2639381.html 第2章 数据和基本类型 1. 整型 2. 习题:左值和右值 3. ...

  9. C# treeView 控件

    #region --基础 ////设置目录树 ////添加根节点 //treeView1.Nodes.Add("0000000"); ////添加子节点 ////treeView1 ...

  10. 优动漫PAINT个人版和EX版本差异

    优动漫PAINT是一款功能强大的动漫绘图软件,适用于个人和专业团队创作,分为个人版和EX版,那么这两个版本有什么区别,应该如何去选择呢? 优动漫PAINT个人版即可满足基本的绘画创作需求,EX版在个人 ...