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流详解及测试代码的更多相关文章

  1. 基于JavaSE阶段的IO流详解

    1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有 ...

  2. java IO流详解

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  3. IO流详解

    目录 IO流 IO流概述及其分类 IO概念 流按流向分为两种: 流按操作类型分为两种: 常用的IO流类 字节流的抽象父类: 字符流的抽象父类: InputStream & FileInputS ...

  4. Java IO流详解(五)——缓冲流

    缓冲流也叫高效流,是处理流的一种,即是作用在流上的流.其目的就是加快读取和写入数据的速度. 缓冲流本身并没有IO功能,只是在别的流上加上缓冲效果从而提高了效率.当对文件或其他目标频繁读写或操作效率低, ...

  5. Java IO流详解(二)——File类

    在上一章博客中简单的介绍了Java IO流的一些特征.也就是对文件的输入输出,既然至始至终都离不开文件,所以Java IO流的使用得从File这个类讲起. File类的描述:File类是文件和目录路径 ...

  6. Java io流详解二

    原文地址https://www.cnblogs.com/xll1025/p/6418766.html 一.IO流概述 概述: IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间 ...

  7. 《Java基础知识》Java IO流详解

    Java IO概念 1. 用于设备之间的数据传输. 2. Java 将操作数据流的功能封装到了IO包中. 3. 数据流流向分:输入流和输出流,操作对象为文件. 4. 流按照操作数据分:字节流(通用)和 ...

  8. Java IO流详解(六)——转换流

    转换流也是一种处理流,它提供了字节流和字符流之间的转换.在Java IO流中提供了两个转换流:InputStreamReader 和 OutputStreamWriter,这两个类都属于字符流.其中I ...

  9. Java IO流详解(三)——字节流InputStream和OutPutStream

    我们都知道在计算机中,无论是文本.图片.音频还是视频,所有的文件都是以二进制(字节)形式存在的,IO流中针对字节的输入输出提供了一系列的流,统称为字节流.字节流是程序中最常用的流.在JDK中,提供了两 ...

随机推荐

  1. Python3 面向对象-类的继承与派生

    1.什么是继承? 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类可称为基类或超类,新建的类称为派生类和或子类. 子类会遗传父类的属性,从而解决代码重用问题. ...

  2. 阿里云服务器tomcat能启动,但是不能访问问题。

    显示时间过长. 解决方案: 可以看到就可以访问了.百度云的就没有这个问题.

  3. 判断Java对象存活的算法、垃圾回收算法

    判断Java对象存活的算法 一.引用计数算法 给对象添加一个引用计数器,每当一个地方引用它的时候就将计数器加1,当引用失效的时候就将计数器减1,任何时刻计数器为0的对象都不可再被使用.这种算法虽然简单 ...

  4. 判断div里面的子集是否含有特定的类

    if($('#BankCardId .card').length){ alert("请绑定银行卡"); } if ($('#user-20130011 #age-20130011' ...

  5. 【bzoj1123】[POI2008]BLO

    *题目描述: Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. *输入 输入n<=1000 ...

  6. php开发IDE选择

    优先选择Netbeans,理由如下:: 1.ZendStudio有的方便特性Netbeans也提供,如:ctrl+f5也支持ctrl+shift+r的文件选择功能,[git | svn]团队代码管理. ...

  7. JAVA-IO模型(BIO,NIO,AIO)

    基本概念 阻塞和非阻塞 阻塞是进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待, 直到有东西可读或者可写为止 非阻塞是如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等 ...

  8. 报错信息:ORA-00979:不是GROUP BY表达式

    如图所示 参考:https://blog.csdn.net/linan0930/article/details/16508025 解决方案:即select 列表项中不存在的列可以出现在group by ...

  9. [CSP-S模拟测试]:计数(DP+记忆化搜索)

    题目描述 既然是萌萌哒$visit\text{_}world$的比赛,那必然会有一道计数题啦!考虑一个$N$个节点的二叉树,它的节点被标上了$1\sim N$的编号.并且,编号为$i$的节点在二叉树的 ...

  10. Mac sublime安装package controller

    https://packagecontrol.io/installation#st2  链接被墙了这个. 我拿来放在这里. The simplest method of installation is ...