字符流

字节流服务文本文件时,可能出现中文乱码。因为一个中文字符可能占用多个字节。

针对于非英语系的国家和地区,提供了一套方便读写方式——字符流。

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();
}
}

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

  1. Java基础教程——转换流

    转换流 通常,Window默认的编码方式是GBK,Java项目一般建议设为UTF-8编码.这时候读取文件可能出现乱码.事实上实际应用中编码格式不匹配的场景非常多. 转换流可以指定编码方式,用于解决乱码 ...

  2. Java基础教程——缓冲流

    缓冲流 "缓冲流"也叫"包装流",是对基本输入输出流的增强: 字节缓冲流: BufferedInputStream , BufferedOutputStream ...

  3. Java基础教程——打印流

    打印流 打印流可以把原本输出到控制台的信息输出到文件中.PrintStream是字节打印流(还有个对应的字符打印流是PrintWriter,这里不涉及) System类中有个变量: public fi ...

  4. java基础之IO流(二)之字符流

    java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...

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

    1. 流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等. 一个流,必有源端和目的端 ...

  6. Java基础教程:面向对象编程[3]

    Java基础教程:面向对象编程[3] 内容大纲 基础编程 获取用户输入 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入.我们可以查看Ja ...

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

    一.I/O流   I/O流表示输入源或输出目标.流可以表示许多不同类型的源和目标,例如磁盘文件.设备.其他程序等.   流支持许多不同类型的数据,包括字节.原始数据类型.字符和对象等.有些流只传递数据 ...

  8. Java基础教程(5)--变量

    一.变量 1.变量的定义   正如上一篇教程<Java基础教程(4)--面向对象概念>中介绍的那样,对象将它的状态存在域中.但是你可能仍然有一些疑问,例如:命名一个域的规则和惯例是什么?除 ...

  9. Java基础教程:面向对象编程[2]

    Java基础教程:面向对象编程[2] 内容大纲 访问修饰符 四种访问修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java 支持 4 种不同的访问权限. default ...

随机推荐

  1. 【总结】rabbitmq

    一.rabbitmq基础 1.简介 RabbitMQ是使用Erlang语言来编写的,并且RabbitMQ是基于AMQP协议的.Erlang语言在数据交互方面性能优秀,有着和原生Socket一样的延迟, ...

  2. 【转载】HPL与HPCG测试(一)

    来源:HPL与HPCG测试 (一) 一.HPL与HPCG 简介 1.HPL HPL 即 High Performance Linpack,它是针对现代并行计算集群的测试工具.用户不修改测试程序,通过调 ...

  3. STM32入门系列-STM32时钟系统,自定义系统时钟

    在时钟树的讲解中我们知道,通过修改PLLMUL中的倍系数值(2-16)可以改变系统的时钟频率.在库函数中也有对时钟倍频因子配置的函数,如下: void RCC_PLLConfig(uint32_t R ...

  4. k8s中pod的yaml文件全面解读

    apiVersion: v1 #必选,版本号,例如v1,版本号必须可以用 kubectl api-versions 查询到 . kind: Pod #必选,Pod metadata: #必选,元数据 ...

  5. java常用类——包装类

    八种基本数据类型对应八种包装类和它们的继承关系 基本数据类型 对应的包装类 boolean Boolean byte Byte short Short int Integer long Long ch ...

  6. 仅用六种字符来完成Hello World,你能做到吗?

    Hello World 对于每一个开发者来说都不陌生,因为在我们学习任何一个语言或框架的时候,都会有一个Hello World的案例来帮助我们快速入门. 如果我们使用JavaScript来输出Hell ...

  7. ELK搭建以及运行和ElasticStarch的详细使用(7.X版本之上)

      ELK初体验     1.官网   https://www.elastic.co/cn/downloads/elasticsearch   2.需要安装JDK   ElasticSearch 是一 ...

  8. 1到n整数中1出现的次数

    1到n整数中1出现的次数 题目描述 输入一个整数n, 求1~n这n个整数的十进制表示中1出现的次数. 例如, 输入12, 1~12这些整数中包含1的数字有1, 10, 11和12, 1一共出现了4次 ...

  9. 如何将别人Google云端硬盘中的数据进行保存

    查了好久终于知道! 如何将别人Google云端硬盘中的数据进行copy,而不是右键发现只有添加快捷方式 只要shift+z就可以保存了! 之后等我弄清楚怎么将别人家的云盘中的数据集导到colab再来详 ...

  10. Js中函数声明和函数表达式的区别

    先看以下几段烧脑的代码: f();//=>? var f = function () { console.log("var"); } function f() { conso ...