转换流:

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. android 系统签名【转】

    本文转载自:http://blog.csdn.net/csh86277516/article/details/73549824 Android——编译release版签名系统 AndroidManif ...

  2. hdoj--1150--Machine Schedule(最小点覆盖)

    Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. exchange&nbsp;2010-备份还原

    操作系统:Windows Server 2008R2 \ Exchange2010 测试 1.使用Administraotr用户进行查看己有邮件,如下图: 2.备份Exchange2010整个数据库, ...

  4. JS中的数据类型及判断数据类型的方法

    简单类型(基本类型): number,string,boolean,null,undefined 复杂类型(引用类型):object typeof 只能判断基本数据类型 instanceof 能够判断 ...

  5. GStreamer基础教程02 - 基本概念

    摘要 在 Gstreamer基础教程01 - Hello World中,我们介绍了如何快速的通过一个字符串创建一个简单的pipeline.为了能够更好的控制pipline中的element,我们需要单 ...

  6. A - Antipalindrome

    Problem description A string is a palindrome if it reads the same from the left to the right and fro ...

  7. 动画和图形:OpenGL ES

    在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...

  8. 4) 十分钟学会android--建立第一个APP,启动另一个Activity

    在完成上一课(建立简单的用户界面)后,我们已经拥有了显示一个activity(一个界面)的app(应用),该activity包含了一个文本字段和一个按钮.在这节课中,我们将添加一些新的代码到MyAct ...

  9. 【技术累积】【点】【java】【3】编译和反编译

    闲聊 擦,打脸了,但打完了还是得继续写呗,水着水着看呗. 概述 理解的不深入,但是实用. 总而言之:编译,是将书写的代码翻译为机器能够理解的代码:反编译,则是相反的过程. 来源在于语言的等级,一般认为 ...

  10. JS中常见问题

    //s金额 n保留几位小数 默认保留两位小数 s代表金额,n代表保留的小数位数 function formatMoney(s, n) { n = n > 0 && n <= ...