文本数据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 字符 ...
随机推荐
- HDU2767Proving Equivalences tarjan缩点,如何求入度和出度最大值
给定一个有向图,问最少增加多少条边后变成强连通图 tarjan求求强连通分量并缩点,如果强连通分量个数为1,则需要边数为0, 否则为缩点后点入度和出度的最大值, 证明:当入度或者出度不为0时 ...
- HDU - 4370 0 or 1 最短路
HDU - 4370 参考:https://www.cnblogs.com/hollowstory/p/5670128.html 题意: 给定一个矩阵C, 构造一个A矩阵,满足条件: 1.X12+X1 ...
- CodeForces 103D Time to Raid Cowavans 询问分块
Time to Raid Cowavans 题意: 询问 下标满足 a + b * k 的和是多少. 题解: 将询问分块. 将b >= blo直接算出答案. 否则存下来. 存下来之后,对于每个b ...
- CodeForces Round #514 (div2)
A:Cashier 题意:问可以休息多少次. 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen( ...
- codeforces 478 D. Red-Green Towers(背包)
题目链接:http://codeforces.com/problemset/problem/478/D 题意:给出红色方块r个,绿色方块g个,问最高能叠几层等腰三角形,而且每一层的颜色必须相同. 题解 ...
- poj1986 Distance Queries(lca又是一道模版题)
题目链接:http://poj.org/problem?id=1986 题意:就是老问题求val[u]+val[v]-2*val[root]就行.还有这题没有给出不联通怎么输出那么题目给出的数据一定 ...
- Flask源码浅析
前言 学习一样东西,要先知其然,然后知其所以然. 这次,我们看看Flask Web框架的源码.我会以Flask 0.1的源码为例,把重点放在Flask如何处理请求上,看一看从一个请求到来到返回响应都经 ...
- css 元素实际宽高
首先定义一个div. 然后稍微装修一下 下面开始区分 一.clientWidth和clientHeigh . clientTop和clientLeft 1,clientWidth的实际宽度 clien ...
- win、mac 设置 php上传文件大小限制
修改php.ini win平台WAMP修改 步骤 左键点击wamp 选择php 在弹出的窗口中选择php.ini 在打开的文件中进行修改(修改步骤如下) 修改完毕,保存并重启wamp mac MAM ...
- 【Offer】[50-1] 【第一个只出现一次的字符】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 在字符串中找出第一个只出现一次的字符.如输入"abaccdeff",则输出'b'. 牛客网刷题地址 思路分析 可以遍 ...