java 核心编程——IO流之字符流(三)

1.字符流

  1.1 所有文件的存储都是字节的存储,我们日常在磁盘上保存的其实并不是文件的字符,而是先把字符转换成字节,再把这些字节储存到磁盘。在读取文件时,也是一个字节一个字节的读取,然后生成字节的序列。

  1.2 字节流可以处理任何对象,但是字符流呢,、只用来处理字符或者字符串。可以这样说,字节流呢,提供了最基本IO功能,可以处理任何IO操作,但是有一点,不可以直接处理Unicode字符,为什么呢,因为Unicode字符是一个单元为2个字节的字符,而字节流的处理单元为1个字节,字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符形成的。如果使用字节流直接处理Unicode字符的话,由于各种编码实现的不同,就很容易出现乱码。

  1.3实例上,我们日常处理的很多数据,都是文本,所以我们在字节流之外呢,又提出了字符流的概念,直接按照Java虚拟机的encode来处理,也就是在输出流和输入流之间 进行字符集的转换。

2.java字符流实现结构

  1.输入字符流

  2.输出字符流

  

3.字符流常用类

  3.1 字符数组输入输出流(CharArrayReader和CharArrayWriter)

package se.io;

import com.sun.org.apache.xpath.internal.operations.String;

import java.io.CharArrayReader;
import java.io.CharArrayWriter;
import java.io.IOException;

public class CharArrayTest {

    public static void main(String[] args) {

        char[] chars = new char[3];
        chars[0] = 100;
        chars[1] = 101;
        chars[2] = 102;

        CharArrayReader charArrayReader = new CharArrayReader(chars);
        try {
            char[] buf = new char[1024];
            charArrayReader.read(buf);

            CharArrayWriter charArrayWriter = new CharArrayWriter();
            charArrayWriter.write(buf);

            System.out.println(charArrayWriter.toString());
            charArrayWriter.close();
            charArrayReader.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

  3.2文件输入输出流(FileWriter和FileReader)

package se.io;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileCharTest {

    public static void main(String[] args) {

        try {
            FileReader fileReader = new FileReader("E:\\test\\data.txt");
            char[] chars = new char[1024];
            int i = fileReader.read(chars);

            FileWriter fileWriter = new FileWriter("E:\\test\\filewriter.txt");
            fileWriter.write(chars,0,i);

            fileWriter.close();
            fileReader.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

  3.3管道输入输出流(PipedReader 和 PipedWriter)

package se.io;

import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;

public class PipedChar {

    public static void main(String[] args) {

        SenderChar senderChar = new SenderChar();
        PipedWriter pipedWriter = senderChar.getWriter();

        ReceiverChar receiverChar = new ReceiverChar();
        PipedReader pipedReader =receiverChar.getReader();
        try {
            pipedWriter.connect(pipedReader);

            senderChar.start();
            receiverChar.start();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

//创建发送者类
class SenderChar extends Thread{
    private PipedWriter writer = new PipedWriter();

    public PipedWriter getWriter() {
        return writer;
    }

    public void run(){

        String s = new String("hello,world");
        try {
            writer.write(s);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
//创建接受者
class ReceiverChar extends  Thread{

    private PipedReader reader = new PipedReader();

    public PipedReader getReader() {
        return reader;
    }

    public  void run(){

        String s= null;
        char[] chars = new char[1024];

        try {
            int i = reader.read(chars);
            s = new String(chars,0,i);
            System.out.println(s);
            reader.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  3.4缓存输入输出流(BufferedReader 和BufferedWriter)

package se.io;

import java.io.*;

public class BufferWriterTest {

    public static void main(String[] args) {

        try {

            //构建文件输入输出字符流,如果指定文件不存在,则自动生成。
            FileReader fileReader = new FileReader("E:\\test\\data.txt");
            FileWriter  fileWriter = new FileWriter("E:\\test\\data2.txt");

            //构建过滤缓存流
            BufferedReader bufferedReader = new BufferedReader(fileReader);
            BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);

            //缓存数组
            char[] chars = new char[1024];
            int offset = 0 ;

            //读取字符
            while(bufferedReader.ready()) {
                offset = bufferedReader.read(chars);
            }
            //输出字符
            bufferedWriter.write(chars,0,offset);

            //关闭流
            bufferedWriter.close();
            bufferedReader.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

   3.5格式化输出流(PrinterWriter)

package se.io;

import java.io.FileWriter;
import java.io.FilterWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

public class PrintWriterTest {

    public static void main(String[] args) {

        try {
            //创建文件输出流
            FileWriter fileWriter = new FileWriter("E:\\test\\data3.txt");
            //创建格式化对象输出流
            PrintWriter printWriter = new PrintWriter(fileWriter);

            //写入数据
            printWriter.printf("%1$tY年%1$tm月%1$td日", new Date());
            printWriter.print(123);
            printWriter.print(12.32);
            //关闭流
            printWriter.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
时间: 2024-10-14 05:01:26

java 核心编程——IO流之字符流(三)的相关文章

java 核心编程——IO流之字符流和字节流相互转换(四)

1.为什么字符流和字节流需要转换? 这是因为有一些时候系统给你提供的只有字节流,比如说System.in标准输入流.就是字节流.你想从他那里得到用户在键盘上的输入,只能是以转换流将它转换为Reader以方便自己的程序读取输入.再比如说Socket里的getInputStream()很明显只给你提供字节流,你要不行直接用,就得给他套个InputStreamReader()用来读取.网络传输来的字符. 2.字节流和字符流怎么转换? 2.1.字节流转换为字符流:InputStreamReader 2.

Java IO 字节流与字符流 (三)

Java的IO流分为字符流(Reader,Writer)和字节流(InputStream,OutputStream),字节流顾名思义字节流就是将文件的内容读取到字节数组,然后再输出到另一个文件中.而字符流操作的最小单位则是字符.可以先看一下IO流的概述: 下面首先是通过字符流对文件进行读取和写入: 1 package lib; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileNotFou

JAVA IO 字节流与字符流

文章出自:听云博客 题主将以三个章节的篇幅来讲解JAVA IO的内容 . 第一节JAVA IO包的框架体系和源码分析,第二节,序列化反序列化和IO的设计模块,第三节异步IO. 本文是第一节.       IO框架 从上图我们可以看出IO可以分为两大块 字节流和字符流 字节流是 InputStream 和 OutputStream 分别对应输入与输出 字符流是Reader和Writer分别对应输入与输出        ByteArrayInputStream  它字节数组输入流.继承于InputS

java io流(字符流) 文件打开、读取文件、关闭文件

java io流(字符流) 文件打开 读取文件 关闭文件 //打开文件 //读取文件内容 //关闭文件 import java.io.*; public class Index{ public static void main(String[] args) throws Exception{ //打开文件 //字符流方式打开 //字符流每次按一个字符读取 FileReader wj = new FileReader("D:/java/kj/javanew/src/Index.java"

黑马程序员——Java基础--IO流(一)---字符流和字节流

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.IO流的介绍及体系 IO流用来处理设备之间的数据传输.java对数据的操作是通过流的方式.java用于操作流的对象都在IO包中. 输入流和输出流相对于内存设备而言:将外设中的数据读取到内存中:输入.将内存中的数据写出到外设中:输出. 流按照操作数据分为两种:字节流和字符流. 字符流的由来:其实就是字节流读取文字字节数据后,不直接操作而是先查指定的编码表,获取对应的文字,再对这个文字进行操作

java:I/O 字节流和字符流

字节流 InputStream和OutputStream的子类:FileInputStream 和 FileOutputStream 方法: int read(byte[] b,int off,int len); void write(byte[] b,int off,int len); 字符流 Reader和Writer的子类:FileReader 和 FileWriter 方法: int read(char[] b,int off,int len); void write(char[] b,

io系列之字符流

java中io流系统庞大,知识点众多,作为小白通过五天的视频书籍学习后,总结了io系列的随笔,以便将来复习查看. 本篇为此系列随笔的第一篇:io系列之字符流. IO流 :对数据的传输流向进行操作,java中将这种操作行为本身封装为对象,以供使用. Input and Output java将io流对象都在IO包中.(java.IO.*) 分类: 按照数据种类分: 字节流 和 字符流, 按照数据流向分: 输出流 和 输入流. 字节流抽象类: InputStream OutputStream 字符流

JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习

JAVA之旅(二十四)--I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习 JAVA之旅林林总总也是写了二十多篇了,我们今天终于是接触到了I/O了.如果你初学,不懂IO流,你可以从前往后慢慢看,但是你工作了一段时间你会发现,流的使用场景以及技术点是非常的强硬的,我们势必要掌握这个知识点,如果你觉得翻阅API比较鼓噪,看视频得不到精髓,看书看不到要点,你就跟随我的JAVA之旅,一起去探索吧! 一.I/O概述 I/O全名:Input Output

Java核心编程开发

Java核心编程开发,本部分内容侧重于java j2se核心部分,共50学时左右,主要内容包括:面向对象编程的六大基本原则及常见八种设计模式.Java核心类库的高级应用,如:文件输入输出流处理.反射.序列化.泛型.多线程.网络编程.DOM4J. 课程内容: 01.Java 中使用 IO 实现数据处理(共8讲) 02.Java 中使用XML实现数据处理(共6讲) 03.Java中的多线程编程(共5讲) 04.多线程高级应用(共5讲) 05.Java中的网络编程(共4讲) 06.网络编程高级应用(共