转换流:

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. luogu4180 次小生成树Tree 树上倍增

    题目:求一个无向图的严格次小生成树(即次小生成树的边权和严格小于最小生成树的边权和) 首先求出图中的最小生成树.任意加一条树外边都会导致环的出现.我们现在目标是在树外边集合B中,找到边b∈B,a∈b所 ...

  2. ADO.NET改进防注入

    static void Main1(string[] args) { //用户输入一个需要查询的条件 car表 Console.WriteLine("请输入"); string c ...

  3. JavaWeb详细学习路线图

    - Java攻城狮学习路线 - 图转自网络.

  4. 原生js实现简单JSONP

    JSONP是一种非常常见的实现跨域请求的方法.其基本思想是利用浏览器中可以跨域请求外链的JS文件,利用这一特性实现数据传输. 用原生JS实现JSONP非常简单,无非几点: 1)定义一个函数,用于处理接 ...

  5. 使用postman模拟登录请求

    Cookie 可以写在Headers里面

  6. 【技术累积】【点】【java】【4】日志级别

    闲聊 水文也是文,写总比不写好. 日志级别 虽然对其他语言的日志系统也不甚了解,但还是感觉Java的日志有些麻烦,当然也可以说是发展已久,多有变化,多有完善吧. 从日志级别来说,有从高到低的八个级别: ...

  7. CentOS7 使用 firewalld 打开关闭 防火墙 与 端口!!

    1.firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status f ...

  8. Python中的多个装饰器装饰一个函数

    def wrapper1(func1): def inner1(): print('w1 ,before') func1() print('w1 after') return inner1 def w ...

  9. day06-08面向对象进阶

    isinstance和issubclass 反射 setattr delattr getattr hasattr __str__和__repr__ __del__ item系列 __getitem__ ...

  10. VS Code编写html(2)

    <html> <head> <title>welcome to myspace</title> <meta charset="utf-8 ...