IO流详解及测试代码
IO流
(1)IO用于在设备间进行数据传输的操作
(2)分类:
A:流向
输入流 读取数据
输出流 写出数据
B:数据类型
字节流
字节输入流
字节输出流
字符流
字符输入流
字符输出流
IO流分类
字节流:
InputStream
FileInputStream
BufferedInputStream
OutputStream
FileOutputStream
BufferedOutputStream
字符流:
Reader
FileReader
BufferedReader
Writer
FileWriter
BufferedWriter
注意:
a:如果我们没有明确说明按照什么分,默认按照数据类型分。
b:除非文件用windows自带的记事本打开我们能够读懂,才采用字符流,否则建议使用字节流。
(3)FileOutputStream写出数据
A:操作步骤
a:创建字节输出流对象
b:调用write()方法
写出数据的方式:
write(byte[] b) 写一个字符数组
write(byte[] int off, int len) 写一个字符数组的一部分
write(int b) 写一个字节
c:释放资源
B:代码体现:
FileOutputStream fos = new FileOutputStream("fos.txt");
fos.write("hello".getBytes());
fos.close();
public class FileOutputStreamDemo {
public static void main(String[] args) throws IOException {
//创建字节输出流对象
FileOutputStream fos = new FileOutputStream("fos.txt");
//写数据
/*
* write(byte[] b) 写一个字符数组
* write(byte[] int off, int len) 写一个字符数组的一部分
* write(int b) 写一个字节
*
* 这里要输入的是字符串 所以得转化成字节型
*/
fos.write("hello,IO".getBytes());
//释放资源
fos.close();
}
}
public class FileOutputStreamDemo2 {
public static void main(String[] args) throws IOException {
//创建字节输出流对象
FileOutputStream fos = new FileOutputStream("fos2.txt");
//调用write方法
//write(int b)
fos.write(97);
fos.write(65);
//write(byte[] b)
byte[] bys = {97,98,100,100,102};
fos.write(bys);
//write(byte[] b, int off,int len )
fos.write(bys, 1, 3);
//释放资源
fos.close();
}
}
C:要注意的问题?
a:创建字节输出流对象做了几件事情?
b:为什么要close()?
让对象成为垃圾,通知系统释放资源
c:如何实现数据的换行?
d:如何实现数据的追加写入?
public class FileOutputStreamDemo3 {
public static void main(String[] args) throws IOException {
//创建字节输出流对象
//从头写
//FileOutputStream fos = new FileOutputStream("fos3.txt");
//追加写
FileOutputStream fos = new FileOutputStream("fos3.txt" ,true);
//写数据
for(int x = 0; x < 19; x++){
fos.write(("hello" + x).getBytes());
fos.write("\r\n".getBytes());//换行
}
///释放资源
fos.close();
}
}
异常的处理
public class FileOutputStreamDemo4 {
public static void main(String[] args) {
//为了finally 里面能够看到改对象就必须定义到外面 另外为了访问不出问题,还必须初始化值
FileOutputStream fos = null;
try{
fos = new FileOutputStream("fos4.txt");
fos.write("hello".getBytes());
}catch (FileNotFoundException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}finally{
//如果fos不是null 才执行close()
if (fos != null){
//为了保证close一定执行
try{
fos.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
}
}
(4)FileInputStream读取数据
A:操作步骤
a:创建字节输入流对象
b:调用read()方法
读取数据的方式:
int read() 一次读取一个字节
int read(byte[] b) 一次读取一个字节数组
c:释放资源
B:代码体现:
FileInputStream fis = new FileInputStream("fos.txt");
//方式1
int by = 0;
while((by=fis.read())!=-1) {
System.out.print((char)by);
}
/*
* 字节输入流操作流程
* a.创建字节输入流对象
* b.调用read()方法读取数据并输出在控制台
* c.释放资源
*
* 读取数据的方式:
* a.int read() 一次读取一个字节
* b.int read(byte[] b) 一次读取一个字节数组
*/
public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("fis.txt");
int by = ;
//读取 赋值 判断一次完成
while((by = fis.read()) != -){
System.out.print((char)by);//这里读取英文和符号不会出问题,因为做了强制转换,但是读取中文就会有问题了,
}
//释放资源
fis.close();
} }
//方式2
byte[] bys = new byte[1024];
int len = 0;
while((len=fis.read(bys))!=-1) {
System.out.print(new String(bys,0,len));
}
fis.close();
(5)案例:2种实现
A:复制文本文件
/*
* 复制文本文件
*
* 数据源
* a.txt 读取数据 FileInputStream
* 目的地
* b.txt 写数据 FileOutputStream
*
* 这次在复制时不会出现含有中文乱码的问题,因为通过IO流读取数据写到文本文件,没有做任何转换,读取一个写一个
*/
public class FileInputStreamDemo2 { public static void main(String[] args) throws IOException {
//封装数据源
FileInputStream fis = new FileInputStream("a.txt");
//封装目的地
FileOutputStream fos = new FileOutputStream("b.txt"); int by = ;
while((by = fis.read()) != -){
fos.write(by);
}
//释放资源
fos.close();
fis.close();
}
}
/*
* 一次读取一个字符数组:int read(byte[] b)
*/
public class FileInputStreamDemo4 { public static void main(String[] args) throws IOException {
//创建字节输入流对象
FileInputStream fis = new FileInputStream("fis.txt");
//读取数据
byte[] bys = new byte[1024];
int len = 0;
while((len = fis.read(bys)) != -1){
System.out.print(new String(bys, 0, len));//bys转换为字符串
}
//释放资源
fis.close();
}
}
public class CopyFileDemo {
public static void main(String[] args) throws IOException {
//封装数据
FileInputStream fis = new FileInputStream("e:\\a.txt");
FileOutputStream fos = new FileOutputStream("e:\\b.txt");
//复制数据
byte[] bys = new byte[1024];
int len = 0;
while((len = fis.read(bys)) != -1){
fos.write(bys, 0, len);
}
//释放资源
fos.close();
fis.close();
}
}
注意:这里说一下在计算机中是怎么样来识别什么时候将两个字节转换为一个中文的。
由于在计算机中中文的存储分为两个字节:第一个字节肯定是负数,第二个字节一般是负数,也有可能是正数,但是没有 什么影响的哦。、
看下面的例子就明白了!!!!!
public class FileInputStreamDemo3 {
public static void main(String[] args) {
//String s = "abcfgj";
//打印出 [97, 98, 99, 102, 103, 106]
String s = "数据了模型";
//打印出 [-26, -107, -80, -26, -115, -82, -28, -70, -122, -26, -88, -95, -27, -98, -117]
byte[] bys = s.getBytes();
System.out.println(Arrays.toString(bys));
}
}
B:复制图片
/*
* 将f:\\a.jpg内容复制到当前项目目录下的b.jpg中
*
* 数据源:f:\\a.jpg 读取数据 FileInputStream
* 目的地:b.jpg 写出数据 FileOutPutStream
*/
public class CopyImage {
public static void main(String[] args) throws IOException {
//封装数据源
FileInputStream fis = new FileInputStream("f:\\a.jpg");
//封装目的地
FileOutputStream fos = new FileOutputStream("b.jpg"); //复制数据
int by = 0;
while((by = fis.read()) != -1){
fos.write(by);
}
//释放资源
fos.close();
fis.close();
} }
C:复制视频
/*
* 将e:\\天梯.mp4复制到当前项目目录下的c.mp4中
*
* 数据源:
* e:\\天梯.mp4 读取数据 FileInputStream
* 目的地:
* c.mp4 写出数据 FileOutputStream
*/
public class CopyMP4 { public static void main(String[] args) throws IOException {
//封装数据源
FileInputStream fis = new FileInputStream("天梯.mp4");
//封装目的地
FileOutputStream fos = new FileOutputStream("c.mp4"); //复制数据
int by = 0;
while((by = fis.read()) != -1){
fos.write(by);
} //释放资源
fos.close();
fis.close();
}
}
/*
* 将e:\\天梯.mp4复制到当前项目目录下的c.mp4中
*
* 数据源:
* e:\\天梯.mp4 读取数据 FileInputStream
* 目的地:
* c.mp4 写出数据 FileOutputStream
*/
public class Copymp4demo { public static void main(String[] args) throws IOException {
//封装数据源
FileInputStream fis = new FileInputStream("天梯.mp4");
//封装目的地
FileOutputStream fos = new FileOutputStream("c.mp4"); //复制数据
byte[] bys = new byte[1024];
int len = 0;
while((len = fis.read(bys)) != -1){
fos.write(bys, 0, len);
} //释放资源
fos.close();
fis.close();
}
}
(6)字节缓冲区流
因为加入了数组这样的缓冲区,字节流一次读写一个数组的速度明显比一次读写一个字节的速度块很多,然而Java本身在设计的时候也考虑到了这样的设计思想, 提供了字节流缓冲区,缓冲区类。
写数据:BufferedOutputStream
public class BfferedOutputStreamDemo {
public static void main(String[] args) throws IOException {
//BufferedOutputStream(OutputStream out)
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream("bos.txt"));
//写数据
bos.write("hello".getBytes());
//释放资源
bos.close();
}
}
读数据:BufferedInputStream
public class BfferedInputStreamDemo1 {
//BufferedInputStream(InputStream in)
public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream("bos.txt"));
//读取数据 方式一
int by = 0;
while((by = bis.read()) != -1){
System.out.print((char) by);
}
//方式二
byte[] bys = new byte[1024];
int len = 0;
while((len = bis.read(bys)) != -1){
System.out.print(new String(bys, 0, len));
}
//释放资源
bis.close();
}
}
(7)案例:4种实现
复制视频
/*
*将e:\\天梯.mp4复制到当前目录下的a.mp4
*
*字节流四种方式复制文件:
*基本字节流一次读写一个字节
*基本字节流一次读取一个字符数组
*高效字节流一次读取一个字节
*高效字节流一次读取一个字节数组
*/
public class CopyMp4Demo3 {
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
method1("e:\\天梯.mp4", "a.mp4 ");
//method2("e:\\天梯.mp4", "a.mp4 ");
//method3("e:\\天梯.mp4", "a.mp4 ");
//method4("e:\\天梯.mp4", "a.mp4 ");
long end = System.currentTimeMillis();
System.out.println("共耗时:" + (end - start) + "毫秒");
} //基本字节流一次读写一个字节
private static void method1(String srcString, String destString) throws IOException {
FileInputStream fis = new FileInputStream(srcString);
FileOutputStream fos = new FileOutputStream(destString); int by = 0;
while((by = fis.read()) != -1){
fos.write(by);
} fos.close();
fis.close();
} //基本字节流一次读写一个字节数组
private static void method2(String srcString, String destString) throws IOException {
FileInputStream fis = new FileInputStream(srcString);
FileOutputStream fos = new FileOutputStream(destString); byte[] bys = new byte[1024];
int len = 0;
while((len = fis.read(bys)) != -1){
fos.write(bys, 0, len);
} fos.close();
fis.close();
} //高效字节流一次读写一个字节
private static void method3(String srcString, String destString) throws IOException {
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(srcString));
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(destString)); int by = 0;
while((by = bis.read()) != -1){
bos.write(by);
} bos.close();
bis.close();
} //高效字节流一次读写一个字节数组
private static void method4(String srcString, String destString) throws IOException {
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(srcString));
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(destString)); byte[] bys = new byte[1024];
int len = 0;
while((len = bis.read(bys)) != -1){
bos.write(bys);
} bos.close();
bis.close();
}
}
IO流详解及测试代码的更多相关文章
- 基于JavaSE阶段的IO流详解
1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有 ...
- java IO流详解
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- IO流详解
目录 IO流 IO流概述及其分类 IO概念 流按流向分为两种: 流按操作类型分为两种: 常用的IO流类 字节流的抽象父类: 字符流的抽象父类: InputStream & FileInputS ...
- Java IO流详解(五)——缓冲流
缓冲流也叫高效流,是处理流的一种,即是作用在流上的流.其目的就是加快读取和写入数据的速度. 缓冲流本身并没有IO功能,只是在别的流上加上缓冲效果从而提高了效率.当对文件或其他目标频繁读写或操作效率低, ...
- Java IO流详解(二)——File类
在上一章博客中简单的介绍了Java IO流的一些特征.也就是对文件的输入输出,既然至始至终都离不开文件,所以Java IO流的使用得从File这个类讲起. File类的描述:File类是文件和目录路径 ...
- Java io流详解二
原文地址https://www.cnblogs.com/xll1025/p/6418766.html 一.IO流概述 概述: IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间 ...
- 《Java基础知识》Java IO流详解
Java IO概念 1. 用于设备之间的数据传输. 2. Java 将操作数据流的功能封装到了IO包中. 3. 数据流流向分:输入流和输出流,操作对象为文件. 4. 流按照操作数据分:字节流(通用)和 ...
- Java IO流详解(六)——转换流
转换流也是一种处理流,它提供了字节流和字符流之间的转换.在Java IO流中提供了两个转换流:InputStreamReader 和 OutputStreamWriter,这两个类都属于字符流.其中I ...
- Java IO流详解(三)——字节流InputStream和OutPutStream
我们都知道在计算机中,无论是文本.图片.音频还是视频,所有的文件都是以二进制(字节)形式存在的,IO流中针对字节的输入输出提供了一系列的流,统称为字节流.字节流是程序中最常用的流.在JDK中,提供了两 ...
随机推荐
- class和style绑定
在数据绑定中,一个常见需求是,将数据与元素的 class 列表,以及元素的 style 内联样式的操作绑定在一起.由于它们都是属性(attribute),因此我们可以使用 v-bind 来处理它们:只 ...
- Go简易分布式对象存储 合并文件的所有分块为一个文件
项目 项目地址: https://github.com/Draymonders/cloud 欢迎大家Watch or Star 缘由 由于项目中对大文件进行5MB为一个分块上传(多线程,提升上传效率) ...
- es之词库热更新解决方案
1. 下载tomcat,作为远程词库的容器 , 需要在tomcat中配置词库 /webapp/ROOT这个路径下新建一个远程词库:Vim hot.dicHot.dic中存放的就是实时热词 2.测试t ...
- React Native商城项目实战11 - 个人中心头部内容
1.创建MineHeaderView.js /** * 个人中心头部内容 */ import React, { Component } from 'react'; import { AppRegist ...
- 使用xshell连接Ubuntu虚拟机
1.下载安装VMware软件,可以试用. 2.新建虚拟机,选择典型安装,这里安装Ubuntu16.04 LTS,注意选择网络连接时设置为 桥接模式,在“编辑”--“虚拟网络编辑器”中将DHCP 池中的 ...
- HTML - form 表单提交
form 表单提交 数据发送 disabled:不发送 display_none:发送 type_hidden:发送 readonly:发送 测试 html: <!DOCTYPE html> ...
- 负载均衡环境搭建(nginx和tomcat)
偶然看到博客上一篇负载均衡的文章,学习了一下,此处做下记录 目录 1.环境准备 2.tomcat配置 3.nginx配置 1.环境准备 第一步:java环境 第二步:nginx和pcre源码包 下载链 ...
- delphi自定义事件处理
http://www.cnblogs.com/ywangzi/archive/2012/09/06/2673414.html delphi自定义事件处理 为什么我们点击按钮,就会执行按钮的oncl ...
- 类ThreadGroup
Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制. 默认的情况下,所有的线程都属于主线程组. public final Thread ...
- day18 时间:time:,日历:calendar,可以运算的时间:datatime,系统:sys, 操作系统:os,系统路径操作:os.path,跨文件夹移动文件,递归删除的思路,递归遍历打印目标路径中所有的txt文件,项目开发周期
复习 ''' 1.跨文件夹导包 - 不用考虑包的情况下直接导入文件夹(包)下的具体模块 2.__name__: py自执行 '__main__' | py被导入执行 '模块名' 3.包:一系列模块的集 ...