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操作的核心意义在于:输入与输出操作.而对于程序而 ...
随机推荐
- Tomcat 配置错误界面
Tomcat发生错误时跳转到错误页面 注意 :5.0下操作需要删除掉注释语句,不然报错,原因未知 一.修改 tomcat 的配置文件 修改 tomcat 的配置文件,当页面发生错误时跳转到指定的页面, ...
- 转载 初学者必看——最简单最清晰的Struts2项目搭建流程
https://blog.csdn.net/key0323/article/details/50773499 在项目中想要使用Struts2框架,我该怎么做?从哪里开始?这是我的疑惑,我想也是很多初学 ...
- js 对象属性和使用方法学习笔记
对象的引用 在ECMAScriipt中,不能访问对象的物理表示,只能访问对象的引用.每次创建对象,存储在变量中的都是对象的引用,而不是对象本身. 对象的废除 ECMASript拥有无用存储单元收集程序 ...
- HttpClient类详解
文章链接:https://blog.csdn.net/justry_deng/article/details/81042379 HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了 ...
- Java中的多表&事务&DCL&一个多表操作例子
准备sql: 创建部门表 CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO d ...
- [bzoj3733]Iloczyn 题解(搜索剪枝)
3733: [Pa2013]Iloczyn Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 741 Solved: 217[Submit][Statu ...
- docker-compose快速搭建 Prometheus+Grafana监控系统
一.说明Prometheus负责收集数据,Grafana负责展示数据.其中采用Prometheus 中的 Exporter含:1)Node Exporter,负责收集 host 硬件和操作系统数据.它 ...
- Javascript 数组 数字 字符串 时间等使用
1.Javascript 数组API 1. //定义数组 2. var pageIds = new Array(); 3. pageIds.push('A'); 5. 数组长度 6. pageIds. ...
- 并口、串口、COM口区别
并行接口,简称并口.并口采用的是25针D形接头.所谓“并行”,是指8位数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,数据也 ...
- SpringBoot之Spring@Value属性注入使用详解
在使用Spring框架的项目中,@Value是使用比较频繁的注解之一,它的作用是将配置文件中key对应的值赋值给它标注的属性.在日常使用中我们常用的功能都比较简单,本篇文章系统的带大家来了解一下@Va ...