一、处理流:

增强功能,提供性能,在节点流之上。

二、节点流与处理流的关系

节点流(字节流、字符流)处于IO操作的第一线,所有操作必须通过它们进行;

处理流可以对其他流进行处理(提高效率或操作灵活性)。

三、缓冲流

1、字节缓冲流

BufferedInputStream

BufferedOutputStream

package IOBuffer;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

/**

* 处理流(字节缓冲流)

* 字节流文件拷贝+缓冲流,提高性能

* 缓冲流(节点流)

*/

@SuppressWarnings("all")

public class Demo01 {

public static void main(String[] args) {

String srcPath = "G:/1314.jpg";

String destPath = "G:/try/520.jpg";

try {

copyFile(srcPath,destPath);

} catch (IOException e) {

e.printStackTrace();

}

}

public static void copyFile(String srcPath,String destPath) throws IOException

{

//1、建立联系  源存在(且为文件)+目的地(文件可以不存在)

File src = new File(srcPath);

File dest = new File(destPath);

if(!src.isFile())

{

System.out.println("只能拷贝文件");

throw new IOException("只能拷贝文件");

}

//2、选择流 缓冲流(字节输入流)

InputStream is = new BufferedInputStream(new FileInputStream(src));

OutputStream os =new BufferedOutputStream(new FileOutputStream(dest)) ;

//3、文件拷贝  循环+读取+写出

byte[] flush = new byte[1024];

int len = 0;

while(-1!=(len = is.read(flush)))

{

//写出

os.write(flush,0,len);

}

os.flush();//强制刷出

//关闭流 先打开后关闭

os.close();

is.close();

}

}

2、字符缓冲流

BufferedReader  新增readLine()读取一个文本行。

BufferedWriter  新增newLine()写入一个行分隔符。

package IOBuffer;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

/**

*

* 字符缓冲流+新增方法(不能发生多态)

*/

public class Demo02 {

public static void main(String[] args) {

String srcPath = "G:/oo.txt";

String destPath = "G:/xx.txt";

//创建源

File src = new File(srcPath);

File dest = new File(destPath);

//选择流   缓冲流   如果后面要使用新增方法,就不能使用多态了。

//如果没有使用子类的新增方法,可以使用多态方式。

/*Reader reader = null;

Writer writer = null;

reader =new BufferedReader(new FileReader(src)) ;

writer = new BufferedWriter(new FileWriter(dest));

reader.read(flush)

writer.write(flush,0,len)*/

BufferedReader reader = null;

BufferedWriter writer = null;

try {

reader =new BufferedReader(new FileReader(src)) ;

writer = new BufferedWriter(new FileWriter(dest));

//读取操作

//新增方法操作的字符缓冲流

String line = null;//一行一行读取 BufferedReader新增readLine()

while(null!=(line = reader.readLine()))

{

writer.write(line);

//writer.append("\r\n");//换行符

writer.newLine();//换行符  新增方法

}

writer.flush();

} catch (FileNotFoundException e) {

e.printStackTrace();

System.out.println("文件不存在");

} catch (IOException e) {

e.printStackTrace();

}

finally

{

if(null!=reader)

{

try {

writer.close();

reader.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

}

四、转换流

(一)字节流转换为字符流,处理乱码(编码集、解码集)

解码:二进制–>解码字符集–>字符

编码:字符–>编码字符集–>二进制

(二)为什么会出现乱码?

1、解码与MT4登录真实账户教程编码的字符集不统一

2、字节缺少,长度丢失

(三)文件乱码(通过转换流进行处理)

package IOConver;

import java.io.UnsupportedEncodingException;

public class Demo01 {

public static void main(String[] args) {

test01();

System.out.println("-----------");

test02();

}

//解码与编码字符集字符集必须相同

public static  void test01()

{

//解码byte-->char

String str = "中国";//UTF-8

//编码 char-->byte

byte[] data = str.getBytes();

//编码与解码的字符集统一

System.out.println(new String(data));

try {

data  = str.getBytes("gbk");//设定编码字符集    编码

//不统一字符集,出现乱码

System.out.println(new String(data));//解码

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

byte[] data2;

try {

//编码

data2 = "中国".getBytes("GBK");

//解码

str = new String(data2,"GBK");

//str = new String(data2);//不指定 默认解码UTF-8 会出现乱码

System.out.println(new String(str));

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

}

//字节缺少,长度丢失

public static  void test02(){

String str = "中国";

byte[] data;

data = str.getBytes();//编码

//字节数不完整

System.out.println(new String(data,0,4));

}

}

运行结果:

�й�

中国

-----------

中�

package IOConver;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

/**

* 转换流:字节转为字符

* 1、输出流OutputStreamWriter  编码

* 2、输入流InputStreamReader  解码

*/

public class Demo02 {

public static void main(String[] args) throws IOException {

//输入文件  解码 (字节到字符)   读取  要显示

//指定解码字符集    BufferedReader字符流--InputStreamReader转换流--FileInputStream字节流

BufferedReader br = new BufferedReader

(

new InputStreamReader

(

new FileInputStream(new File("g:/writer.txt")),"UTF-8"

)

);//指定字符解码集

//写出文件     编码(字符到字节)

BufferedWriter bw = new BufferedWriter

(

new OutputStreamWriter

(

new FileOutputStream(new File("G:/try/abdec.txt")),"UTF-8"

)

);

String info = null;

while(null!=(info = br.readLine()))

{

System.out.println(info);

bw.write(info+"\r\n");

}

bw.flush();

bw.close();

br.close();

}

}

运行结果:

每个人都有青春,

每个青春都有一个故事,

每个故事都有一个遗憾,

每个遗憾却都存在着他的美好。ouye

————————————————

原文链接:https://blog.csdn.net/scgaliguodong123_/article/details/45932481

Java IO之处理流的更多相关文章

  1. Java IO 文件与流基础

    Java IO 文件与流基础 @author ixenos 摘要:创建文件.文件过滤.流分类.流结构.常见流.文件流.字节数组流(缓冲区) 如何创建一个文件 #当我们调用File类的构造器时,仅仅是在 ...

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

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

  3. Java IO之字符流和文件

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

  4. [Java IO]03_字符流

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

  5. JAVA IO之管道流总结大全(转)

    要在文本框中显示控制台输出,我们必须用某种方法“截取”控制台流.换句话说,我们要有一种高效地读取写入到System.out和 System.err 所有内容的方法.如果你熟悉Java的管道流Piped ...

  6. java IO之 序列流 集合对象Properties 打印流 流对象

    序列流 也称为合并流. SequenceInputStream 序列流,对多个流进行合并. SequenceInputStream 表示其他输入流的逻辑串联.它从输入流的有序集合开始,并从 第一个输入 ...

  7. java io之管道流

    一.java.io中存在一中流叫管道流,类似管道的功能.PipedOutputStream和PipedInputStream分别是管道输出流和管道输入流.这个两个流必须同时使用. 二.作用:进行两个线 ...

  8. 系统学习 Java IO (六)----管道流 PipedInputStream/PipedOutputStream

    目录:系统学习 Java IO---- 目录,概览 PipedInputStream 类使得可以作为字节流读取管道的内容. 管道是同一 JVM 内的线程之间的通信通道. 使用两个已连接的管道流时,要为 ...

  9. Java IO编程——字符流与字节流

    在java.io包里面File类是唯一 一个与文件本身有关的程序处理类,但是File只能够操作文件本身而不能够操作文件的内容,或者说在实际的开发之中IO操作的核心意义在于:输入与输出操作.而对于程序而 ...

随机推荐

  1. iview table的render()函数的用法

    语法:render:(h,params)=>{} render:(h,params) => { return h(" 定义的元素 ",{ 元素的性质 }," ...

  2. python连接mongodb集群

    一 安装模块pymongo pip3 install pymongo 二 创建一个MongoClient conn=MongoClient('mongodb://cbi:pass@ip1:20000, ...

  3. .net从服务端下载文件(可以断点续传)

    public void DownFile(string guid) { var fileTransfer = new FileTransfer(); var directoryPath = Path. ...

  4. python基础三(深浅拷贝)

    1.赋值操作 list_1 = [1,2,3,['barry','Jerry']] list_2 = list_1 list_1[0] = 111 print(list_1) # [111, 2, 3 ...

  5. PAT 1036 Boys vs Girls (25 分)

    1036 Boys vs Girls (25 分)   This time you are asked to tell the difference between the lowest grade ...

  6. asp.net 随笔

    20190625 网站发布后,添加文件,必须重启iis的应用程序池和网站才能使用添加的文件.

  7. jquery中attr方法和prop方法的区别

    关于checked的属性,最重要的概念就是你要记住,它跟checked的状态值是毫无关系的,设置checked = "checked"或者checked = "true& ...

  8. vue的品牌添加与筛选的功能集合

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 轻松理解https,So easy!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 作者:翟志军 https://showme.codes/2017-02-20/understand-https/ 本文尝试一 ...

  10. 注解深入浅出之Retrofit中的注解(三)

    更多andorid高级架构进阶视频免费分享学习请点击:https://space.bilibili.com/474380680 Retrofit中的注解 @Query,@QueryMap,@Field ...