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中,提供了两 ...
随机推荐
- 一天久坐办公室,怎么减fei?!
久坐的危害想必看到这篇文章的,一定都百度浏览了好多文章了,所以危害大家也都知道了,这里也就不一一列出. 久坐有危害,那么怎么减少危害呢,办法是什么???那就是不久坐啦.可是因为工作性质,不久坐臣妾恐怕 ...
- 转载--C++的反思
转载自http://blog.csdn.net/yapian8/article/details/46983319 最近两年 C++又有很多人出来追捧,并且追捧者充满了各种优越感,似乎不写 C++你就一 ...
- Vue中的MVVM框架
ViewModel:数据双向绑定 场景: 针对具有复杂交互逻辑的前段应用 提供基础的架构抽象 通过Ajax数据持久化,保证前端用户体验 什么是vue.js? 是一个轻量级的mvvm框架 数据驱动+组 ...
- Linux内核调试方法总结之调试宏
本文介绍的内核调试宏属于静态调试方法,通过调试宏主动触发oops从而打印出函数调用栈信息. 1) BUG_ON 查看bug处堆栈内容,主动制造oops Linux中BUG_ON,WARN_ON用于调试 ...
- 二进制安装MySQL5.6 MySQL5.7
1:系统版本 [root@vhost1 ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 6.5 (Santiag ...
- 查看在linux中下载的图片
1.安装 yum install lrzsz -y 2.找到文件所在的位置选中之后 3.点击那个蓝色的框框里面有一个 用ZMODEM下载 4.选择要保存的位置就可以查看了
- something about motorcycle and automobile
cycle: 循环, 周期, 自行车. 摩托车: motorcycle, motor cycle 轮胎 continent(al): 大陆的, (七)大洲的; 德国的大陆轮胎, 马牌轮胎; 如吉普的c ...
- selenium启动firefox打开导入向导问题解决
操作系统:win8-64位 火狐版本:40.0.2 问题描述:selenium启动firefox时,每次启动都提示我导入其他浏览器的页签,如下图所示 解决方法一: 到firefox的profiles. ...
- Linux基础—saltstack运维工具学习
一.saltstack简介 1.saltstack是什么 系统管理员日常会进行大量的重复性操作,例如安装软件,修改配置文件,创建用户,批量执行命令等,如果主机数量庞大,单靠人工维护实在让人难以忍受. ...
- 20160513--js 弹出窗口带有iframe控件 备忘
需要引用JQuery. /*! * 主 题:<页面弹出窗口> * 说 明:用于页面弹出的窗口. * 功能描述: * 1.生成弹出窗口,窗口内包括iframe控件: * 2.窗口弹出时,生成 ...