Java IO 转换流 字节转字符流

Java IO 转换流 字节转字符流

@author ixenos

字节流



输入字节流:
---------| InputStream 所有输入字节流的基类。 抽象类。
------------| FileInputStream 读取文件的输入字节流。
------------| BufferedInputStream 缓冲输入字节流。 该类内部其实就是维护了一个8kb(8192b)字节数组而已。 该类出现的目的是为了提高读取文件数据的效率。

输出字节流:
---------| OutputStream 所有输出字节流的基类。 抽象类。
------------| FileOutputStream 向文件输出数据 的输出字节流。
------------| BufferedOutputStream 缓冲输出字节流。 该类出现的目的是为了提高向文件写数据的效率。 该类内部其实也是维护了一个8kb(8192b)的字节数组而已。

什么情况使用字节流

读取到数据不需要经过编码或者解码的情况情况下这时候使用字节流。比如:图片数据

字符流



字符流 = 字节流 + 编码(解码)

输入字符流
--------| Reader 所有输入字符流的基类。 抽象类。
-----------| FileReader 读取文件字符的输入字符流。
-----------| BufferedReader 缓冲输入字符流。 该类出现的目的是为了提高读取文件字符的效率并且拓展了功能(readLine()),它内部 其实就是维护了一个8192个长度的字符数组。

  ps:BufferedInputStream维护了一个8192长度的字节数组(byte[]),BufferedReader维护了一个8192长度的字符数组(char[])

输出字符流
-------| Writer 所有输出字符流的基类。 抽象类。
------------| FileWriter 向文件输出字符数据的输出字符流。
---------------| BufferedWriter 缓冲输出字符流。该类出现的目的是为了提高写文件字符的效率并且拓展了功能(newLine())。

什么情况下使用字符流:如果读写的都是字符数据,这时候我们就使用字符流。

字节转字符流(转换流)



输入字节流的转换流 输入字节流---------输入字符流
InputSrteamReader

输出字节流的转换流
OutputStreamWriter

转换流的作用

1. 可以把对应的字节流转换成字符流使用。
2. 可以指定码表进行读写文件的数据。

FileReader, FileWriter这两个类默认是使用的是gbk编码 表。不能由你来指定码表读写文件数据。

public class Demo1 {

    public static void main(String[] args) throws Exception {
//        testInput();
//        writeFile();
        readFile();
    }

    public static void readFile() throws IOException{
        //建立文件与程序的输入数据通道
        FileInputStream fileInputStream = new FileInputStream("F:\\a.txt");
        //创建输入字节流的转换流并且指定码表进行读取
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"utf-8");
        int content = 0;
        while((content = inputStreamReader.read())!=-1){
            System.out.println((char)content);
        }
        //关闭资源
        inputStreamReader.close();

        /*FileReader fileReader = new FileReader("F:\\a.txt");  //默认使用的是gbk码表
        int content = 0;
        while((content = fileReader.read())!=-1){
            System.out.print((char)content);
        }

        //关闭资源
        fileReader.close();*/

    }

    //指定使用utf-8码表把数据写出到文件上。
    public static void writeFile() throws IOException{
        //建立了文件与程序的数据 通道
        FileOutputStream fileOutputStream = new FileOutputStream("F:\\a.txt");
        //创建一个输出字节流的转换流并且指定码表进行写数据
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream,"utf-8");
        outputStreamWriter.write("大家好");  //中文在utf-8码表中占三个字节。

        //关闭资源
        outputStreamWriter.close();
    }

    public static void testOutput() throws Exception{
        Socket socket = new Socket(InetAddress.getLocalHost(),9090);
        //获取到socket的输出流对象。
        OutputStream outputStream =     socket.getOutputStream();
        //把输出字节流转换成输出字符流
        OutputStreamWriter  outputStreamWriter = new OutputStreamWriter(outputStream);
        outputStreamWriter.write("不饿!");
    }

    public static void testInput() throws Exception{
        InputStream in = System.in;
//        int  content = in.read(); // 每次只会读取到一个字节的数据

        //需要把字节流转换成字符流使用。
        InputStreamReader  inputStreamReader = new InputStreamReader(in);

        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

        System.out.println(bufferedReader.readLine());
    }

}

InputStreamReader/Writer路线:

 1 import java.io.BufferedReader;
 2 import java.io.BufferedWriter;
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.FileNotFoundException;
 6 import java.io.FileOutputStream;
 7 import java.io.IOException;
 8 import java.io.InputStreamReader;
 9 import java.io.OutputStreamWriter;
10 import java.io.UnsupportedEncodingException;
11
12 /**
13  * 用InputStreamReader/Writer路线
14  *
15  * @author ixenos
16  *
17  */
18 public class JDKIODemo1 {
19
20     public static void main(String[] args) {
21         File file = new File("imUTF8.txt");
22         File file2 = new File("imOutput.txt");
23         try {
24             FileInputStream fis = new FileInputStream(file);
25             FileOutputStream fos = new FileOutputStream(file2);
26
27             InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
28             OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
29
30             BufferedReader br = new BufferedReader(isr);
31             BufferedWriter bw = new BufferedWriter(osw);
32
33             String line;
34             while ((line = br.readLine()) != null) {
35                 System.out.println(line);
36
37                 bw.write(line);
38                 bw.newLine();// 写入分隔符(内部是line.separator)
39             }
40
41             br.close();
42             bw.close();
43             isr.close();
44             osw.close();
45             fis.close();
46             fos.close();
47             System.out.println("done");
48
49 //
50 //            //不用BufferedReader时
51 //            FileInputStream fis = new FileInputStream(file);
52 //            FileOutputStream fos = new FileOutputStream(file2);
53 //            InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
54 //            OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
55 //
56 //            char[] buf = new char[1024];
57 //            int len = 0; // 用以标志最后一组字符串的末尾值,防止多读
58 //            while ((len = isr.read(buf)) != -1) {
59 //                System.out.println(new String(buf, 0, len));
60 //                osw.write(buf, 0, len);//自动写分隔符
61 //            }
62 //
63 //            isr.close();
64 //            osw.close();
65 //            fis.close();
66 //            fos.close();
67 //            System.out.println("done");
68
69
70         } catch (UnsupportedEncodingException e) {
71             e.printStackTrace();
72         } catch (FileNotFoundException e) {
73             e.printStackTrace();
74         } catch (IOException e) {
75             e.printStackTrace();
76         }
77
78     }
79
80 }

FileReader/Writer路线:

 1 import java.io.BufferedReader;
 2 import java.io.BufferedWriter;
 3 import java.io.File;
 4 import java.io.FileNotFoundException;
 5 import java.io.FileReader;
 6 import java.io.FileWriter;
 7 import java.io.IOException;
 8
 9 /**
10  * FileReader/Writer路线
11  *
12  * 关键:FileReader是InputStreamReader的子类
13  * JDK的FileReader只能用系统默认编码,我把eclipse默认设为UTF-8,所以正常
14  *
15  * @author ixenos
16  *
17  */
18 public class JDKIODemo2 {
19
20     public static void main(String[] args) {
21         File file = new File("imGBK.txt");
22         File file2 = new File("imOutput.txt");
23         try {
24             FileReader fr = new FileReader(file);
25             FileWriter fw = new FileWriter(file2);
26             BufferedReader br = new BufferedReader(fr);
27             BufferedWriter bw = new BufferedWriter(fw);
28             String line = null;
29             while ((line = br.readLine()) != null) {
30                 System.out.println(line);
31                 bw.write(line);
32                 bw.newLine();// 需要手动换行
33             }
34             br.close();
35             bw.close();
36             fr.close();
37             fw.close();
38
39
40 //            // 不用BufferedReader时
41 //            FileReader fr = new FileReader(file);
42 //            FileWriter fw = new FileWriter(file2);
43 //            char[] buf = new char[1024];
44 //            int len = 0; // 用以标志最后一组字符串的末尾值,防止多读
45 //            while ((len = fr.read(buf)) != -1) {
46 //                System.out.println(new String(buf, 0, len));
47 //
48 //                fw.write(buf, 0, len);// 自动换行
49 //            }
50 //            fr.close();
51 //            fw.close();
52
53         } catch (FileNotFoundException e) {
54             e.printStackTrace();
55         } catch (IOException e) {
56             e.printStackTrace();
57         }
58
59     }
60
61 }
时间: 2024-10-14 20:34:54

Java IO 转换流 字节转字符流的相关文章

J2SE知识点归纳笔记(七)---Java IO Part 4:基本字符流

J2SE知识点归纳笔记(七)---Java IO Part 4:基本字符流                                                                 --转载请注明出处:coder-pig 本节引言: 上一节中,我们对于Java IO流中的一些基本字节流进行了学习,他们都是InputStream与 OutputStream的子类;本节学习的字符流则是Reader与Writer的子类,好了,话不多说, 开始本节内容! 本节正文: 1.Reade

java IO(五):字节流、字符流的选择规律

*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hljs-comment, .hljs-template_comment, .diff .hljs-header, .hljs-javadoc { color: #998; font-style: italic; } .hljs-keyword, .css .rule .hljs-keyword, .h

Java IO学习--(五)字节和字符数组

内容列表 从InputStream或者Reader中读入数组 从OutputStream或者Writer中写数组 在java中常用字节和字符数组在应用中临时存储数据.而这些数组又是通常的数据读取来源或者写入目的地.如果你需要在程序运行时需要大量读取文件里的内容,那么你也可以把一个文件加载到数组中.当然你可以通过直接指定索引来读取这些数组.但如果设计成为从InputStream或者Reader,而不是从数组中读取某些数据的话,你会用什么组件呢? 从 InputStream 或 Reader中读取数

Java基础---IO(一)---IO流概述、字符流、字节流、流操作规律

第一讲     IO概述 概述 1.IO流:即InputOutput的缩写. 2.特点: 1)IO流用来处理设备间的数据传输. 2)Java对数据的操作是通过流的方式. 3)Java用于操作流的对象都在IO包中. 4)流按操作数据分为两种:字节流和字符流. 5)流按流向分为:输入流和输出流. 注意:流只能操作数据,而不能操作文件. 3.IO流的常用基类: 1)字节流的抽象基流:InputStream和OutputStream 2)字符流的抽象基流:Reader和Writer 注:此四个类派生出来

【IO流】22 - 字符流 - 转换流OutputStreamWrite和InputStreamReader

转换流 InputStreamReader package cn.itcast.demo; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; /* * 转换流 * java.io.InputStreamReader 继承 Reader * 字符输入流,读取文本文件 * * 字节流向字符的桥梁,将字节流转字符流 * * 读取的方法: * read() 读取1个字

Java之IO初识(字节流和字符流)

IO概述 生活中,你肯定经历过这样的场景.当你编辑一个文本文件,忘记了 ctrl+s ,可能文件就白白编辑了.当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里.那么数据都是在哪些设备上的呢?键盘.内存.硬盘.外接设备等等.我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为 输入input 和 输出output ,即流向内存是输入流,流出内存的输出流.Java中I/O操作主要是指使用 java.io 包下的内容,进行输入.输出操作.输入也叫做读取数据,输

黑马程序员—IO(一)流概述、字符流、字节流、流操作规律

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 第一节     IO概述 概述 1.IO流:即InputOutput的缩写. 2.特点: 1)IO流用来处理设备间的数据传输. 2)Java对数据的操作是通过流的方式. 3)Java用于操作流的对象都在IO包中. 4)流按其操作数据的类型分为两种:字节流和字符流. 5)流按其流向分为:输入流和输出流. 注意:流只能操作数据,而不能操作文件. 3.IO流的常用基类: 1)字节流的抽象基流:Inp

黑马程序员——IO流概述、字符流、字节流、流操作规律(一)

第一节     IO概述 概述 1.IO流:即InputOutput的缩写. 2.特点: 1)IO流用来处理设备间的数据传输. 2)Java对数据的操作是通过流的方式. 3)Java用于操作流的对象都在IO包中. 4)流按其操作数据的类型分为两种:字节流和字符流. 5)流按其流向分为:输入流和输出流. 注意:流只能操作数据,而不能操作文件. 3.IO流的常用基类: 1)字节流的抽象基流:InputStream和OutputStream 2)字符流的抽象基流:Reader和Writer 注:此四个

深入理解JAVA I/O系列三:字符流详解

字符流为何存在 既然字节流提供了能够处理任何类型的输入/输出操作的功能,那为什么还要存在字符流呢?容我慢慢道来,字节流不能直接操作Unicode字符,因为一个字符有两个字节,字节流一次只能操作一个字节.如果JAVA不能直接操作字符,我会感到JAVA对这个世界满满的恶意,所以提供对直接的字符输入/输出的支持是很有必要的,因为我们的口号是:一次编写,到处运行. 字符流的概念 输出字符流:把要写入文件的字符序列(实际是unicode码元序列)转为指定编码方式下的字节序列,然后在写入文件中. 输入字符流