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中,提供了两 ...
随机推荐
- Quick BI的SQL传参建模可以用在什么场景
Quick B的SQL传参建模功能提供基于SQL的数据加工处理能力,减轻了IT支撑人员的工作量.在即席查询SQL中,我们用物理字段显示别名来表示参数的占位符,配置完占位符后,就可以在查询控件中进行参数 ...
- warp(图像仿射变换)
仿射变换是一种二维坐标(x,y)到二维坐标(u,v)的线性变换. 对应的齐次坐标矩阵表示形式为: 仿射变换特点: 直线经仿射变换后依然为直线: ’直线之间的相对位置关系保持不变,平行线经仿射变换后依然 ...
- 大数据笔记(十四)——HBase的过滤器与Mapreduce
一. HBase过滤器 1.列值过滤器 2.列名前缀过滤器 3.多个列名前缀过滤器 4.行键过滤器5.组合过滤器 package demo; import javax.swing.RowFilter; ...
- 10 Django与Ajax
知识预览 1. Ajax 2. 文件上传 Ajax Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用J ...
- win10文件夹不自动刷新的解决方案
win10文件夹不自动刷新的解决方案 https://jingyan.baidu.com/article/d7130635d45a5013fcf47544.html
- (转)Matplotlib的子图subplot的使用
转:https://www.jianshu.com/p/de223a79217a 前言 Matplotlib的可以把很多张图画到一个显示界面,这就设计到面板切分成一个一个子图.这是怎么做到的呢.mat ...
- 标签button:点击button按钮时,出现了页面自动刷新的情况
原html: <button class="btn btn-primary" id="btnSubmit" name="btnSubmit&qu ...
- canvas 方块旋转案例
<!doctype html><html><head> <meta charset="UTF-8"> <meta name=& ...
- navigation ObtacleCostFunction源码分析
ObtacleCostFunction 定义了一个ObstacleCostFunction类,继承自Trajectory类,Trajectory类有8个类参 总共有8个类参 double xv_,yv ...
- 数位dp好题整理+自己wa过的细节记录
花(fa)神的数论题 三倍经验:烦人的数学作业 windy数 手机号码 同类分布(博客先鸽着) 板子固然好,细节无限多. 花式wa题法,警示后来人. 1.手残害人不浅 (蒟蒻的我掉坑里不止一次) 2. ...