字符流

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

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

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. 技术选型:为什么批处理我们却选择了Flink

    最近接手了一个改造多平台日志服务的需求,经过梳理,我认为之前服务在设计上存在缺陷.经过一段时间的技术方案调研,最终我们决定选择使用 Flink 重构该服务. 目前重构后的服务已成功经受了国庆节流量洪峰 ...

  2. Shell脚本实现----Kubernetes单集群二进制部署

     Shell脚本实现----Kubernetes单集群二进制部署   搭建Kubernetes集群环境有以下三种方式: 1. Minikube安装方式Minikube是一个工具,可以在本地快速运行一个 ...

  3. uniapp微信小程序canvas隐藏

    HTML 我是把canvas嵌套在view里并被view设置id <view id="canvas"> <canvas style="width: 35 ...

  4. Centos中部署NetCore项目(二)

    前言 在centos中部署程序,一般都不会是使用控制台进程直接启动,或者是后台运行.而是一些守护进程管理工具进行管理,例如supervisor. 部署Web相关程序,使用nginx是比较普遍的, 安装 ...

  5. Centos7系统kvm虚机忘记密码进不去, 通过宿主机修改/etc/shadow文件改密码,重启后系统起不来故障排错

    问题描述 某天, 因为其他项目组交接问题, kvm里面的堡垒机系统用户root密码登录不上,然后他通过宿主机修改/etc/shadow文件修改密码,但是修改完后重启系统后发现kvm宿主机连接不上虚机了 ...

  6. 在Linux下安装C++的OpenCV 3

    最近在看<学习OpenCV3>这本书,所以记录下我在ubuntu16.4下搭建C++版本OpenCV 3.4.5的过程.首先请确保cuda,gcc, g++都安装好了,我这里是cuda 1 ...

  7. waf 引擎 云原生平台tproxy 实现调研

    了解了基本 云原生架构,不清楚的查看之前的文章:https://www.cnblogs.com/codestack/p/13914134.html 现在来看看云原生平台tproxy waf引擎串联实现 ...

  8. linux tcp/ip 参数解析

    后面整理相关信息/* *     TCP option lengths */#define TCPOLEN_MSS            4 //只能出现在SYN段中#define TCPOLEN_W ...

  9. git连接gitlab下载项目代码

    1.安装git 2.鼠标右键git bash here 3.命令行界面输入生成公钥命令 ssh-keygen -t rsa -C'gitlab用户名' 然后一直按enter键下一步生成公钥即可' 4. ...

  10. hashlib模块(摘要算法)

    hashlib(1) # hashlib模块 # 现在写登录认证的时候,需要保存用户名和密码,用户名和密码是保存在文件中,并且都是明文,一旦丢了就完蛋了.所以 # 可以用hashlib将密码转换成密文 ...