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操作的核心意义在于:输入与输出操作.而对于程序而 ...
随机推荐
- JS的一些日常
1. [1] == 1 => true; 很神奇.. 2.js变量命名规则: // 1.变量命名必须以字母.下划线”_”或者”$”为开头.其他字符可以是字母._.美元符号或数字. / ...
- RabbitMQ探索之路(一):RabbitMQ简介
一:何为RabbitMQ? 作为Windows忠实用户,不得不提微软自带的MSMQ,Windows自带的一个服务,message是存放在文件系统的,这是最原始的消息队列了. 然而如今的分布式以及消息处 ...
- sql中的(case when then else end )的用法(相当于java中的if else)
Case具有两种格式:简单Case函数和Case搜索函数. 1.简单Case函数: CASE sex WHEN‘1’THEN‘男’ WHEN‘0’THEN‘女’ ELSE‘其他’END 2.Case搜 ...
- Delphi UTF编码 UTF8Encode、UTF8Decode、URLEncode、URLDecode
一.URL简介 URL是网页的地址,比如 http://www.cnblogs.com.Web 浏览器通过 URL 从 web 服务器请求页面. 由于URL字符串常常会包含非ASCII字符 ...
- MailUtils
/** *包名:com.thinkgem.jeesite.test *描述:package com.thinkgem.jeesite.test; */ package com.thinkgem.jee ...
- Hadoop 权限管理(转)
如下图,hadoop访问控制分为两级,其中ServiceLevel Authorization为系统级,用于控制是否可以访问指定的服务,例如用户/组是否可以向集群提交Job,它是最基础的访问控制,优先 ...
- [NOIP模拟测试34]反思+题解
不要陷入思维定势,如果长时间没有突破就要考虑更改大方向. 不要把简单问题复杂化. 做完的题就先放下,不管能拿多少分.不能过一段时间就回来调一下. $Solutions:$ A.次芝麻 因为$n+m$始 ...
- win10配置 samba
一.先確認Linux中smb正確配置可以使用命令smbclient -L //localhost/ 二.win10配置1.打開win10對smb1.0/cifs檔共用支援2.本地群組原則編輯,修改如下 ...
- tomcat7以下线程控制
web server允许的最大线程连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右. 1.编辑tomcat安装目录下的conf目录下的server. ...
- error LNK2001: 无法解析的外部符号 __imp__Shell_NotifyIconA@8
编译链接报错 error LNK2001: 无法解析的外部符号 __imp__Shell_NotifyIconA@8 解决方案: 在代码中添加链接库Shell32.lib #pragma commen ...