Java基础教程——字符流

字符流

字节流服务文本文件时,可能出现中文乱码。因为一个中文字符可能占用多个字节。
针对于非英语系的国家和地区,提供了一套方便读写方式——字符流。

java.io.Reader
java.io.Writer

文件字符流

|-读文件:FileReader

java.io.FileReader fr = new FileReader("待读取的文件");// 构造时使用默认的字符编码

int 读取单个字符 = fr.read();

char[] cbuf = new char[1024];
int 读取到字符数组中 = fr.read(cbuf);

fr.close();

|-写文件: FileWriter

java.io.FileWriter fw = new FileWriter("要写的文件");

fw.write(71);// 写单个字符

char[] cbuf = {};
fw.write(cbuf);// 写字符数组

fw.write("写字符串");

fw.close();// 字符流和字节流不同,有内置缓冲区。如果不关闭,数据只是保存到缓冲区,未写入文件。

fw.flush();// 可以使用flush可以把缓冲区中的数据强制刷入文件(最后还是应该close)


前面字节流的例子,可以改为字符流测试运行。参考代码:

import java.io.*;
public class 字符流 {
    public static void main(String[] args) throws IOException {
        read();
        write();
    }
    static final int C_CONDITION = 1;
    public static void read() {
        try {
            File file = new File("testRead.dat"); // 创建文件对象
            // 【1】创建输入流对象,相当于打开文件
            FileReader fr = new FileReader(file);
            if (C_CONDITION == 1) {
                // 【2】.read():读取单个
                for (int i = 0; i < file.length(); i++) {
                    int read = fr.read();
                    char ch = (char) read;
                    System.out.print(ch);
                }
                System.out.println();
            } else {
                // 【2】.read(char[] b):
                long len = file.length();
                char[] buf = new char[(int) len];
                fr.read(buf);
                System.out.println(buf);
            }
            // 【3】关闭流
            fr.close();
        } catch (FileNotFoundException fnfe) {
            System.out.println("文件打开失败。");
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
    static void write() {
        File file = new File("文件字节输出流.txt"); // 创建文件对象
        try {
            // (1)构造:通过文件对象创建文件输出流对象
            FileWriter fw = new FileWriter(file);
            // (2)写入文件
            // (2.1)write(int b)
            for (int i = 49; i < 97; i++) {
                fw.write(i);
                fw.write(' ');
            }
            // (2.2)write(char[] b)
            char[] buffer = "I Love Java,你呢?".toCharArray();
            fw.write(buffer);
            // (3)关闭流:如果不关闭,数据只是保存到缓冲区,并未保存到文件。可以使用flush把数据强制刷入文件。
            fw.flush();
            // fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Properties类

package java.util;
public class Properties extends Hashtable<Object,Object>

表示属性集。每个键及其对应值都是一个字符串。

该类应用广泛,比如获取系统属性:

Properties props = System.getProperties();


使用方法:

import java.io.*;
import java.util.Properties;
import java.util.Set;
public class TestProperties {
    public static void main(String[] args) throws IOException {
        // Properties类extends Hashtable,其实就是个map
        Properties prop = new Properties();
        // setProperty:调用的put方法,但参数只允许字符串
        prop.setProperty("金箍棒", "一万三千五百斤");
        prop.setProperty("九齿钉耙", "五千零四十八斤");
        prop.setProperty("降妖宝杖", "五千零四十八斤");
        // stringPropertyNames:调用了keySet()方法
        Set<String> set = prop.stringPropertyNames();
        for (String key : set) {
            // getProperty:调用了get方法
            String value = prop.getProperty(key);
            System.out.println(key + ":" + value);
        }
        // ----------------------------------------------
        // .store存储键值对到文件
        FileWriter fw = new FileWriter("prop.txt");
        // 参数1:字符流(也有字节流的重载版本,不能写中文)
        // 参数2:注释,Unicode编码,不要写中文
        prop.store(fw, "save data");
        // 关闭流
        fw.close();
        // ----------------------------------------------
        // .load从文件读取键值对(k-v)
        prop = new Properties();
        FileReader fr = new FileReader("prop.txt");
        prop.load(fr);
        System.out.println(prop);
        fr.close();
    }
}

原文地址:https://www.cnblogs.com/tigerlion/p/11179224.html

时间: 2024-11-05 21:39:52

Java基础教程——字符流的相关文章

Java基础教程——转换流

转换流 通常,Window默认的编码方式是GBK,Java项目一般建议设为UTF-8编码.这时候读取文件可能出现乱码.事实上实际应用中编码格式不匹配的场景非常多. 转换流可以指定编码方式,用于解决乱码问题. OutputStreamWriter InputStreamReader 字符编码:Character Encoding:自然语言的字符,与二进制数之间的对应规则. 文件流读取时使用的编码方式和文件本身编码方式不同时,会造成读取出来时出现乱码. 字符集 :Charset:系统支持的所有字符的

Java基础教程——缓冲流

缓冲流 "缓冲流"也叫"包装流",是对基本输入输出流的增强: 字节缓冲流: BufferedInputStream , BufferedOutputStream 字符缓冲流: BufferedReader , BufferedWriter 缓冲流的基本原理: 创建流对象时,会创建一个缓冲区数组,通过缓冲区读写,减少系统IO次数,以提高读写效率. 就像送快递,快递小哥一次带一件当然慢,所以用车来运输,跑一趟可以带很多件. 以字符流为例: |-读文件:FileReade

Java基础教程——打印流

打印流 打印流可以把原本输出到控制台的信息输出到文件中.PrintStream是字节打印流(还有个对应的字符打印流是PrintWriter,这里不涉及) System类中有个变量: public final static PrintStream out = null; 赋值处: static { registerNatives(); } 打印流: public class PrintStream extends FilterOutputStream{...} public class Filte

Java基础教程(25)--I/O流

??I/O流表示输入源或输出目标.流可以表示许多不同类型的源和目标,例如磁盘文件.设备.其他程序等. ??流支持许多不同类型的数据,包括字节.原始数据类型.字符和对象等.有些流只传递数据; 有些流则可以操纵和转换数据. ??无论各种流的内部是如何工作的,所有流都提供相同的简单模型:流是一系列数据.程序使用输入流从源头获取数据,一次一项: ??程序使用输出流将数据写入目的地,一次一项: ??在本文中,我们会看到流可以处理各种各样的数据,无论是基本数据还是复杂对象.先来几张IO流的全家福: ??In

Java基础:IO流之字节流和字符流

1. 流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等. 一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL. 流的方向是重要的,根据流的方向,流可分为两类:输入流和输出流.用户可以从输入流中读取信息,但不能写它.相反,对输出流,只能往输入流写,而不能读它. 实际上,流的源端和目的端可简单地看成是字节的生产者和消费

java基础篇IO流的规律

前两篇降了IO流中的字节流和字符流复制的例子,今天来总结一下IO流的规律 掌握好IO流的规律,再开发中会很好用 下面来总结一下: 1,明确源和目的 源:输入流 InputStream 和Reader 目的:输出流 OutputStream 和Writer 2,操作的数据是否是纯文本. 是:使用字符流 不是:使用字节流 3,当体系明确后,在明确要使用哪个具体的对象,通过设备来进行区分 源设备: 内存,硬盘,键盘 目的设备: 内存,硬盘,控制台 这里的源就是你想进行的操作,比如说你想从c盘复制一个文

java基础学习总结——流

永不放弃,一切皆有可能!!! 只为成功找方法,不为失败找借口! java基础学习总结——流 一.JAVA流式输入/输出原理 流是用来读写数据的,java有一个类叫File,它封装的是文件的文件名,只是内存里面的一个对象,真正的文件是在硬盘上的一块空间,在这个文件里面存放着各种各样的数据,我们想读文件里面的数据怎么办呢?是通过一个流的方式来读,咱们要想从程序读数据,对于计算机来说,无论读什么类型的数据都是以010101101010这样的形式读取的.怎么把文件里面的数据读出来呢?你可以把文件想象成一

Java基础教程:JDBC编程

Java基础教程:JDBC编程 快速开始 什么是JDBC JDBC 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库. JDBC API 库包含下面提到的每个任务,都是与数据库相关的常用用法. 制作到数据库的连接. 创建 SQL 或 MySQL 语句. 执行 SQL 或 MySQL 查询数据库. 查看和修改所产生的记录. 从根本上来说,JDBC 是一种规范,它提供了一套完整的接口,允许便携式访问到底层数据库,因此可以用 J

java基础之IO流(一)

java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典型数据源与目标媒介包括磁盘.网络.内存等等. IO流的分类: 按流向分为:输入流和输出流(本地内存为参考) 按处理数据单位:字符流和字节流 按照是否与特定的地方相连(磁盘.网络.内存):节点流和处理流 节点流:可以从或向一个特定的地方(节点)读写数据. 处理流:是对一个已存在的流的连接和封装,通过所