java中的io流总结(一)
知识点:基于抽象基类字节流(InputStream和OutputStream)、字符流(Reader和Writer)的特性,处理纯文本文件,优先考虑使用字符流BufferedReader/BufferedWriter,其他的考虑使用字节流(BufferedInputStream/BufferedOutputStream),之所以使用缓冲流读写很快
(一)io结构图
字节流和字符流的区别:
1.字节流处理所有的类型数据,如:图片,视频等等,而字符流只能处理字符数据,如果处理纯文本文件,优先考虑使用字符流,其他的考虑使用字节流;
2.字节流读到一个字节就返回一个字节,字符流使用字节流读到一个或者多个字节,去查编码表,将查到的字符返回(中文对应的字节数为两个)。
(二)示例代码
(1) 节点流 FileInputStream/FileOutStream(字节流)读写文件实现文件的复制
import java.io.*;
/*
IO体系
抽象基类 节点流(文件流) 缓冲流(处理流的一种)
InputStream FileInputStream BufferedInputStream
OutputStream FileOutputStream BufferedOutputStream (flush)
Reader FileReader BufferedReader (readline)
Writer FileWriter BufferedWriter (flush)
*/
public class IOTestInputOutputStream {
//复制文件
@Test
public void TestFileInputOutputStream(){
//TestCopyFile("E:\\test\\io\\test2.txt","E:\\test\\io\\test8.txt"); //复制文本文件
//TestCopyFile("E:\\test\\io\\1.png","E:\\test\\io\\2.png");//图片
long start=System.currentTimeMillis();
TestCopyFile("E:/test/io/1.flv","E:/test/io/2.flv");
long end=System.currentTimeMillis();
System.out.println("时间:"+(end-start));//复制视频48.3M需要6151毫秒
}
public void TestCopyFile(String src,String dest){
File file1=new File(src);
File file2=new File(dest); FileInputStream fis=null;
FileOutputStream fos=null;
try {
int len;
byte[] b=new byte[50];
fis=new FileInputStream(file1);
fos=new FileOutputStream(file2); while (((len=fis.read(b))!=-1)) {
fos.write(b,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
(2) 节点流 FileReader/FileWriter(缓冲流)读写文件实现文件的复制
import java.io.*;
/*
FileReader、FileWriter 可以实现文本文件复制
对于非文本文件(视频文件、音频文件、图片),只能使用字节流
*/
public class FileReaderFileWriter {
//复制文本文件
@Test
public void FileReaderAndFileWriter(){
CopyFileRederAndWriter("E:/test/io/3.txt","E:/test/io/4.txt");
//CopyFileRederAndWriter("E:/test/io/1.png","E:/test/io/3.png"); //文件复制出错
}
public void CopyFileRederAndWriter(String src,String desc){
FileReader fr=null;
FileWriter fw=null; try {
File file1=new File(src);
File file2=new File(desc);
fr=new FileReader(file1);
fw=new FileWriter(file2);
char[] c=new char[20];
int len;
while ((len=fr.read(c))!=-1){
String str=new String(c);
fw.write(str,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fr!=null){
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fw!=null){
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
(3) 缓冲流 BufferedInputStream/BufferedInputStream 读写文件实现文件的复制
使用缓冲流较文件读写熟读更快,如下例子中读写48.4M的视频文件,文件需要6151毫秒,而缓冲只需要170毫秒,实际应用中使用缓冲流,将文件作为参数传入缓冲中
@Test
public void testBufferedInputOutputStream(){
long start=System.currentTimeMillis();
CopyBufferedInputOutputStream("E:/test/io/1.flv","E:/test/io/2.flv");
long end=System.currentTimeMillis();
System.out.println("时间:"+(end-start));//复制视频48.3M需要170毫秒,较节点流速度快
} public void CopyBufferedInputOutputStream(String src,String desc){
BufferedInputStream bis=null;
BufferedOutputStream bos=null; try {
File file1=new File(src);
File file2=new File(desc); FileInputStream fis=new FileInputStream(file1);
FileOutputStream fos=new FileOutputStream(file2); bis=new BufferedInputStream(fis);
bos=new BufferedOutputStream(fos);
byte[] b=new byte[50];
int len;
while ((len=bis.read(b))!=-1){
bos.write(b,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//先关闭输出流,后关闭输入流
if (bos!=null){
try {
bos.flush();//清空缓冲区内的数据,最后一次
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bis!=null){
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
(4) 缓冲流 BufferedReader/BufferedWriter读写文件实现文件的复制
@Test
public void testBufferedReaderAndWriter(){
BufferedReader br=null;
BufferedWriter bw=null; try {
File file1=new File("E:/test/io/3.txt");
File file2=new File("E:/test/io/5.txt");
FileReader fr=new FileReader(file1);
FileWriter fw=new FileWriter(file2);
br=new BufferedReader(fr);
bw=new BufferedWriter(fw); String str;
while ((str=br.readLine())!=null){//按行读
// System.out.println(str+"\n");
bw.write(str+"\n");//换行写
// bw.newLine();//换行写
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if (bw!=null){
try {
bw.flush();//清空缓冲区内的数据,最后一次
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (br!=null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
} }
}
java中的io流总结(一)的更多相关文章
- java中的IO流
Java中的IO流 在之前的时候我已经接触过C#中的IO流,也就是说集中数据固化的方式之一,那么我们今天来说一下java中的IO流. 首先,我们学习IO流就是要对文件或目录进行一系列的操作,那么怎样操 ...
- Java中的IO流总结
Java中的IO流总结 1. 流的继承关系,以及字节流和字符流. 2. 节点流FileOutputStream和FileInputStream和处理流BufferedInputStream和Buffe ...
- Java中的IO流大体介绍
由于Java中的IO流是在是知识点繁多,所以我大约花了1周的时间将其整理起来.但是整理起来后并不是将完事了,我还是要分字节流和字符流来讲述.然后字节流和字符流中还有是否带有缓冲流. 讲述完IO流后我将 ...
- Java中的IO流,Input和Output的用法,字节流和字符流的区别
Java中的IO流:就是内存与设备之间的输入和输出操作就成为IO操作,也就是IO流.内存中的数据持久化到设备上-------->输出(Output).把 硬盘上的数据读取到内存中,这种操作 成为 ...
- Java中的IO流(五)
上一篇<Java中的IO流(四)>记录了一下Properties类,此类不属于IO流,它属于集合框架.接下来说一下IO流中的其它流 一,打印流PrintStream PrintStream ...
- Java中的IO流(六)
上一篇<Java中的IO流(五)>把流中的打印流PrintStream,PrintWriter,序列流SequenceInputStream以及结合之前所记录的知识点完成了文件的切割与文件 ...
- JAVA 中的IO流
Java中的IO流是用来处理设备与设备之前的数据传输,在java中以流的形式传输.流分为两类:字节流和字符流. 字节流:InputStream,OutPutSteam.(计算机内的数据都是以字节存储的 ...
- Java中的IO流(四)
上一篇<Java中的IO流(三)>把IO流中的文件及目录操作的对象File类记录了一下,本篇把本不属性IO流但又和IO流有关系的一个对象作一下记录,此对象本属于集合框架里的一个子集,即Pr ...
- Java中的IO流(三)
上一篇<Java中的IO流(二)>把学习Java的字符流以及转换流作了一下记录,从本篇开始将把IO流中对文件或文件夹操作的对象File类的学习进行一下记录. 一,File类的构造函数及字段 ...
- Java中的IO流(二)
上一篇<Java中的IO流(一)>把学习IO流的字符流作了一下记录,本篇把字节流记录一下. 一,Java中的字节流 Java中的字节流的操作方式与字符流的操作方式大致相同,连方法名都是类似 ...
随机推荐
- EM算法之不同的推导方法和自己的理解
EM算法之不同的推导方法和自己的理解 一.前言 EM算法主要针对概率生成模型解决具有隐变量的混合模型的参数估计问题. 对于简单的模型,根据极大似然估计的方法可以直接得到解析解:可以在具有隐变量的复杂模 ...
- mysql的AB及读写和集群
Mysql的AB及读写 第1章 Mysql的AB配置 1.1 master配置 1.2 slave配置 第2章 读写分离 2.1 安装mycat 2.2 启动mycat 2.3 登录mycat相关问 ...
- Postman 下载和使用
Postman 的官网下载地址是:https://www.getpostman.com/apps/
- ASP.NET请求过程-Module
管道模型 上图中为Http请求在Asp.net程序中处理的过程.管道处理模型来自上面的HttpApplication,管道处理模型其实就是多个Module(其实这些module都是在往http ...
- 关于npm install 报错 EAI_AGAIN reason: getaddrinfo EAI_AGAIN registry.npmjs.org
在公司里使用了isa连接外网,刚开始使用npm 安装依赖的时候一直报错EAI_AGAIN reason: getaddrinfo EAI_AGAIN registry.npmjs.org,我们的老大给 ...
- Ural 1029 Ministry 题解
目录 Ural 1029 Ministry 题解 题意 题解 程序 Ural 1029 Ministry 题解 题意 给定一个\(n\times m(1\le n \le10,1\le m \le50 ...
- 前端通过js获取手机型号
###前段通过js获取手机型号 需求: 用户登录后记录当前的手机型号并记录 插件: mobile-detect.js插件地址 mobile-device-js插件地址 使用步骤: 获取UA信息-> ...
- Vue 设置style样式
1.直接添加行内样式 2.通过绑定设置style样式 3.将vue的属性设置为样式 4将多个vue属性设置为样式 <div id="box"> <!--直接添加样 ...
- UPUPW Apache5.5系列本地开发环境配置
UPUPW Apache5.5系列 1. 在官网下载 Apache5.5系列,选择云端下载. 官网地址: http://www.upupw.net/aphp55/n110.html 2. 下载后,将压 ...
- 学界 | 华为诺亚方舟实验室提出新型元学习法 Meta-SGD ,在回归与分类任务中表现超群
学界 | 华为诺亚方舟实验室提出新型元学习法 Meta-SGD ,在回归与分类任务中表现超群 机器之心发表于机器之心订阅 499 广告关闭 11.11 智慧上云 云服务器企业新用户优先购,享双11同等 ...