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中,提供了两 ...
随机推荐
- linux运维、架构之路-Lamp架构部署
一.Lamp架构原理 二.Lamp架构软件安装 1.apache安装脚本 #!/bin/sh cd /server/tools/ yum install zlib-devel -y wget http ...
- 3D世界变换
一直弄不清3D场景中scaleOrientation的作用,还有scale.orientation(roation).translation的顺序问题,以往都是试图查一下,关于前者网上几乎找不到什么清 ...
- ARC模式下delloc()注意事项
1.ARC模式下delloc()调用触发时机是对象被销毁,如self.属性=nil 2.ARC模式下delloc()里面不需要手动调用[super dealloc]; 因为系统已经自动调用,多此一举的 ...
- rk3288-cc上编写一个hello world
一.编写一个hello world驱动 懒,不写了 二.编写Kconfig和Makefile 我们在kernel/driver目录下创建一个hello目录 然后创建一个Kconfig文件: confi ...
- Bellman-ford算法、SPFA算法求解最短路模板
Bellman-ford 算法适用于含有负权边的最短路求解,复杂度是O( VE ),其原理是依次对每条边进行松弛操作,重复这个操作E-1次后则一定得到最短路,如果还能继续松弛,则有负环.这是因为最长的 ...
- 【gym102222K】Vertex Covers(高维前缀和,meet in the middle)
题意:给定一张n点m边的图,点带点权,定义点覆盖的权值为点权之积,问所有点覆盖的权值之和膜q n<=36, 1<=a[i]<=1e9,1e8<=q<=1e9 思路:n&l ...
- android 后台运行service实现和后台的持续交互
在项目中有这么一种需求 需要后台开启服务,时刻记录用户和软件的交互行为,一旦交互发生,就向服务器测发送一条消息 解决方案: 一.创建一个service服务类 在service中开启一个线程,servi ...
- 项目一、ajax上传数据(显示进度条)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- mysql5.6.36 源码安装过程
参考:http://www.linuxidc.com/Linux/2015-06/119354.htm cmake编译时,提示错误 CMake Error: The source directory ...
- (转)oracle触发器使用:after insert 与before insert的简单使用注意
本文转载自:http://blog.csdn.net/kuangfengbuyi/article/details/41446125 创建触发器时,触发器类型为after insert , 在begin ...