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操作的核心意义在于:输入与输出操作.而对于程序而 ...
随机推荐
- [转]DesignWare是什么
一.DesignWare是什么 摘自https://zhidao.baidu.com/question/473669077.html DesignWare是SoC/ASIC设计者最钟爱的设计IP库和验 ...
- Quartz.Net 任务调度之特性(3)
再实现类中使用,就是继承IJob的类 [PersistJobDataAfterExecution] //执行后的保留作业数据,链式传参(上一次的任务数据) [DisallowConcurrentExe ...
- springDataRedis 依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit ...
- Ceph中PG和PGP的区别
http://www.zphj1987.com/2016/10/19/Ceph%E4%B8%ADPG%E5%92%8CPGP%E7%9A%84%E5%8C%BA%E5%88%AB/ 一.前言 首先来一 ...
- SSD接口详解,再也不会买错固态硬盘了
http://stor.51cto.com/art/201808/582349.htm 硬盘知识科普中,我们提到了SSD的发展史虽短,但是种类和协议比HDD不知道多到哪里去了.因此,本期小编就通过接口 ...
- Hibernate学习 (一)
Hibernate错误总结: 1:不能自动创建表.把MySQL的版本的方言修改一下. 首先自己要注意自己的MYSQL版本,然后设置对应的方言 兼容性模式 <property name=" ...
- jmeter之--断言json响应&json path espressions的语法
一.提取所需要断言的内容: 响应数据如下:加入需要提取id为90的值 { , "name" : "python", "url" : &quo ...
- ios 最全的常用字符串操作
1.将NSData / NSString转化 1 2 3 NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; // 将字符串 ...
- 用cd 命令进入和退出D盘文件夹的操作步骤。
Windows键+R打开运行 输入cmd敲回车,打开命令提示符程序. 输入“cd..”敲回车会退回到上一级目录. 输入“cd\”敲回车会直接退回到C盘根目录 在CMD程序里输入“d:”敲回车可以进入D ...
- html 局部打印
首先有个调用的方法.printView(). function printView() { bdhtml = window.document.body.innerHTML;//获取当前页的html代码 ...