`

java学习笔记:关于IO转换流InputStreamReader和OutputStreamWriter

    博客分类:
  • java
阅读更多

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
1
1
分享到:
评论
2 楼 LAFEU 2012-04-27  
1 楼 乱世小步 2011-12-25  
                   :arrow

    [*]

    [*]
引用
[u][/u][i][/i][b][/b][img][/img][url][/url]:  

相关推荐

    java io流学习笔记1

    在Java IO中,还有转换流(InputStreamReader和OutputStreamWriter)的作用,它们将字节流和字符流之间进行桥接,允许我们在不同的字符编码之间进行转换。例如,当我们需要从一个字节流中读取UTF-8编码的文本时,...

    java学习笔记之Java-IO操作共19页.pdf.zi

    InputStreamReader和OutputStreamWriter分别用于将字节流转换为字符流,反之亦然。 5. **对象序列化与反序列化** - 序列化(Serialization)是将对象转换为字节流,便于存储或传输。实现Serializable接口的类的...

    Java 的 IO流笔记.md

    ### Java IO流学习笔记 #### 一、IO流的四大抽象类 - **InputStream/OutputStream**:字节的输入输出流的抽象类。 - 数据单位:字节(8比特,范围0-255) - **Reader/Writer**:字符的输入输出流的抽象类。 - ...

    Java IO学习笔记+代码

    转换流如`InputStreamReader`和`OutputStreamWriter`用于在字节流和字符流之间转换。 8. **过滤流和数据流**: 过滤流如`FilterInputStream`和`FilterOutputStream`允许添加额外的功能,如压缩或加密。数据流如`...

    java学习笔记(java 反射机制 流 内存管理)

    本笔记主要涵盖了四个核心知识点:Java反射机制、流(I/O流)、内存管理和Java学习的基础。以下是对这些主题的详细阐述: 一、Java反射机制 Java反射机制是Java语言的一个强大特性,允许程序在运行时检查类、接口、...

    Java-IO流基础例题 & 例题源码 & PPT教学文档(黑马程序员详细版).rar

    提供的源码笔记可以帮助你看到这些概念在实际代码中的应用,通过对例题源码的阅读和调试,加深对Java IO流的理解。例如,你可能会看到如何使用FileInputStream和FileOutputStream读写文件,或者使用DataInputStream...

    java面试题 学习笔记

    4. 转换流:使用InputStreamReader和OutputStreamWriter进行字符流与字节流之间的转换。 七、网络编程 1. Socket编程:理解TCP和UDP的区别,以及如何使用Socket和ServerSocket进行通信。 2. URL和URLConnection:...

    Java 基础 第3阶段:高级应用-尚硅谷学习笔记(含面试题) 2023年

    Java提供了多种类型的流,如字节流(InputStream和OutputStream)和字符流(Reader和Writer),还有缓冲流(BufferedInputStream/BufferedReader)和转换流(InputStreamReader/OutputStreamWriter)。此外,NIO...

    10-java进阶-IO流1

    转换流( InputStreamReader 和 OutputStreamWriter)用于在字节流和字符流之间转换。`InputStreamReader`接收一个字节输入流,并将其转换为字符输入流,同样,`OutputStreamWriter`将字符输出流转换为字节输出流。...

    Java IO学习总结归纳(附代码)

    8. 字节转换流:`InputStreamReader`和`OutputStreamWriter` 9. 字符转换流:`ReaderInputStream`和`WriterOutputStream` 10. 数据字节流:`DataInputStream`和`DataOutputStream` 11. 打印字节流:`PrintStream` 12...

    达内内网学习笔记 Java SE核心

    - 转换流:InputStreamReader、OutputStreamWriter用于字符流和字节流之间的转换。 7. **多线程**: - Thread类:创建和控制线程。 - Runnable接口:另一种实现多线程的方式。 - 线程同步:synchronized关键字...

    java从0基础学习笔记

    - 转换流:学会使用InputStreamReader和OutputStreamWriter在字节流和字符流之间转换。 7. **网络编程** - Socket编程:理解TCP和UDP协议,学会使用Socket和ServerSocket创建客户端和服务端。 - URL和...

    IO操作.pdf

    转换流用于字节流与字符流之间的转换,如`InputStreamReader`和`OutputStreamWriter`,它们分别用以将字节流转换为字符流和将字符流转换为字节流。 4. **缓冲流(Buffered Stream)** 包括`BufferedInputStream`...

    JavaIO总结.pdf

    Java IO学习笔记中提到,流的操作非常容易,Java API中提供了丰富的流处理类,API也大差不差,看看文档即可上手。 在Java IO中,流的分类非常丰富,包括输入流、输出流、字节流、字符流、节点流、处理流等等。掌握...

    Java基础学习笔记.zip

    "day10【缓冲流、转换流、序列化流、打印流】-笔记.pdf"进一步深入了流的使用,转换流如InputStreamReader和OutputStreamWriter用于在字节流和字符流之间转换,序列化流用于持久化对象,打印流如PrintStream方便输出...

    java 学习笔记

    - **OutputStreamWriter和InputStreamReader**:用于在字节流和字符流之间转换。 - **BufferedReader和BufferedWriter**:提供缓冲区功能,提高读写效率。 - **PipedInputStream和PipedOutputStream**:用于多...

    java面试笔记最新java面试笔记

    6. **IO流**:掌握输入/输出流的概念,了解字节流和字符流的区别,缓冲流的使用,以及FileReader、FileWriter、InputStreamReader、OutputStreamWriter等类的应用。 7. **多线程**:Java提供了Thread类和Runnable...

    java各种笔记.zip

    - **转换流**:InputStreamReader/OutputStreamWriter用于字节流和字符流之间的转换。 7. **网络编程**: - **Socket编程**:创建客户端Socket和服务器端ServerSocket进行通信。 - **URL与URLConnection**:用于...

Global site tag (gtag.js) - Google Analytics