【Java】Input,Output,Stream I/O流 02 文件流 & 缓冲流
Reader & Writter 只适合文本的输入输出 【.txt .java .c .cpp】
传输文件,不能使用文本IO进行读写,需要使用文件输入输出流
public class IOTest {
public static void main(String[] args) throws Exception {
// 文件输入输出
// 图片文件测试复制
File srcImg = new File("1774415.jpg");
// 新图片文件
File destImg = new File("new.jpg");
// 写入对象
InputStream inputStream = new FileInputStream(srcImg);
// 写出对象
OutputStream outputStream = new FileOutputStream(destImg);
// 缓冲字节数组
byte[] bytesBuffer = new byte[10];
// 返回个数
int len;
while ( (len = inputStream.read(bytesBuffer)) != -1){
// 写入数据
outputStream.write(bytesBuffer,0,len);
}
inputStream.close();
outputStream.close();
}
}
文件复制的方法封装
static void fileCopy(String srcPath,String destPath){ // 文件复制的方法封装
File srcFile = new File(srcPath);
File destFile = new File(destPath);
InputStream inputStream = null;
OutputStream outputStream = null;
try{
inputStream = new FileInputStream(srcFile);
outputStream = new FileOutputStream(destFile);
byte[] bytesBuffer = new byte[1024]; //2的十次方
int length; // 当前读取个数
while ((length = inputStream.read(bytesBuffer)) != -1){
outputStream.write(bytesBuffer,0,length);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
缓冲流,提高文件读写效率
- BufferedInputStream
- BufferedOutputStream
- BufferedReader
- BufferedWritter
static void bufferFileCopy(String srcPath,String destPath){ // 文件复制的方法封装
File srcFile = new File(srcPath);
File destFile = new File(destPath);
InputStream inputStream = null;
OutputStream outputStream = null;
InputStream bufferInput = null;
OutputStream bufferOutput = null;
try{
inputStream = new FileInputStream(srcFile);
outputStream = new FileOutputStream(destFile);
// 多添加一次缓冲流对象装载
bufferInput = new BufferedInputStream(inputStream);
bufferOutput = new BufferedOutputStream(outputStream);
// 调用缓冲输入输出读写文件
byte[] bytesBuffer = new byte[1024]; //2的十次方
int length; // 当前读取个数
while ((length = bufferInput.read(bytesBuffer)) != -1){
bufferOutput.write(bytesBuffer,0,length);
// bufferOutput.flush(); 刷新缓冲数组,但是write已经自带此方法了,所以不用再调用了
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 先关闭缓冲输入输出对象
bufferInput.close();
bufferOutput.close();
// 在关闭文件输入输出对象 关闭外层流的同时,内存流也会被关闭,这一步可以省略
//outputStream.close();
//inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- BufferedReader 和 BufferedWritter 也是一样套接实现的流对象上
static void bufferFileCopy(String srcPath,String destPath){ // 文件复制的方法封装
File srcFile = new File(srcPath);
File destFile = new File(destPath);
Reader reader = null;
Writer writer = null;
BufferedReader bufferReader = null;
BufferedWriter bufferWriter = null;
try{
reader = new FileReader(srcFile);
writer = new FileWriter(destFile);
// 多添加一次缓冲流对象装载
bufferReader = new BufferedReader(reader);
bufferWriter = new BufferedWriter(writer);
// 调用缓冲输入输出读写文件
/*byte[] bytesBuffer = new byte[1024]; //2的十次方
int length; // 当前读取个数
while ((length = bufferInput.read(bytesBuffer)) != -1){
bufferOutput.write(bytesBuffer,0,length);
}*/
// 采用String读取
String data;
while( (data = bufferReader.readLine()) != null){
System.out.println(data);
bufferWriter.write(data + "\n");// data 不包含换行字符 或者bufferWriter.newLine();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
bufferReader.close();
bufferWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
转换流
- InputStreamReader 一个字节输入流 转换至 字符输入流
- OutputStreamWriter 一个字节输出流 转换至 字符输出流
解码 : 字节 字节数组 -> 字符串 字符数组
编码: 字符串 字符数组 -> 字节 字节数组
- 字符集问题 https://www.bilibili.com/video/BV12741127qm
ASCII 美国标准信息交换码,阿斯克码
GBK 中国中文编码表升级,兼容更多中文,原GB2312
Unicode 国际标准码
UTF-8 中英通用
static void readFile(String srcPath) throws Exception {
File file = new File(srcPath);
InputStream inputStream = new FileInputStream(file);
InputStreamReader inputReader = new InputStreamReader(inputStream,"UTF-8");
// new InputStreamReader(inputStream, StandardCharsets.UTF_8);
// new InputStreamReader(inputStream, "UTF-8"); 一般不写字符集参数,默认使用系统字符集[文件创建时,设置的字符集]
char[] charsBuffer = new char[12];
int len;
while ((len = inputReader.read(charsBuffer)) != -1 ){
String str = new String(charsBuffer,0,len);
System.out.println(str);
}
inputReader.close();
}
文件字符转换的输入输出问题
static void transFileCopy(String srcPath,String destPath) throws Exception {
// 创建文件、创建流对象
File srcFile = new File(srcPath);
File destFile = new File(destPath);
InputStream inputStream = new FileInputStream(srcFile);
OutputStream outputStream = new FileOutputStream(destFile);
InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"UTF-8");
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream,"GBK");
// 读写过程
char[] charsBuffer = new char[10];
int len;
while ((len = inputStreamReader.read(charsBuffer)) != -1){
outputStreamWriter.write(charsBuffer,0,len);
}
// 释放资源
inputStreamReader.close();
outputStreamWriter.close();
}
【Java】Input,Output,Stream I/O流 02 文件流 & 缓冲流的更多相关文章
- File类的特点?如何创建File类对象?Java中如何操作文件内容,什么是Io流Io流如何读取和写入文件?字节缓冲流使用原则?
重难点提示 学习目标 1.能够了解File类的特点(存在的意义,构造方法,常见方法) 2.能够了解什么是IO流以及分类(IO流的概述以及分类) 3.能够掌握字节输出流的使用(继承体系结构介绍以及常见的 ...
- JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine
JAVA之旅(二十五)--文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine 我们继续IO上个篇 ...
- Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader)
Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符缓冲流 字符缓冲流根据流的 ...
- Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream)
Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我们学习字 ...
- IO流(5)—缓冲流
1.IO体系: 抽象基类--节点流(文件流)--缓冲流(处理流的一种) InputStream --FileInputStream--BufferedInputStream OutputStream- ...
- Java基础学习(六)-- 递归以及文件I/O流基础详解
递归 1.递归的概念: 在函数自身内部,调用函数本身的方式,称为递归. 2.递归的注意事项:包括递进去,归出来两步. 即:首先依次执行[函数调自身语句]上半部分的代码,知道最里层.(递进去),然后 ...
- 我爱Java系列之《JavaEE学习笔记day12》---【缓冲流、转换流、序列/反序列化流、打印流】
[缓冲流.转换流.序列/反序列化流.打印流] 一.缓冲流 1.字节缓冲输出流 java.io.BufferedOutputStream extends OutputStream 高效字节输出流 写入文 ...
- Java之缓冲流(字节/字符缓冲流)
概述 缓冲流,也叫高效流,是对4个基本的 FileXxx 流的增强,所以也是4个流,按照数据类型分类: 字节缓冲流: BufferedInputStream , BufferedOutputStrea ...
- java IO流 (四) 缓冲流的使用
1.缓冲流涉及到的类: * BufferedInputStream* BufferedOutputStream* BufferedReader* BufferedWriter 2.作用:作用:提供流的 ...
- JAVA input/output 流层次关系图
在java中,input和output流种类繁多,那么它们之间是否有关系呢?答案是肯定的,其中使用到了设计模式,装饰模式 下图来自于HEAD FIRST 设计模式 装饰模式一章 下图来自网络博客:ht ...
随机推荐
- k8s——kubctl命令基础
语法 kubevtl [command] [type] [name] [flags] command: 指定要对一个或多个资源执行的操作,例如,`create`,`get`,`describe`,`d ...
- 常见的Linux命令
在 cmd 命令行 或者终端中 可以运行 node.js 命令 也可以 运行 SQL语句 还可以运行 Linux 命令 Li ...
- kettle从入门到精通 第十三课 kettle 字符串操作
1.本次示例讲解一些常用的字符串操作,有字段拼接,枚举值转换,计算器.字符串替换.字段拆分. 2.输入元数据有firstName.secondName.sex.salary.englishName.o ...
- Linux扩展篇-shell编程(五)-流程控制(二)-case语句
基本语法: case expression in pattern1) statement1 ;; pattern2) statement2 ;; *) statement3 ;; esac 注意事项: ...
- JS获取表单所有内容
var formData = {}; var t = $('#Form').serializeArray(); $.each(t, function() { formData[this.name] = ...
- IDEA环境编译Spring源码
一.下载源码 1.官网下载 官网地址 如下图 2.github git下载 github地址 如下图 3.gitee git下载(国内推荐使用) gitee地址 如图 查看对应的gradle版本 在下 ...
- 彻底解决IDEA Jrebel 错误找不到口令文件的问题
本来我的Jrebel也是好用的,突然就变成了这个样子,网上针对这个问题有很多帖子,但是每次新建项目后我都需要去解决一下这个问题,这我不能忍,经过一整天的百度和测试终于找到了原因并解决这个问题,伸手党直 ...
- 纯代码搭建iOS三级结构(UITabbarController+UINavigationController+UIViewController)
声明:这里所指的三级结构不是网上百度中所经常提及的三级框架或者MVC模式,而是指UITabbarController+UINavigationController+UIViewController. ...
- RuoYi-Cloud从配置到运行
前期准备工作 若依微服务版(RuoYi-Cloud)代码下载:https://gitee.com/y_project/RuoYi-Cloud 注册中心(nacos)下载:https://www.ali ...
- 前端 Array.sort() 源码学习
源码地址 V8源码Array 710行开始为sort()相关 Array.sort()方法是那种排序呢? 去看源码主要是源于这个问题 // In-place QuickSort algorithm. ...