打开一个文本文件,另存为:

Ansi就是系统默认编码(就是gbk)

建一个编码是utf-8的txt文件,

例:

import java.io.FileWriter;
import java.io.IOException;
public class Demo01 {
public static void main(String[] args) throws IOException {
//确定目的地
FileWriter fw=new FileWriter("E:\\zyx\\java\\utf-8.txt",true);
//写入目的地
fw.write("你好");
//释放资源
fw.close();
}
}

所以字符流无法实现utf-8编码格式文件的读和写。

如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者OutputStreamWriter。

1 OutputStreamWriter类

OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节。它的作用的就是,将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去。

1.1继承体系

1.2原理

在OutputStreamWriter流中维护自己的缓冲区,当调用OutputStreamWriter对象的write方法时,会拿着字符到指定的码表中进行查询,把查到的字符编码值转成字节数存放到OutputStreamWriter缓冲区中。然后再调用刷新功能,或者关闭流,或者缓冲区存满后会把缓冲区中的字节数据使用字节流写到指定的文件中。

1.3构造方法

只支持utf-8和gbk这两个码表

OutputStreamWriter是一个字符流,所以字符流的方法都能用

例:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class Demo02 {
public static void main(String[] args) throws IOException {
//指定目的地
FileOutputStream fos=new FileOutputStream("E:\\zyx\\java\\utf-8.txt",true); //续写
//创建转换流
OutputStreamWriter osw=new OutputStreamWriter(fos,"utf-8");
//写入
osw.write("你好你好");
//刷新数据
osw.flush();
//释放资源:(new了谁关谁,先开的先关)
osw.close();
fos.close();
}
}

注意:释放资源时,new了谁关谁,先开的后关

gbk例子:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class Demo03 {
public static void main(String[] args) throws IOException {
//指定目的地
FileOutputStream fos=new FileOutputStream("E:\\zyx\\java\\gbk.txt",true); //续写
//创建转换流
OutputStreamWriter osw=new OutputStreamWriter(fos,"gbk");
//写入
osw.write("你好,java");
//osw.flush();
//释放资源
osw.close();
fos.close();
}
}

 

注意:gbk和utf-8不区分大小写,可以写成GBK

2 InputStreamReader类

utf-8是三个字节代表一个汉字,直接用Filereader不能读

InputStreamReader 是字节流通向字符流的桥梁:它使用指定的字符编码表读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

2.1继承体系

2.2构造方法

例:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class Demo04 {
public static void main(String[] args) throws IOException {
//获取数据源
FileInputStream fis=new FileInputStream("E:\\zyx\\java\\utf-8.txt");
//创建转换流
InputStreamReader isr=new InputStreamReader(fis,"utf-8");
//开始读取
int len=0;
while((len=isr.read())!=-1){
System.out.print((char)len);
}
//释放资源
isr.close();
fis.close();
}
}

改成gbk是这样:

用字符数组读gbk的文件

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class Demo05 {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("E:\\zyx\\java\\gbk.txt");
InputStreamReader isr=new InputStreamReader(fis);
char[] ch=new char[24];
int len=0;
while((len=isr.read(ch))!=-1){
System.out.print(new String(ch,0,len));
}
isr.close();
fis.close();
}
}

3 转换流和子类区别

发现有如下继承关系:

OutputStreamWriter:

|--FileWriter:

InputStreamReader:

|--FileReader;

父类和子类的功能的区别:

1)OutputStreamWriter和InputStreamReader是字符和字节的桥梁:也可以称之为字符转换流。字符转换流原理:字节流+编码表。

2)FileWriter和FileReader:作为子类,仅作为操作字符文件的便捷类存在。当操作的字符文件,使用的是默认编码表时可以不用父类,而直接用子类就完成操作了,简化了代码。

  InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//默认字符集。

  InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"GBK");//指定GBK字符集。

  FileReader fr = new FileReader("a.txt");

  这三句代码的功能是一样的,其中第三句最为便捷。

3)一旦要指定其他编码时,绝对不能用子类,必须使用字符转换流。

4)用子类的条件:

  1、操作的是文件。2、使用默认编码。

总结:

字节--->字符 : 看不懂的--->看的懂的。  需要读。输入流。 InputStreamReader

字符--->字节 : 看的懂的--->看不懂的。  需要写。输出流。 OutputStreamWriter

4缓冲流

读取数据量大的文件时,读取的速度会很慢,很影响程序的效率。

Java中提高了一套缓冲流,它的存在,可提高IO流的读写速度。

缓冲流,根据流的分类分类字节缓冲流与字符缓冲流。

4.1字节缓冲流

字节缓冲流根据流的方向,共有2个

写入数据到流中,字节缓冲输出流 BufferedOutputStream

读取流中的数据,字节缓冲输入流 BufferedInputStream

它们的内部都包含了一个缓冲区,通过缓冲区读写,就可以提高了IO流的读写速度

缓冲区就是一个容器

4.1.1构造方法

例:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class Demo06 {
public static void main(String[] args) throws IOException {
method02();
} //字节输出缓冲流
public static void method01() throws IOException{
//明确目的地
FileOutputStream fos=new FileOutputStream("E:\\zyx\\java\\demo.txt");
//加缓冲流
BufferedOutputStream bos=new BufferedOutputStream(fos);
bos.write(100);
bos.close();
//fos.close(); //可以不加,bos会自动关上fos
} //字节输入缓冲流
public static void method02() throws IOException{
//明确数据源
FileInputStream fis=new FileInputStream("E:\\zyx\\java\\demo.txt");
//加缓冲流
BufferedInputStream bis=new BufferedInputStream(fis);
int len=0;
while((len=bis.read())!=-1){
System.out.println((char)len);
}
bis.close();
}
}

4.1.2复制比较示例

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException; public class Demo07 {
public static void main(String[] args) throws IOException {
copy02();
} //单个字节文件复制
public static void copy01() throws IOException{
//明确数据源
FileInputStream fis=new FileInputStream("E:\\zyx\\java\\tomcat.zip");
//明确目的地
FileOutputStream fos=new FileOutputStream("E:\\zyx\\java\\a\\tomcat.zip");
//开始复制
long time1=System.currentTimeMillis();
int len=0;
while((len=fis.read())!=-1){
fos.write(len);
}
long time2=System.currentTimeMillis();
System.out.println(time2-time1);
fis.close();
fos.close();
} //单个字节,字节缓冲流复制
public static void copy02() throws IOException{
//明确数据源
FileInputStream fis=new FileInputStream("E:\\zyx\\java\\tomcat.zip");
BufferedInputStream bis=new BufferedInputStream(fis);
//明确目的地
FileOutputStream fos=new FileOutputStream("E:\\zyx\\java\\a\\tomcat.zip");
BufferedOutputStream bos=new BufferedOutputStream(fos);
//开始复制
long time1=System.currentTimeMillis();
int len=0;
while((len=bis.read())!=-1){
bos.write(len);
}
long time2=System.currentTimeMillis();
System.out.println(time2-time1);
bis.close();
bos.close();
//System.out.println(system.in);
}
}

copy01()结果:

copy02()结果:

4.1.3用字节数组方式复制的比较

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class CopyTest {
public static void main(String[] args) throws IOException {
copy01();
} //普通流复制
public static void copy01() throws IOException{
//指定数据源
FileInputStream fis=new FileInputStream("E:\\zyx\\java\\eclipse.zip");
//指定目的地
FileOutputStream fos=new FileOutputStream("E:\\zyx\\java\\e\\eclipse.zip");
//复制
long start=System.currentTimeMillis();
int len=0;
byte[] bys=new byte[1024];
while((len=fis.read(bys))!=-1){
fos.write(bys);
}
long end=System.currentTimeMillis();
System.out.println(end-start);
fis.close();
fos.close();
} //缓冲流复制
public static void copy02() throws IOException{
//指定数据源
FileInputStream fis=new FileInputStream("E:\\zyx\\java\\eclipse.zip");
BufferedInputStream bis=new BufferedInputStream(fis);
//指定目的地
FileOutputStream fos=new FileOutputStream("E:\\zyx\\java\\f\\eclipse.zip");
BufferedOutputStream bos=new BufferedOutputStream(fos);
long start=System.currentTimeMillis();
int len=0;
byte[] bys=new byte[1024];
while((len=bis.read(bys))!=-1){
bos.write(bys);
}
long end=System.currentTimeMillis();
System.out.println(end-start);
bis.close();
bos.close();
}
}

结果比较:

5字符缓冲流

字符缓冲输入流 BufferedReader

字符缓冲输出流 BufferedWriter

完成文本数据的高效的写入与读取的操作

5.1 BufferedWriter

\r\n换行:

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException; public class Test {
public static void main(String[] args) throws IOException {
//明确日的地
FileWriter fw=new FileWriter("E:\\zyx\\java\\demo01.txt");
//添加缓冲流
BufferedWriter bw=new BufferedWriter(fw); //会自动关闭fw
//写入文件
bw.write("你好\r\n");
bw.flush();
fw.write("java\r\n");
bw.flush();
bw.write("中国\r\n");
bw.close(); //会自动关闭fw
}
}

newLine() 方法:

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException; public class Test {
public static void main(String[] args) throws IOException {
//明确日的地
FileWriter fw=new FileWriter("E:\\zyx\\java\\demo01.txt");
//添加缓冲流
BufferedWriter bw=new BufferedWriter(fw); //会自动关闭fw
//写入文件
bw.write("你好");
bw.newLine();
bw.flush();
fw.write("java");
bw.newLine();
bw.flush();
bw.write("中国");
bw.newLine();
bw.close(); //会自动关闭fw
}
}

Tips:

\r\n是windows的换行

Linux是\n

5.2字符缓冲输入流 BufferedReader

方法public String readLine() 读取一个文本行,包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回null

例:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException; public class Test {
public static void main(String[] args) throws IOException {
// 明确数据源
FileReader fr = new FileReader("E:\\zyx\\java\\demo01.txt");
// 添加缓冲流
BufferedReader br = new BufferedReader(fr);
// 读取
String line = "";
int lineNum = 0; // 加个行号
while ((line = br.readLine()) != null) {
lineNum++;
System.out.println(lineNum + " " + line);
}
fr.close();
}
}

Tips:

readLine()不会把换行符读出来

可以手动加一个行号

5.3复制文本文件比较

6流的操作规律

IO流中对象很多,解决问题(处理设备上的数据时)到底该用哪个对象呢?  

把IO流进行了规律的总结(四个明确):

明确一:要操作的数据是数据源还是数据目的。

源:InputStream    Reader

目的:OutputStream Writer

先根据需求明确要读,还是要写。

明确二:要操作的数据是字节还是文本呢?

源:

字节:InputStream

文本:Reader

目的:

字节:OutputStream

文本:Writer

已经明确到了具体的体系上。

明确三:明确数据所在的具体设备。

源设备:

硬盘:文件  File开头。

内存:数组,字符串。

键盘:System.in;

网络:Socket

目的设备:

硬盘:文件  File开头。

内存:数组,字符串。

屏幕:System.out

网络:Socket

完全可以明确具体要使用哪个流对象。

明确四:是否需要额外功能呢?

额外功能:

转换吗?转换流。InputStreamReader OutputStreamWriter

高效吗?缓冲区对象。BufferedXXX

InputStream

FileInputStream

BufferedInputStream

OuputStream

FileOutputStream

BufferedOuputStream

Writer

OutputStreamWriter

FileWriter

BufferedWriter

Reader

InputStreamReader

FileReader

BufferedReader

IO流----转换流、缓冲流的更多相关文章

  1. Java IO流之【缓冲流和文件流复制文件对比】

    与文件流相比,缓冲流复制文件更快 代码: package Homework; import java.io.BufferedOutputStream; import java.io.File; imp ...

  2. File类与常用IO流第八章——缓冲流

    第八章.缓冲流 缓冲流概述 缓冲流,也叫高效流,是对4个基本的FileXxx流的增强.按照数据类型分为4类:   输入缓冲流 输出缓冲流 字节缓冲流 BufferedInputStream Buffe ...

  3. 01 语言基础+高级:1-8 File类与IO流_day10【缓冲流、转换流、序列化流】

    day10[缓冲流.转换流.序列化流] 主要内容 缓冲流 转换流 序列化流 打印流 教学目标 能够使用字节缓冲流读取数据到程序 能够使用字节缓冲流写出数据到文件 能够明确字符缓冲流的作用和基本用法 能 ...

  4. Java—转换流、字符缓冲流

    转换流 OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节.它的作用的就是,将字符串按照指定的编码表转成字节,在使用字节流将这些字节写 ...

  5. Java IO流之字符缓冲流

    字符流: 1.加入字符缓存流,增强读取功能(readLine) 2.更高效的读取数据 BufferedReader 从字符输入流读取文本,缓冲各个字符,从而实现字符.数组和行的高效读取. FileRe ...

  6. java IO流之三 使用缓冲流来读写文件

    原文:http://blog.csdn.net/haluoluo211/article/details/52183219 一.通过BufferedReader和BufferedWriter来读写文件 ...

  7. 10.4 缓冲流 BufferedReader & BufferedWriter & 缓冲流特殊功能readLine

    缓冲流和正常流的使用大致相同,缓冲流效率更高. package day10_io_fileWrite_Read.buffer_stream; import java.io.*; /* * Buffer ...

  8. 使用文件流与使用缓冲流完成文件的复制操作性能对比,文件流 FileInputStream FileOutputStream 缓冲流: BufferedInputStream BufferedOutputStream

    package seday06; import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOExc ...

  9. Java字节缓冲流和字符缓冲流学习

    1.字节缓冲流 首先要明确一个概念:对文件或其他目标频繁的读写操作,效率低,性能差. 使用缓冲流的好处是,能够高效的读写信息,原理是将数据先缓冲起来,然后一起写入或者读取出来. BufferedInp ...

  10. IO流(File类--递归--过滤器--IO字节流--IO字符流--Properties集合--缓冲流--转换流--序列化流--打印流)

    一.File类 1.1概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 1.1.1相对路径与绝对路径 相对路径从盘符开始的路径,这是一个完整 ...

随机推荐

  1. 洛谷【P3437】[POI2006]TET-Tetris 3D

    浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 浅谈标记永久化:https://www.cnblogs.com/AKMer/p/1013 ...

  2. HDU3991:Black and White

    浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:http://acm.hdu.edu.cn/showproblem.php? ...

  3. 国标28181sip开源库介绍(陆续补充完备)

    (1)osip一个基于 osip 库的 UAC 和 UAS 的代码整理http://blog.csdn.net/aflyeaglenku/article/details/51601270(2)pjsi ...

  4. Linux命令总结_touch创建文件

    1.touch命令,用来创建文件或者修改文件时间戳 格式:touch [选项]... 文件... 选项 : -a   或--time=atime或--time=access或--time=use  只 ...

  5. [poj1741]Tree(点分治+容斥原理)

    题意:求树中点对距离<=k的无序点对个数. 解题关键:树上点分治,这个分治并没有传统分治的合并过程,只是分成各个小问题,并将各个小问题的答案相加即可,也就是每层的复杂度并不在合并的过程,是在每层 ...

  6. Java&nbsp;keytool命令说明

    Java keytool命令说明 Java 中的 keytool.exe (位于 JDK\Bin 目录下)可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中 ...

  7. IIS PHP的Loaded Configuration File为空解决[转]

    在Windows Server 2003上,IIS配置支持PHP,发现PHP扩展未加载,phpinfo()查看,显示 Configuration File (php.ini) Path (none) ...

  8. 4-数组、指针与字符串1.3-this指针

    this指针时一个隐含于每一个类的成员函数中的特殊指针(包括构造函数和析构函数),它用于指向正在被成员函数操作的对象. this指针明确地指出了成员函数当前所操作的数据所属的对象.实际过程是,当通过一 ...

  9. CodeForces - 633D Fibonacci-ish 大数标记map+pair的使用

    Fibonacci-ish Yash has recently learnt about the Fibonacci sequence and is very excited about it. He ...

  10. 在UI程序设计中使用BackgroundWorker进行多线程异步处

    WinForm的应用程序中如果执行了一个的非常冗长的处理操作,(比如文件检索,大运算量计算),在执行时就会锁定用户界面,虽然主活动窗口还在运行,但用户无法与程序交互,无法移动窗体或改变窗体大小,导致程 ...