1 字节流
InputStream ->FileInputStream
OutputStream ->FileOutputStream
2 字符流
Reader -> BufferedReader -> LineNumberReader
-> InputStreamReader -> FileReader
Writer -> BufferedWriter
-> OutputStreamWriter -> FileWriter
============================================================
由JDK的IO流继承结构我们看到
FileInputStream和FileOutputStream是直接继承自字节流基类的
而FileReader和FileWriter是继承自2个转换流,
为什么会这样呢?
很可能是因为FileReader和FileWriter都是对字符型文件的操作,
而计算机处理的是字节数据,
读取文件后要将字符对象转成字节对象,
在写入到文件时时要将字节对象转成字符对象
/*
[示例1]:按行读写控制台中的字符
*/
import java.io.*;
class Demo
{
public static void main(String[] args) throws IOException
{
readAndWriteCmd();
}
public static void readAndWriteCmd() throws IOException
{
//1.获取键盘输入的字节流对象
InputStream in = System.in;
//2.将字节流对象转成字符流对象,使用转换流InputStreamReader
InputStreamReader isr = new InputStreamReader(in); //in字节流就变成isr字符流了
//3.为了提高效率,使用字符缓冲流BufferedReader
BufferedReader bufr = new BufferedReader(isr);
OutputStream output = System.out;
OutputStreamWriter osw = new OutputStreamWriter(output);
BufferedWriter bufw= new BufferedWriter(osw); //因为要用到换行newLine()
//4.然后就可以使用BufferedReader的readLine方法一次读取一行,读了再写到cmd里
String lineStr=null;
while(true)
{
lineStr = bufr.readLine(); //读取我们从键盘输入到控制台的内容
if(lineStr!=null)
{
if(lineStr.equals("over")) //输入over时结束
{
break;
}
else
{
bufw.write(lineStr); //写到控制台
bufw.newLine(); //输出换行符,在windows里也可直接输出"\r\n"
bufw.flush(); //清空缓冲区,否则下一次输出时会重复输出
}
}
else
{
break;
}
}
}
}
========================================================================================
/*
将上个例子的输出设备改成硬盘文件
[示例2]:将键盘输入控制台的字符输出到文本文件
*/
import java.io.*;
class Demo
{
public static void main(String[] args) throws IOException
{
readAndWriteCmd();
}
public static void readAndWriteCmd() throws IOException
{
BufferedReader bufr= new BufferedReader(new InputStreamReader(System.in));
//BufferedWriter bufw= new BufferedWriter(new OutputStreamWriter(new FileOutputStream("c:\\out.txt")));
BufferedWriter bufw= new BufferedWriter(new FileWriter("c:\\out.txt"));
String lineStr=null;
while(true)
{
lineStr = bufr.readLine(); //读取我们从键盘输入到控制台的内容
if(lineStr!=null)
{
if(lineStr.equals("over")) //输入over时结束
{
break;
}
else
{
bufw.write(lineStr);
bufw.newLine(); //输出换行符,在windows里也可直接输出"\r\n"
bufw.flush(); //清空缓冲区,否则下一次输出时会重复输出
}
}
else
{
break;
}
}
}
}
当我们使用默认GBK编码保存文本时,下面2句代码其实是一样的效果,
new OutputStreamWriter(new FileOutputStream("out.txt"))
new FileWriter("out.txt")
当要求保存为其他编码比如UTF-8时,就要这样写
new OutputStreamWriter(new FileOutputStream("out.txt"),"UTF-8")
而如果要读取一个UTF-8编码的文本文件时,同样的要用
new InputStreamReader(new FileInputStream("in.txt"),"UTF-8");
而不能用new FileWriter("in.txt")
============================================================================
笔记补充:
通过3个步骤来选择使用哪个流
1.明确源和目的体系
源: 输入流2个体系 InputStream Reader
目的:输出流2个体系 OutputStream Writer
2.操作的数据是否是纯文本
(为什么要区分字节和字符呢?效率问题,还有就是类中独有的方法)
是:用字符流
不是:字节流
对于键盘:我们一般要处理的是键盘录入的字符,如果你非要处理字节也有可能的
3.当体系明确后,再明确要使用哪个具体的类(或者说哪个对象)
通过设备来区分:
1.源设备 :内存.硬盘.键盘
2.目的设备:内存.硬盘.控制台
[针对示例2]:将键盘录入的字符数据,保存到硬盘文件中
首先看:键盘录入!
第一步:明确体系,键盘录入是源,用InputStream 或 Reader体系
第二步:操作的是否是纯文本? 键盘录入字符,所以是字符数据!用Reader
第三步:使用哪个具体对象? 我们知道键盘录入的对象使用System.in
这里我们可能有个问题要提出,
我们不是选择的Reader体系吗?而System.in是字节流啊!
System.in是java用来处理键盘录入的数据的,是处理的字节型数据没错,
但我们现在要处理的是字符问题,虽然字符本质上也是字节数据,但字符Reader体系
有它特有的方法并且处理字符时的高效便捷,所以我们才用Reader体系,
我们只要将获取的字节数据用Reader体系中的InputStreamReader转换一下就行了
InputStreamReader isr = new InputStreamReader(System.in);
另外: 需要提高效率吗? 需要,而且还有个输出换行符方法
BufferedReader bufr = new BufferedReader(isr);
再来看:保存文件!
第一步:明确体系,保存到硬盘是目的,是输出,用OutputStream或Writer
第二步:操作的是否是文本? 将字符写入到文件,是!用Writer字符流
第三步:使用哪个具体对象? 看设备,是硬盘,一个文件,使用FileWriter
FileWriter fw = new FileWriter("b.txt");
另外: 需要提高效率么?需要
BufferedWriter bufw = new BufferedWriter(fw);
这里我们不需要再使用转换流OutputStreamWriter
因为我们用的BufferedWriter包装的FileWriter,而FileWriter是继承OutputStreamWriter
的,BufferedReader 在写数据的时候就是写的字节数据
如果: 如果要求在保存文件时是使用指定的编码格式时,就要显式使用转换流OutputStreamWriter了
因为OutputStreamWriter的重载构造方法中有可以指定编码表名称的(默认编码表是GBK),
而其第一个参数又必须是字节输出流OutputStream, 而可以操作文件的字节输出流就是
FileOutputStream了.
需求:写入文本文件,编码格式是UTF-8
BufferedWriter bufw =
new BufferedWriter(new OutputStreamWriter(new FileOutpunStream("a.txt"),"UTF-8"))
而FileReader读取的是默认编码格式的文本文件,要读取UTF-8格式的文件,就要用到InputStreamReader
- 大小: 33.7 KB
分享到:
相关推荐
OReilly.Java.I.O.2nd.Edition.May.2006 Java的io包主要包括: 1. 两种流:字节流(byte Stream)和字符流(character stream),这...3. 一个桥梁:将字节流转变为字符流的InputStreamReader和OutputStreamWriter。
2、常用21个IO流:FileWriter、FileReader、CharArrayReader、CharArrayWriter、CharSequence、OutputStreamWriter、FileOutputStream、InputStreamReader、PrintWriter、BufferedReader、InputStream、...
Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 ...而类 InputStreamReader 和 OutputStreamWriter 处理字符流和字节流的转换。字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。
本文通过示例代码给大家解析了Java中的InputStreamReader和OutputStreamWriter知识,需要的的朋友参考下吧
java调用io流,InputStreamReader,BufferReader读取文件
Java IO流学习总结 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据...
目录java IO流学习笔记——(3)字节缓冲流&字符缓冲流&转换流&数据流字节缓冲流 —BufferedInputStream&BufferedOutputStream字符缓冲流—BufferedReader&BufferedWriter转换流—InputStreamReader&...
分析Java常用IO流,包括InputStream、OutputStream、FileInputStream、FileOutputStream、BufferedInputStream、BufferedOutputStream、Reader、Writer、InputStreamReader、OutputStreamWriter、FileReader、...
Java学习日志(二十一)缓冲流原理字节缓冲输出流:BufferedOutputStream字节缓冲输入流:BufferedInputStream字符缓冲输出流:BufferedWriter字符缓冲输入流:BufferedReader文件复制文件排序转换流原理字符转换...
* InputStreamReader:将字节输入流包装一下,让其更适合读取文本文件 * 构造方法: * 1.InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader。 * 2.InputStreamReader...
第三,是否需要转换流:InputStreamReader, OutputStreamWriter? 第四,数据来源(去向)是什么:文件?内存?网络? 首先是字节流: InputStream的实现类(System.in返回一个输入流): 1)ByteArrayInputStream...
1.3.9 字符流 InputStreamReader/OutputStreamWriter 1.3.10 随机存取文件 RandomAccessFile 1.3.11 小结 1.4 java中的一些常用词汇 1.5 J2SE学习中的30个基本概念 1.6 Java线程 1.7 Java 5.0多线程编程 1.8 Java ...
课程内容主要有:File类概述、File类功能讲解、JAVA IO流概述、字节流、字符流、缓冲流、InputStream、OutputStream、Reader、Writer、FileInputStream、FileOutputStream、InputStreamReader、OutputStreamWriter、...
1.3.9 字符流 InputStreamReader/OutputStreamWriter 55 1.3.10 随机存取文件 RandomAccessFile 56 1.3.11 小结 56 1.4 java中的一些常用词汇 56 1.5 J2SE学习中的30个基本概念 58 1.6 Java线程 60 1.7 Java 5.0多...
import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing....
Java字符编码基础 Java字符编码是处理文本信息的基础,它规定了...Java提供了丰富的API用于字符编码的处理,如Charset类可以获取系统默认的字符编码,InputStreamReader和OutputStreamWriter可以进行字符编码的转换。
本课程从零开始,以通俗易懂的方式讲解Java技术,手把手教你掌握每一个知识点。 真正做到零基础入门学习,适合初学者的教程! 课程内容包括: 1.File类 2.IO流简介 3.流的分类 输入流、输出流 字节流、字符...
import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.StringReader; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util...
文章目录IO基础(字符流)一、字符流二、常用的字符流类的继承关系三、字符流 FileReader 和 FileWriter四、字符缓冲流 BufferedReader 和 BufferedWriter五、 字符字节转换流(InputStreamReader/...