字符流

只能读写文本文件

Reader 抽象类 字符输出流的父类

Writer 抽象类 字符输出流的父类

字符转换输出流:

OutputStreamWriter(OutputStream out):创建使用默认字符编码的 OutputStreamWriter

OutputStreamWriter(OutputStream out, String charsetName) :创建使用指定字符集的 OutputStreamWriter

案例1:

public class MyTest {
public static void main(String[] args) throws IOException {
//输出流,所关联的文件如果不存在则自动创建
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("a.txt"));
//往文件中写入数据
out.write('你'); //一次写入一个字符
out.write('好');
out.flush(); //字符流要刷新一下
out.write('你'); //一次写入一个字符
out.write('好');
out.write('你'); //一次写入一个字符
out.write('好');
out.flush();
out.write("好好学习天天向上"); //一次写入一个字符串
out.write("好好学习天天向上",0,6); //一次写入字符串的一部分,
out.write("\r\n");//换行
char[] chars = {'a', 'b', 'c', 'd', '爱', '你', '呦'};
out.write(chars); //一次希尔一个字符数组
out.write("\r\n");
out.write(chars,4,3);//一次写入字符数组的一部分
//释放资源
out.close(); //刷新并关闭
}
}

案例2:

public class MyTest2 {
public static void main(String[] args) throws IOException {
//参数2 可以指定码表 GBK UTF-8
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("b.txt",true),"UTF-8");
out.write("我们使用GBK编码写入");
out.write("\r\n");
out.write("我们使用GBK编码写入");
out.write("\r\n");
out.flush();//字符流记得刷新 //释放资源
out.close();
}

字符转换输入流

InputStreamReader(InputStream in): 创建一个使用默认字符集的 InputStreamReader。

InputStreamReader(InputStream in, String charsetName):创建使用指定字符集的 InputStreamReader

案例1:字符转换流读取单个字符

public class MyTest {
public static void main(String[] args) throws IOException {
// InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符
//输入流 所关联的文件,如果不存在就报错
InputStreamReader in = new InputStreamReader(new FileInputStream("c.txt"));
//读取文件中的数据
int ch = in.read(); //一次读取一个字符,如果读取不到返回-1 使用-1 就可以判断文件释放读取完毕
System.out.println((char)ch);
ch = in.read(); //一次读取一个字符
System.out.println((char) ch);
ch = in.read(); //一次读取一个字符
System.out.println((char) ch);
ch = in.read(); in.close();

案例2:字符输入流把字符出租转换成字符串

public class MyTest2 {
public static void main(String[] args) throws IOException {
InputStreamReader in = new InputStreamReader(new FileInputStream("a.txt"));
char[] chars = new char[1024];
int len = in.read(chars); //返回值是读取到的有效字符个数
//方式1:把字符数组转换成字符串
String s = new String(chars, 0, len);
System.out.println(s);
//方式2:把字符数组转换成字符串
String s1 = String.valueOf(chars, 0, len);
System.out.println(s1);
System.out.println("====================================");
char[] chars2 = new char[1024];
InputStreamReader in2 = new InputStreamReader(new FileInputStream("a.txt"));
//一次读取一部分字符,填充到字符数组中
int len2 = in2.read(chars2, 0, 10);
for (char c : chars2) {
System.out.println(c);
}
}
}

案例3:使用字符流一次读取一个字符,写一个字符来复制文本文件

public class MyTest3 {
public static void main(String[] args) throws IOException {
InputStreamReader in = new InputStreamReader(new FileInputStream("MyTest.java")); OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("C:\\Users\\jjh\\Desktop\\a.txt"));
//一次读取一个字符,写一个字符来复制
int len=0;//定义一个变量,来记录读取的字符
while ((len=in.read())!=-1){
out.write(len);
out.flush();
}
//释放资源
in.close();
out.close();
}
}

案例4:使用字符数组充当缓冲区来复制文本文件

public class MyTest4 {
public static void main(String[] args) throws IOException {
InputStreamReader in = new InputStreamReader(new FileInputStream("MyTest.java")); OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("C:\\Users\\ShenMouMou\\Desktop\\b.txt"));
//定义一个字符数组,来充当缓冲区
char[] chars = new char[1000];
//定义一个变量,用来记录读取到的有效字符个数
int len=0;
while ((len=in.read(chars))!=-1){
System.out.println("循环次数");
out.write(chars,0,len);
out.flush();
}
//释放资源
in.close();
out.close();
}
}

便捷字符流

FileReader(File file):在给定从中读取数据的 File 的情况下创建一个新 FileReader

FileReader(String fileName):在给定从中读取数据的文件名的情况下创建一个新 FileReader

FileReader(File file):在给定从中读取数据的 File 的情况下创建一个新 FileReader。

FileReader(String fileName):根据给定的 File 对象构造一个 FileWriter 对象

public class MyTest {
public static void main(String[] args) throws IOException {
//父类-------------------------子类
//OutputStreamWriter-----------FileWriter
//InputStreamReader------------- FileReader
//便捷字符流,的缺点是不能指定编码表,用的是平台默认码表
FileReader in = new FileReader("a.txt");
FileWriter out = new FileWriter("aa.txt"); //定义一个字符数组,来充当缓冲区
char[] chars = new char[1000];
//定义一个变量,用来记录读取到的有效字符个数
int len = 0;
while ((len = in.read(chars)) != -1) {
System.out.println("循环次数");
out.write(chars, 0, len);
out.flush();
}
//释放资源
in.close();
out.close();
}
}

高效的字符流

BufferedReader(Reader in): 创建一个使用默认大小输入缓冲区的缓冲字符输入流

BufferedWriter(Writer out) :创建一个使用默认大小输出缓冲区的缓冲字符输出流

public class MyTest {
public static void main(String[] args) throws IOException {
BufferedReader bfr = new BufferedReader(new InputStreamReader(new FileInputStream("a.txt")));
// BufferedReader bfr2 = new BufferedReader(new FileReader("a.txt"));
// BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("aaa.txt")));
BufferedWriter bfw = new BufferedWriter(new FileWriter("aaaa.txt"));
//以上两种都可以传参 FileReader和FileWriter不能追加而且不能设置码表 只能用平台默认编码表
char[] chars = new char[1000];
int len=0;
while ((len=bfr.read(chars))!=-1){
bfw.write(chars,0,len);
bfw.flush();
} bfw.close();
bfr.close();
}
}

高效字符流的两个特有方法

BufferedReader readLine() :一次读取一行内容

BufferedWriter newLine():写入换行符且具有平台兼容性

案例1:高效字符流采用读取一行写入一行的方式来复制文本文件

public class MyTest2 {
public static void main(String[] args) throws IOException {
BufferedReader bfr = null;
BufferedWriter bfw = null;
bfr = new BufferedReader(new InputStreamReader(new FileInputStream("MyTest.java")));
bfw = new BufferedWriter(new FileWriter("test.java"));
//定义一个变量来记录读取到的每一行
String line = null;
//String s = bfr.readLine();
while ((line = bfr.readLine()) != null) { //注意一行一行的读取,读取不到返回null
bfw.write(line);
//bfw.write("\r\n");
bfw.newLine();//写个换号符
bfw.flush();
}
}
}

字符流的案例演示

案例1:把ArrayList集合中的字符串数据存储到文本文件

public class MyTest {
public static void main(String[] args) throws IOException {
ArrayList<String> list = new ArrayList<>();
list.add("张飞");
list.add("赵云");
list.add("马超");
list.add("关羽");
list.add("黄忠");
BufferedWriter bfw = new BufferedWriter(new FileWriter("name.txt"));
for (String s : list) { //遍历集合
bfw.write(s);
bfw.newLine();
bfw.flush();
}
bfw.close();
}
}

案例2:从文本文件中读取数据(每一行为一个字符串数据) 到集合中,并遍历集合

public class MyTest2 {
public static void main(String[] args) throws IOException {
BufferedReader bfr = new BufferedReader(new FileReader("name.txt"));
ArrayList<String> list = new ArrayList<>();
while (true) {
String s = bfr.readLine();
if (s == null) {
break;
}
list.add(s.trim());//去掉空格
}
System.out.println(list);
}

案例3:从随机名单里面抽取一个人

public class MyTest3 {
public static void main(String[] args) throws IOException {
BufferedReader bfr = new BufferedReader(new FileReader("name.txt"));
ArrayList<String> list = new ArrayList<>();
while (true) {
String s = bfr.readLine();
if (s == null) {
break;
}
list.add(s.trim());
}
//生成一个随机索引
Random random = new Random();
int index = random.nextInt(list.size()); //0----9
System.out.println(index);//打印出索引
System.out.println(list.get(index));//打印出索引所对的人名
}
}

IO流—字符流的更多相关文章

  1. Java IO: 其他字符流(下)

    作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的PushbackReader,LineNumberReader,St ...

  2. Java IO流字符流简介及基本使用

    Java IO流字符流简介及常用字符流的基本使用 字符流分为输入字符流(Writer)和输出字符流(Reader),这两种字符流及其子类字符流都有自己专门的功能.在编码中我们常用的输出字符流有File ...

  3. 【Java基础】【21IO(字符流)&字符流其他内容&递归】

    21.01_IO流(字符流FileReader) 1.字符流是什么 字符流是可以直接读写字符的IO流 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写 ...

  4. java-IO流-字符流-FileReader、FileWriter、自定义小数组的拷贝、BufferedReader、BufferedWriter、readLine()和newLine()方法、LineNumberReader、使用指定的码表读写字符

    ###21.01_IO流(字符流FileReader) * 1.字符流是什么     * 字符流是可以直接读写字符的IO流     * 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要 ...

  5. JavaSE18-字节缓冲流&字符流

    1.字节缓冲流 1.1 字节缓冲流构造方法 字节缓冲流介绍 BufferOutputStream:该类实现缓冲输出流. 通过设置这样的输出流,应用程序可以向底层输出流写 入字节,而不必为写入的每个字节 ...

  6. Java IO之字符流和文件

    前面的博文介绍了字节流,那字符流又是什么流?从字面意思上看,字节流是面向字节的流,字符流是针对unicode编码的字符流,字符的单位一般比字节大,字节可以处理任何数据类型,通常在处理文本文件内容时,字 ...

  7. [Java IO]03_字符流

    Java程序中,一个字符等于两个字节. Reader 和 Writer 两个就是专门用于操作字符流的类. Writer Writer是一个字符流的抽象类.  它的定义如下: public abstra ...

  8. IO流---字符流(FileWriter, FileReader ,BufferedWriter,BufferedReader)

    IO   Input  Output IO流用来处理设备之间的数据传输. java对数据的操作是通过流来实现的. 流按流向分:输入流,输出流     是相对内存而言的.把硬盘的数据读取到内存中就是输入 ...

  9. IO流--字符流与字节流--File类常用功能

    IO流的常用方法: 1: 文件的读取和写入图解: 2:字节流: 读写文件的方法: 一般效率读取: 读取文件:        FileInputStream(); 写数据:            Fil ...

  10. Java IO流-字符流

    2017-11-05 18:34:39 Java中的IO流按数据类型分类分为两种,一是字节流,二是字符流.字符流的出现是为了简化文本数据的读入和写出操作. 如果操作的文件是文本文件,那么使用字符流会大 ...

随机推荐

  1. PHP之面向对象(上)

    PHP 1,定义:动态交互的计算机语言,弱类型语言 静态交互  html  css   js 凡是动态交互的都需要服务器phpstudy 2,使用集成服务器phpstudy apache  服务器 m ...

  2. Centos下安装LoadRunner负载机

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAd0AAADfCAIAAAA84J6GAAAgAElEQVR4nJzb93cbR6In+uK/8v6Fd8

  3. 金蝶BOS元模型分析

    对一些需求变化多样的产品而言,做好可变性设计是非常重要的.国外做得好的有Siebel,国内有金蝶的BOS,实际上金蝶的BOS很多理念跟Siebel是相似的,呵呵...他们都是采用MDD的方式来解决可变 ...

  4. Kubernetes学习之pause容器

    根据代码看到,pause容器运行着一个非常简单的进程,它不执行任何功能,一启动就永远把自己阻塞住了, 它的作用就是扮演PID1的角色,并在子进程称为"孤儿进程"的时候,通过调用wa ...

  5. qtcreator VLD内存检测

    简介 Visual Leak Detector是一款用于Visual C++的免费的内存泄露检测工具.相比较其它的内存泄露检测工具,它在检测到内存泄漏的同时,还具有如下特点: 可以得到内存泄漏点的调用 ...

  6. Shell 编程 正则表达式

    本篇主要写一些shell脚本正则表达式的使用基础. 概述 正则表达式分为基础正则表达式(Regular Expression)与扩展正则表达式(Extended Regular Expression) ...

  7. 《Linux就该这么学》课程完结,强烈推荐

    本书是由全国多名红帽架构师(RHCA)基于最新Linux系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材,目前是国内最值得去读的Linux教材,也是最有价值 ...

  8. Netty实战入门详解——让你彻底记住什么是Netty(看不懂你来找我)

    一.Netty 简介 Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程 ...

  9. 201871010131-张兴盼《面向对象程序设计(java)》第二周学习总结

    项目 内容 <面向对象程序设计(java)> https://home.cnblogs.com/u/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.c ...

  10. 数据库备份 DBS(Database Backup),知识点

    资料 网址 什么是DBS https://help.aliyun.com/document_detail/59133.html?spm=5176.13685554.103.6.3fa463f9CDwW ...