一、处理流:

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

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

节点流(字节流、字符流)处于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. maven 使用idea运行按钮install

    根据需要配置 例: clean install 离线 设置vm 跳过测试 -Xms1024m -Xmx1024m -XX:MaxPermSize=1024m 附(离线+跳过测试): mvn clean ...

  2. OC学习篇之---内存管理介绍和使用

    在之前的一片文章我们说了OC中谓词操作:http://blog.csdn.net/jiangwei0910410003/article/details/41923507,从今天开始我们就来看一下OC中 ...

  3. Python基础一(格式化输出、流程控制)

    (1)格式化输出(%% 第一个% 转译) # 格式化 输入 输出 name = input("Name:") age = input("Age:") job = ...

  4. Jquery 实现回车键触发功能

    keyup,上抬键盘 .$(function(){ 方法一: $(document).keyup(function(event){ if(event.keyCode ==13){ alert(&quo ...

  5. python singleton 4种单例

    def singleton(cls, *args, **kwargs): instances = {} def inner(cls, *args, **kwargs): if cls not in i ...

  6. Appium+python自动化-查看app元素属性

    本文转自:https://www.cnblogs.com/yoyoketang/p/7581831.html 前言 学UI自动化首先就是定位页面元素,玩过android版的appium小伙伴应该都知道 ...

  7. 框架-.NET:.NET Core

    ylbtech-框架-.NET:.NET Core .NET Core是适用于 windows.linux 和 macos 操作系统的免费.开源托管的计算机软件框架,是微软开发的第一个官方版本,具有跨 ...

  8. Java第四次作业,面向对象高级特性(继承和多态)

    Java第四次作业-面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能,说 ...

  9. Oracle之Group by和Having-----转了

    在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数,例如SUM, COUNT, MAX, AVG等.这些函数和其它函数的根本区别就是它们一般作用在多条 ...

  10. VisualStudio下std::string的内存布局

    主要成员 union _Bxty { // storage for small buffer or pointer to larger one _Elem _Buf[_BUF_SIZE]; _Elem ...