FileInputStream和FileOutStream的使用——文件字节输入/输出流
最近又退回到java EE的学习,这篇博客就来讲解一下字节流中最重要的两个类FileInputStream和FileOutputStream的用法:
- FileInputStream:全称是文件字节输入流,属于字节流,作用是按字节读取的方式读取文件,继承InputStream类;
- FileOutputStream:全称是文件字节输出流,属于字节流,作用是以字节的方式向文件写入内容,继承OutputStream类;
一、FileInputStream用法:
创建FileInputStream类对象用两种方式,一种是直接在构造方法中传入表示文件位置的字符串;第二种就是创建一个表示文件位置的File对象,然后在FileInptuStream的构造方法中传入这个File对象。创建FileInputStream对象会抛出一个FileNotFoundException异常。下面的代码演示了两种创建方式:
对象创建完成,就可以调用FileInputStream类中的方法读取文件中的内容了。读取文件中的内容的方法叫做read方法,这个方法继承自父类,在子类中有多个同名的重载方法。
1、使用read()方法一次读取一个字节
使用read()方法读取文件,这个方法将会读取文件中的一个字节,并将读取到的字节大小返回,然后跳到下一个字节;若读到了文件结尾,则返回-1。如下代码演示了这个方法:
上面代码先创建了一个FileInputStream对象,然后使用read方法读取文件中的内容,接收返回值并输出,这一过程重复两次。读取的文件中,只用一个字母a。而运行结果如右图:
第一次读取到的字节大小是97,这正是字符‘a’的ASCII码大小,而读取完第一个字节后跳到下一个字节再次读取,而此时文件内容已经结束,所以返回-1。read方法和close方法都会抛出一个IOException,而它是ClassNotFoundException的父类,所以抛出IOException的同时也算抛出了ClassNotFoundException。
为了将文件中的内容读完,我们可以使用循环,判断是read的返回值是否为-1,若不为,则表示文件未读取完。而若是-1,则表示读取到了文件的最后一个字节,结束循环,文件读取完毕,代码如下:
2、使用read( byte[] bytes )方法一次读取多个字节
使用read( byte[] bytes)方法读取文件,传入的是一个byte类型的数组,这个方法将一次读取多个字节(一次读取的字节个数取决于byte数组的大小),将读取到的字节放入传入的byte数组中,并返回读取到的字节个数,若读取到文件末尾,返回-1。如下是使用read( byte[] bytes)方法读取文件的代码:
上面的代码创建了一个大小为1024的byte数组(推荐为1024或者1024的倍数),并使用read( byte[] bytes)方法来一次读取多个字节,返回的是读取到的字节个数,文件内容以及程序运行结果如下:
因为byte数组大小1024个字节,所以一次就将文件中全部字节读取完,并返回字节个数26。而第二次读取时,已经到达了文件末尾,所以并未读取到字节,返回-1。为了方便查看,上面的代码使用了String类的一个构造方法,将一个byte数组转换为字符串,转换byte数组中从0位置开始,后面的len个单位。
而此方法也可以和循环配合使用,一次性将文件中的内容读取完毕。代码如下:
二、FileOutputStream的用法
FileOutputStream的使用方式与FileInputStream类似,创建FileInputStream对象也是传入一个表示文件位置的字符串,可以是相对位置,也可以是绝对位置。FileOutputStream类是用来向文件中写入字节的,如果写入的文件不存在,将会创建这个文件(前提是路径存在)。FileInputStream对象通过调用write方法向文件中写入,写入的方式也和read方法类似,有几种不同的形式,下面就来看看。
1、使用 write(int b) 方法向文件中写入一个字节
使用 write(int b) 方法可以向文件中写入一个字节,写入的字节大小就是方法的参数。write方法会抛出一个IOException异常。下面代码演示如何调用这个方法,向文件中写入大小为97的字节,也就是‘a’的ASCII码:
方法执行完毕,打开文件,查看文件中的内容是一个a,因为记事本等文本编辑器会自动将字节转为字符,方便查看,文件截图如下:
2、使用 write(byte[] bytes) 方法向文件中写入多个字节
使用write(byte[] bytes)方法,参数为一个字节数组,可以向文件中写入多个字节。我们先将需要写入文件的字节存入字节数组中,再将字节数组作为参数传入write方法,就可以实现同时写入多个字节:
结果如下:
3、使用 write(byte[] bytes,int off,int len) 方法将字节数组中的部分内容写入文件
write方法还可以扩展,有时我们传入一个字节数组作为write方法的参数,但是我们并不想将字节数组中的全部内容写入文件,只想写入其中的一部分,这时则可以使用write(byte[] bytes,int off,int len) 方法,方法的第一个参数为字节数组,第二个参数为字节数组中写入文件部分的起始下标,第三个参数是从起始下标开始,要写入的个数,测试代码如下:
上面调用write(byte[] bytes,int off,int len) 方法,从字节数组中下标为2的元素开始,写入两个元素,也就是字节67与68,这两个字节对应的字符为C和D:
三、FIleInputStream与FileOutputStream综合案例——复制文件
我们知道,在计算机中,所有的东西都是由字节(也就是二进制数据)组成,所以我们可以通过这两个字节流类实现文件的复制。,下面使用这两个类实现一个文件的复制,这里将复制一张照片,复制方法:使用FileInputStream类读取文件,然后将读取到的字节通过FileOutputStream类写入到另外一个位置,这样就实现了复制。我们可以使用read()方法以及write(int b)方法一次复制一个字节,但是这样速度太慢,下面的代码将使用read(byte[] bytes)以及write(byte[] bytes)方法,一次复制多个字节,提高效率。下面是代码:
FileInputStream和FileOutStream的使用——文件字节输入/输出流的更多相关文章
- Java修炼——文件字节输入输出流复制和缓冲流复制
一:文件字节输入输出流复制 首先明确数据源和目的文件,然后就是"中转站",最后就是关闭 package com.bjsxt.ioproject; import java.io.Fi ...
- Java IO详解(一)------字节输入输出流
File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...
- Java IO详解(三)------字节输入输出流
File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...
- 《三》Java IO 字节输入输出流
那么这篇博客我们讲的是字节输入输出流:InputStream.OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam.FileOutStream) ...
- java学习笔记IO之字节输入输出流
IO字节输入输出流 OutputStream:字节输出流 该抽象类是所有字节输出流的超类: 定义了一些共性的成员方法: 1.写入一个字节 void write(int b);//b表示字节 2.写入字 ...
- Java基础之文件的输入输出流操作
在介绍输入输出流之前,首先需要了解如何创建文件,创建文件夹以及遍历文件夹等各种操作,这里面不在一一介绍,主要介绍的是文件的输入输出流操作. 在起初学习文件操作之前,总是喜欢将输入输出弄混淆,后来通过看 ...
- Java 7源码分析第13篇 - 字节输入输出流(1)
上一篇介绍了关于字节输入输出流的Java类框架,同时也简单介绍了一下各个类的作用,下面就来具体看一下这些类是怎么实现这些功能的. 1.InputStream和OutputStream InputStr ...
- IO流 - 字节输入输出流,文件的复制
IO流 I:input - 输入(读取),eg:把硬盘的内容读取到内存 O: output - 输出(写入) eg:把内存中的东西写入硬盘保存 流:数字(字符/字节) 一般1个字符=2Byte,1By ...
- Java基础IO类之字节输入输出流
一.IO流概述 1.IO流:输入输出流(Input/Output) 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象,即数据在设备间的传输流, 流的本质是数据传输,根据数据传输特性将 ...
随机推荐
- [Python] WeChat_Robot
在微信中接入一个聊天机器人 1. WeChat 个人接口itchat 2. 图灵机器人 #-*- coding:utf-8 -*- import itchat import requests apiU ...
- 深入浅出 Java Concurrency (11): 锁机制 part 6 CyclicBarrier
如果说CountDownLatch是一次性的,那么CyclicBarrier正好可以循环使用.它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).所谓屏障 ...
- 温故而知新-WebSocket 教程
一.为什么需要 WebSocket? 初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答案很简单,因为 HTTP 协议有 ...
- 【源码阅读】Java集合之三 - ArrayDeque源码深度解读
Java 源码阅读的第一步是Collection框架源码,这也是面试基础中的基础: 针对Collection的源码阅读写一个系列的文章,本文是第三篇ArrayDeque. ---@pdai JDK版本 ...
- (转) Linux下Setuid命令!
在Linux系统中每个普通用户都可以更改自己的密码,这是合理的设置. 问题是:用户的信息保存在文件/etc/passwd中,用户的密码保存在文件/etc/shadow中,也就是说用户更改自己密码时是修 ...
- UNITY Destroy()和DestroyImadiate()都不会立即释放对象内存
如题,destroyimadiate是立即将物体从场景hierachy中移除,并标记为 "null",注意 是带引号的null.这是UNITY内部的一个处理技巧.关于这个技巧有很争 ...
- Platform Dependent Compilation
[Platform Dependent Compilation] 1.Platform Defines 2.在Project Setting -> Player 面板的Other Setting ...
- Spark之 Spark Streaming整合kafka(并演示reduceByKeyAndWindow、updateStateByKey算子使用)
Kafka0.8版本基于receiver接受器去接受kafka topic中的数据(并演示reduceByKeyAndWindow的使用) 依赖 <dependency> <grou ...
- 【算法】2-sat问题【模板】
什么是2-sat问题 有n个布尔型变量xi,另外m个需要满足的条件.每个条件都是“xi为真/假或者xj为真/假”.这句话中的“或者”意味着两个条件中至少有一个正确.2-sat问题的目标是给每个变量赋值 ...
- ubuntu 重启显卡报错 nvidia
1.我装玩显卡以后重启报错了 解决了5个小时才解决,先贴个当时报错的图 第一个图是没有加nomodeset 出先的 当你出现第二个图片的时候证明你离成功不远了 从头开始: 1.开机,出现 ubuntu ...