Java IO之处理流
一、处理流:
增强功能,提供性能,在节点流之上。
二、节点流与处理流的关系
节点流(字节流、字符流)处于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之处理流的更多相关文章
- Java IO 文件与流基础
Java IO 文件与流基础 @author ixenos 摘要:创建文件.文件过滤.流分类.流结构.常见流.文件流.字节数组流(缓冲区) 如何创建一个文件 #当我们调用File类的构造器时,仅仅是在 ...
- Java IO: 其他字符流(下)
作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的PushbackReader,LineNumberReader,St ...
- Java IO之字符流和文件
前面的博文介绍了字节流,那字符流又是什么流?从字面意思上看,字节流是面向字节的流,字符流是针对unicode编码的字符流,字符的单位一般比字节大,字节可以处理任何数据类型,通常在处理文本文件内容时,字 ...
- [Java IO]03_字符流
Java程序中,一个字符等于两个字节. Reader 和 Writer 两个就是专门用于操作字符流的类. Writer Writer是一个字符流的抽象类. 它的定义如下: public abstra ...
- JAVA IO之管道流总结大全(转)
要在文本框中显示控制台输出,我们必须用某种方法“截取”控制台流.换句话说,我们要有一种高效地读取写入到System.out和 System.err 所有内容的方法.如果你熟悉Java的管道流Piped ...
- java IO之 序列流 集合对象Properties 打印流 流对象
序列流 也称为合并流. SequenceInputStream 序列流,对多个流进行合并. SequenceInputStream 表示其他输入流的逻辑串联.它从输入流的有序集合开始,并从 第一个输入 ...
- java io之管道流
一.java.io中存在一中流叫管道流,类似管道的功能.PipedOutputStream和PipedInputStream分别是管道输出流和管道输入流.这个两个流必须同时使用. 二.作用:进行两个线 ...
- 系统学习 Java IO (六)----管道流 PipedInputStream/PipedOutputStream
目录:系统学习 Java IO---- 目录,概览 PipedInputStream 类使得可以作为字节流读取管道的内容. 管道是同一 JVM 内的线程之间的通信通道. 使用两个已连接的管道流时,要为 ...
- Java IO编程——字符流与字节流
在java.io包里面File类是唯一 一个与文件本身有关的程序处理类,但是File只能够操作文件本身而不能够操作文件的内容,或者说在实际的开发之中IO操作的核心意义在于:输入与输出操作.而对于程序而 ...
随机推荐
- linux-mysql-install
版本是5.6之前的,安装MySQL步骤 yum install mysql-server 安装服务器端 yum install mysql-devel 安装服务器端 mysql配置文件/etc/my. ...
- CSIC_716_20191224【python基础结课作业--仿优酷练习】
需 求:********管理员界面******** 1 注册 2 登录 3 上传视频 4 删除视频 5 发布公告 ********普通用户界面******** 1 注册 2 登录 3 冲会员 4 查看 ...
- JavaSE---Object
1.概述 Object常用方法: 1.1 getClass(): public final native Class<?> getClass(); 返回 该对象 运行时的Class ...
- PostgreSQL按年月日分组(关键词:extract time as Year/Month/Day)
Select EXTRACT(year from cast(joindate as timestamp)) as Year, EXTRACT(month from cast(joindate as t ...
- css float 浮动
CSS Float(浮动) 什么是 CSS Float(浮动)?大理石平台价格 CSS 的 Float(浮动),会使元素向左或向右移动,其周围的元素也会重新排列. Float(浮动),往往是用于图像, ...
- Network基础(六):telnet远程管理
一.telnet远程管理 目标: 在企业中为方便网络管理员对Cisco设备的配置,一般需事先在Cisco交换机及路由器上开启远程管理的服务,借助网络通过telnet方式远程访问. 方案: 网络管理员通 ...
- 分布式系统理论基础4:Paxos
本文转自:https://www.cnblogs.com/bangerlee/p/5655754.html 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到 ...
- Django中get()和fiter()的区别
QuerySet(查询结果集对象):从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet,也就是指服务器上的url里面的查询内容.Django会对查询返回的结果集QuerySet进行 ...
- 畜禽免疫系统使用LODOP打印
<div class="btn_box"> <asp:Button ID="btnPrint" Text="预览并打印" ...
- VMware Workstation Pro 15.5.0 官方版本及激活密钥
0x01:下载连接: https://download3.vmware.com/software/wkst/file/VMware-workstation-full-15.5.1-15018445.e ...