文本数据IO操作--字符流
一、Reader和Writer
1. 字符流原理
Reader是所有字符输入流的父类而Writer是所有字符输出流的父类。字符流是以字符(char)为单位读写数据的。一次处理一个unicode。字符流都是高级流,其底层都是依靠字节流进行读写数据的,所以底层仍然是基于字节读写数据的。
2. 常用方法
Reader的常用方法:
int read()
读取一个字符,返回的int”值低16”位有效。
其实返回的是char 若返回的是-1 则读取到末尾
int read(char[] chs)
从该流中读取一个字符数组length个字符并存入该数组,返回值为实际读取到的字符量。
Writer的常用方法:
void write(int c)
写出一个字符,写出给定int值”低16”位表示的字符。
void write(char[] chs)
将给定字符数组中所有字符写出。
void write(String str)
将给定的字符串写出
void write(char[] chs,int offset,int len):
将给定的字符数组中从offset处开始连续的len个字符写出
二、转换流
1. 字符转换流原理
InputStreamReader:字符输入流, 使用该流可以设置字符集,并按照指定的字符集从流中按照该编码将字节数据转换为字符并读取。
OutputStreamWriter:字符输出流,使用该流可以设置字符集,并按照指定的字符集将字符转换为对应字节后通过该流写出。
2. 指定字符编码
InputStreamReader的构造方法允许我们设置字符集:
InputStreamReader(InputStream in,String charsetName)
基于给定的字节输入流以及字符编码创建ISR
InputStreamReader(InputStream in)
该构造方法会根据系统默认字符集创建ISR
OutputStreamWriter:的构造方法:
OutputStreamWriter(OutputStream out,String charsetName)
基于给定的字节输出流以及字符编码创建OSW
OutputStreamWriter(OutputStream out)
该构造方法会根据系统默认字符集创建OSW
3. 使用InputStreamReader
public void testInput() throws IOException{
FileInputStream fis
= new FileInputStream("demo.txt");
/*
* 这里设置了字符编码为GBK
* 之后再通过ISR读取demo.txt文件时
* 就使用GBK编码读取字符了
*/
InputStreamReader reader
= new InputStreamReader(fis,"GBK");
int c = -1;
while((c = reader.read()) != -1){
System.out.print((char)c);
}
reader.close();
}
4. 使用OutputStreamWriter
public void testOutput() throws IOException{
FileOutputStream fos
= new FileOutputStream("demo.txt");
OutputStreamWriter writer
//这里使用的字符编码为UTF-8
= new OutputStreamWriter(fos,"UTF-8");
String str = "大家好!";//UTF-8中文为3个字节,英文符号占1个字节
writer.write(str);//写出后该文件大小应该为10字节
writer.close();
}
...
实例:
public class TestOutputStreamDemo {
public static void main(String[] args) throws IOException {
/*
* 向文件中按照指定的编码集写出字符串
* helleworld
* 大家好
* 使用UTF-8
*
*/
FileOutputStream fos =new FileOutputStream("osw.txt");
/*
* 不指定字符集 字符输出使用系统默认
*/
//OutputStreamWriter osw =new OutputStreamWriter(fos);
OutputStreamWriter osw =new OutputStreamWriter(fos,"utf-8");
osw.write("helloworld");
osw.write("大家好!");
osw.close();
}
/**
* 使用字符输入流读取一个文本文件
* @author Administrator
*
*/
class TestInputStreamReader{
public static void main(String[] args) throws IOException { FileInputStream fis =new FileInputStream("osw.txt");
InputStreamReader isr = new InputStreamReader(fis, "utf-8"); int d=-1;
while((d=isr.read())!=-1){
char c= (char)d;
System.out.print(c);
}
isr.close();
} }
三、BufferedReader
1. 构建BufferedReader对象
BufferedReader是缓冲字符输入流,其内部提供了缓冲区,可以提高读取效率。
BufferedReader的常用构造方法:
BufferedReader(Reader reader)
例如:
FileInputStream fis
= new FileInputStream("demo.txt");
InputStreamReader isr
= new InputStreamReader(fis);
BufferedReader br
= new BufferedReader(isr);
注:因为BufferedReader在构造实例时需要传入一个字符流,所以当我们想基于一个字节流进行读取时,要先将字节流转换为字符流后方可创建缓冲字符输入流BufferedReader。
2. 使用BR读取一行字符串
BufferedReader提供了一个可以便于读取一行字符串:
String readLine()
该方法连续读取一行字符串,直到读取到换行符为止,返回的字符串中不包含该换行符。若EOF则该方法返回null。
例如:
FileInputStream fis
= new FileInputStream("demo.txt");
InputStreamReader isr
= new InputStreamReader(fis);
BufferedReader br
= new BufferedReader(isr);
String str = null;
while((str = br.readLine()) != null){
System.out.println(str);
}
br.close();
/**
* 使用缓冲字符输入流获取文本文件
* @author Administrator
*
*/ class TestBufferedReaderDemo{
/*
* 1.创建字节流
* 2、创建字符流
* 3.创建缓冲字符流
*/
public static void main(String[] args) throws IOException {
//字节流
FileInputStream fis = new FileInputStream("pw.txt");
// 字符流( 按照给定的编码集转换为字符)
InputStreamReader isf =new InputStreamReader(fis,"utf-8");
//可以以行为单位读取字符串,缓冲流可以提高读取字符串
BufferedReader br =new BufferedReader(isf); String line = null;
/*
*
*/
while((line=br.readLine())!=null){
System.out.println(line); }
}
}
四、 PrintWriter
1. 创建PrintWriter对象
PrintWriter是具有自动行刷新的缓冲该字符输出流。其提供了比较丰富的构造方法:
PrintWriter(File file)
PrintWriter(String fileName)
PrintWriter(OutputStream out)
PrintWriter(OutputStream out,boolean autoFlush)
PrintWriter(Writer writer)
PrintWriter(Writer writer,boolean autoFlush)
其中参数为OutputStream与Writer的构造方法提供了一个可以传入boolean值参数,该参数用于表示PrintWriter是否具有自动行刷新。
2. PrintWriter的重载print和println方法
使用PrintWriter写出字符串时我们通常不使用Writer提供的write()相关方法,而是使用print和println等方法,PrintWriter提供了若干重载的print与println方法,其中println方法是在写出数据后自动追加一个系统支持的换行符。
重载方法有:
void print(int i)//打印整数
void print(char c)//打印字符
void print(boolean b)//打印boolean值
void print(char[] c)//打印字符数组
void print(double d)//打印double值
void print(float f)//打印float值
void print(long l)//打印long值
void print(String str)//打印字符串
注:这些方法还有类似的println方法,参数与上面相同
/**
* 带有自动行刷新的缓冲字符输出流
* @author Administrator
*
*/
class TestPrintWriteDemo{
public static void main(String[] args) throws IOException {
/*
* 将一个字符串写入文本文件
*/
PrintWriter writer =new PrintWriter("pw.txt");
writer.print("helloworld!");
writer.println("hello");
writer.print("world");
writer.println("helloworld!"); writer.close();
}
}
3. 使用PW输出字符数据
FileOutputStream fos
= new FileOutputStream("demo.txt");
OutputStreamWriter osw
= new OutputStreamWriter(fos,"UTF-8");
//创建带有自动行刷新的PW
PrintWriter pw = new PrintWriter(osw,true);
pw.println("大家好!");
pw.close();
/**
* 使用指定字符集并带有自动行刷新
* @author Administrator
*
*/
class TestPrintWriteDemo2{
public static void main(String[] args) throws IOException {
FileOutputStream fos =new FileOutputStream("pw.txt"); //将字符转换为字节
OutputStreamWriter osw =new OutputStreamWriter(fos);
//提高写效率,可以以行为单位写出字符串
PrintWriter pw =new PrintWriter(osw,true);
/*
* 当PrintWrite带有自动行刷新
* 每当我们调用println方法写出字符串,都会自动的Flush
*/
pw.print("大家好!");
pw.println("呵呵");
pw.println("拜拜!");
pw.close();
}
}
public class TestCopy {
public static void main(String[] args) throws IOException {
/*
* 1、读取原文件
* 2、向目标文件写
* 使用缓冲流按行读取
*/
FileInputStream fos =new FileInputStream("src"+File.separator+"day430"+File.separator+"TestCopy.java");
//转换为字符输入流
InputStreamReader isr =new InputStreamReader(fos);
//按行为单位读取字符串
BufferedReader br =new BufferedReader(isr);
PrintWriter pw = new PrintWriter("copy.java");
String line =null;
while((line=br.readLine())!=null){
pw.print(line);
}
pw.close();
br.close();
}
}
文本数据IO操作--字符流的更多相关文章
- JAVASE02-Unit08: 文本数据IO操作 、 异常处理
Unit08: 文本数据IO操作 . 异常处理 * java.io.ObjectOutputStream * 对象输出流,作用是进行对象序列化 package day08; import java.i ...
- Day03:文本数据IO操作 / 异常处理
文本数据IO操作 Reader和Writer 字符流原理 Reader是字符输入流的父类 Writer是字符输出流的父类. 字符流是以字符(char)为单位读写数据的.一次处理一个unicode. ...
- JAVASE02-Unit07: 基本IO操作 、 文本数据IO操作
基本IO操作 . 文本数据IO操作 java标准IO(input/output)操作 package day07; import java.io.FileOutputStream; import ja ...
- [Java IO]03_字符流
Java程序中,一个字符等于两个字节. Reader 和 Writer 两个就是专门用于操作字符流的类. Writer Writer是一个字符流的抽象类. 它的定义如下: public abstra ...
- Java IO: 其他字符流(下)
作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的PushbackReader,LineNumberReader,St ...
- AI学习---数据IO操作&神经网络基础
数据IO操作 TF支持3种文件读取: 1.直接把数据保存到变量中 2.占位符配合feed_dict使用 3. QueueRunner(TF中特有的) 文件读取流程 文件读取流程(多线 ...
- Java IO之字符流和文件
前面的博文介绍了字节流,那字符流又是什么流?从字面意思上看,字节流是面向字节的流,字符流是针对unicode编码的字符流,字符的单位一般比字节大,字节可以处理任何数据类型,通常在处理文本文件内容时,字 ...
- java IO之 字符流 (字符流 = 字节流 + 编码表) 装饰器模式
字符流 计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此, 从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符 层次的编码和解码.列如,在 ...
- Java——文件操作字符流和字节流的区别
转:http://blog.csdn.net/joephoenix/articles/2283165.aspx java的IO流分两种流 字节流 InputStream OutputStream 字符 ...
随机推荐
- ZOJ4027 Sequence Swapping DP
link:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4027 题意: 有一个括号序列,每个括号对应一个值,现在可以使得相 ...
- P1726 上白泽慧音 tarjan 模板
P1726 上白泽慧音 这是一道用tarjan做的模板,要求找到有向图中最大的联通块. #include <algorithm> #include <iterator> #in ...
- poj1273 Drainage Ditches (最大流板子
网络流一直没学,来学一波网络流. https://vjudge.net/problem/POJ-1273 题意:给定点数,边数,源点,汇点,每条边容量,求最大流. 解法:EK或dinic. EK:每次 ...
- CodeForces 55D Beautiful numbers(数位dp+数学)
题目链接:http://codeforces.com/problemset/problem/55/D 题意:一个美丽数就是可以被它的每一位的数字整除的数. 给定一个区间,求美丽数的个数. 显然这是一道 ...
- 前端利器躬行记(4)——webpack进阶
webpack是一个非常强大的工具,除了前文所介绍的基础概念之外,还有各种进阶应用,例如Source Map.模块热替换.集成等,本文会对这些内容做依次讲解. 一. runtime和manifest ...
- Request请求的应用
1.通过request获得请求行 获得客户端的请求方式:String getMethod() 获得请求的资源: String getRequestURI() StringBuffer getReq ...
- jQuery - 03. each、prevaAll、nextAll、获取属性、修改属性attr/val/text()、jq.height/width、offset()./position()./scrol Left/Top 、事件绑定bind、delegate、on、事件解绑、事件对象、多库共存
each 方法 $ ( selector).each(function( index,element) { } ); 参数一表示当前元素在所有匹配元素中的索引号 参数二表示当前元素(DOM对象) ...
- mysql之innodb存储引擎介绍
一.Innodb体系架构 1.1.后台线程 后台任务主要负责刷新内存中的数据,保证缓冲池的数据是最近的数据,此外还将修改的数据刷新到文件磁盘,保证在数据库发生异常的情况下Innodb能恢复到正常的运行 ...
- React Hooks 你不来了解下?
前言 最近在看 React 的新语法-- React Hooks,只能一句话概括:React 语法真的是越来越强大,越写代码越少. 强烈推荐还没看 React Hooks 的同学去学习下,这会让你写r ...
- ubuntu下配置JDK,Eclipse,android开发环境
前言:由于我的电脑是64位的,所以下面使用的jdk ; eclipse : 包括我安装的 ubuntu12.0.4LTS 都是64位的:如果你是32位请下载32位的系统以及jdk,eclipse等软件 ...