IO流学习之字节流(一)
IO流(Input/Output)
简介:
流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出。
IO技术实际上就是让数据在电脑内存或程序系统和硬件(硬盘,内存卡)之间转换的技术。

分类:
1、按流向
输入流:读取数据,把持久设备的数据读取到内存中。
输出流:写出数据,把内存的数据写出到持久设备。
2、按种类
字节流:传输过程中,传输数据的最基本单位是字节的流,常用的文件(txt、图片、mp3、mp4等)都可以用字节流来进行IO操作。
字符流:传输过程中,传输数据的最基本单位是字符的流,一般只能用于文本文件进行IO操作。
字节流转换:字节流+编码 =》字符流 ;字符流 =》字节流 + 解码 。
字节流:
字节流就是以字节为单位进行IO操作的数据流。字节流操作基本是在File类的基础上进行操纵的!
字节流的字符编码:字符编码把字符转换成数字存储到计算机中,按ASCii将字母映射为整数。把数字从计算机转换成相应的字符的过程称为解码。
编码方式的分类:
ASCII(数字、英文):1个字符占一个字节(所有的编码集都兼容ASCII)
ISO8859-1(欧洲):1个字符占一个字节
GB-2312/GBK:1个字符占两个字节
Unicode: 1个字符占两个字节(网络传输速度慢)
UTF-8:变长字节,对于英文一个字节,对于汉字两个或三个字节。
字节流常用的流有:
- FileInputStream
- FileOutputStream
- BufferedInputStream 【BufferedInputStream不是InputStream的直接实现子类,是FilterInputStream的子类】
- BufferedOutputStream 【BufferedOutputStream不是OutputStream的直接实现子类,是FilterOutputStream的子类】
1、FileInputStream

构造函数:

常用方法:


代码实例:(基本上流程和字符流一样就不在此详细解释)
package InputOutput; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException; public class FileInputStreamDemo {
public static void main(String[] args) throws Exception {
// 指定文件路径
String filePath = "E:\\JavaCodeDemo\\InputOutput\\FileInputStream";
// 创建File对象
File file = new File(filePath, "Input.txt");
// 创建文件Input.txt,方法会进行判断,如果没有会创建文件
file.createNewFile();
// 创建字节流输入对象
FileInputStream input = new FileInputStream(file);
int flag = ;
while ((flag = input.read()) != -) {
System.out.println(flag);
}
//关闭资源
input.close();
}
}
2、FileOutputStream

构造方法:

常用方法:


代码实例:
代码1(常用方法的简单举例):
package InputOutput; import java.io.File;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.nio.channels.FileChannel; public class FileOutputStreamDemo {
public static void main(String[] args) throws Exception {
// 指定文件路径
String parentPath = "E:\\JavaCodeDemo\\InputOutput\\FileXXXStream";
// 创建File对象
File file = new File(parentPath, "Output.txt");
// 创建输出对象
FileOutputStream out = new FileOutputStream(file);
// 返回与此流相关联的文件描述符。
FileDescriptor des = out.getFD();
System.out.println(des);
// 返回与此文件输出流相关联的唯一的FileChannel对象。
FileChannel cha = out.getChannel();
System.out.println(cha);
// 调用方法进行给文件写数据
// 将指定的字节写入此文件输出流。
// out.write('a');
// 将 b.length字节从指定的字节数组写入此文件输出流。
// byte[] b = { 'a', 'b', 'c', 'd', 'e' };
// out.write(b);
// 将 len字节从指定的字节数组开始,从偏移量 off开始写入此文件输出流。
byte[] b = { 'a', 'b', 'c', 'd', 'e' };
out.write(b, , );
// 刷新,将数据写入到文件
out.flush();
// 关闭资源
out.close();
}
}
代码2(文本末尾添加数据):
package InputOutput; import java.io.File;
import java.io.FileOutputStream; public class FileOutputStreamDemo2 {
public static void main(String[] args) throws Exception {
// 指定文件路径
String parentPath = "E:\\JavaCodeDemo\\InputOutput\\FileXXXStream";
// 创建File对象
File file = new File(parentPath, "Output.txt");
// 创建输出对象,文本末尾添加
FileOutputStream out = new FileOutputStream(file,true);
for (int i = ; i < ; i++) {
// 用String的getBytes()方法,字符转换为byte
out.write(("中文" + i).getBytes());
}
// 刷新,将数据写入到文件
out.flush();
// 关闭资源
out.close();
}
}
注意:此操纵的基础是字节,所以在写数据的时候如果是字符串则需要用getBytes()方法转换为byte数组!
3、字节流实现图片复制:
package InputOutput; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class IOStreamCopy {
public static void main(String[] args) throws IOException {
// 指定读取文件得位置
String parentPath = "E:/JavaCodeDemo/InputOutput/FileXXXStream/Reader";
// 创建读取得File
File fileIn = new File(parentPath, "Ace.jpg");
// 创建字节读取流
FileInputStream in = new FileInputStream(fileIn);
// 指定写入文件得位置
String filePath = "E:/JavaCodeDemo/InputOutput/FileXXXStream/Writer";
// 创建写入得File
File fileOut = new File(filePath, "ASCE.jpg");
// 创建字节写入流
FileOutputStream out = new FileOutputStream(fileOut);
// 调用方法读取数据
int flag = -;
byte[] b = new byte[];
while ((flag = in.read(b)) != -) {
// 调用方法写数据
out.write(b, , flag);
out.flush();
}
// 关闭资源
out.close();
in.close();
}
}
结果:


如果只是写入文本文件则推荐用字符流,字符流实现文本的复制性能比较高!
调用方法System.lineSeparator()识别操作系统的换行符,只可用于文本文件,其他文件可能会破坏文件!(如果此方法报错请检查JDK版本,1.7之前的版本可能不兼容此方法)
String lineSeparator = System.lineSeparator();
while ((flag = in.read(b)) != -) {
3 out.write(b, , flag);
4 out.write(lineSeparator.getBytes());
5 out.flush();
6 }
IO流学习之字节流(一)的更多相关文章
- IO流学习之字节流(二)
字节流缓冲区: 1.BufferedInputStream 构造函数(以字节流为基础进行操作): 常用方法: 代码实例: package InputOutput; import java.io.Buf ...
- Java IO流学习总结(1)
Java IO流学习总结 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本 ...
- Java IO流学习总结四:缓冲流-BufferedReader、BufferedWriter
在上一篇文章中Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream介绍了缓冲流中的字节流,而这一篇着重介绍缓冲流中字符流Buffered ...
- Java IO流学习总结一:输入输出流
Java IO流学习总结一:输入输出流 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/54292148 本文出自[赵彦军的博客] J ...
- Java IO流学习
Java IO流学习 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是 ...
- Java IO流学习总结三:缓冲流-BufferedInputStream、BufferedOutputStream
Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ ...
- Java IO流学习总结八:Commons IO 2.5-IOUtils
Java IO流学习总结八:Commons IO 2.5-IOUtils 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/550519 ...
- Java基础-IO流对象之字节流(Stream)
Java基础-IO流对象之字节流(Stream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在前面我分享的笔记中,我们一直都是在操作文件或者文件夹,并没有给文件中写任何数据.现 ...
- Java第三阶段学习(二、IO流--------递归,字节流Stream)
一.递归 定义:指方法在方法内调用自己 适用于方法的运算主体不变,但运行的时候,参与运算的方法参数会变化注意:一定要给递归一个出口,否则内存溢出 练习题1:使用递归打印文件夹中所有的文件,包含子目录中 ...
随机推荐
- Elemetary OS deepin-wine 版 微信 和 企业微信 输入框字体显示异常解决
Elemetary OS deepin-wine 版 微信 和 企业微信 输入框字体显示异常解决 最近体验了Elementary OS 这个系统, 话说我之前都是用的Manjora 的各个桌面版, 突 ...
- 域名解析服务-DNS
一.DNS概述 DNS(Domain Name System)即域名系统.它使用层次结构的命名系统.将域名和IP相互映射 在整个互联网环境中连接了数以亿计的服务器以及个人主机.其中大部分网站都使用了域 ...
- geo常见需求
常见的地理位置相关需求有: 1.查找附近的人 2.显示两点距离 3.点是否在指定范围内(地理围栏) redis.MongoDB.mysql都已支持geo 几种geo方案对比 https://blog. ...
- win10电脑搭建网站
新建网站之后,IIS错误提示是:在计算机“.”上没有找到服务W3SVC,需要在“启动或关闭windows功能”添加.net 3.5下面的两个程序. https://img-blog.csdn.net/ ...
- Unity5.5.6 升级到 2018.4.1 打包出现的问题 : Gradle version 2.10 is required. Current version is 5.1.1
起因:最近要在googleplay上架新游戏,而谷歌要求新上架的应用要支持64位,鉴于老版本的unity不支持打包64位apk,所以决定升级unity版本到2018.4.1, 但打包过程中出现了几个问 ...
- VFP的数据策略:高级篇
VFP的数据策略:高级篇 引语 在“VFP中的数据策略:基础篇”一文中,我们研究了VFP应用程序中访问非VFP数据(如SQL Server)的不同机制:远程视图.SQL Passthrough.ADO ...
- 大数据运维尖刀班 | 集群_监控_CDH_Docker_K8S_两项目_腾讯云服务器
说明:大数据时代,传统运维向大数据运维升级换代很常见,也是个不错的机会.如果想系统学习大数据运维,个人比较推荐通信巨头运维大咖的分享课:https://url.cn/5HIqOOr,主要是实战强.含金 ...
- C语言结构体定义位域,从bit0开始,依次到最高bit位
位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据 ...
- VMware vCenter Server6.5安装及群集配置介绍
借助 VMware vCenterServer,可从单个控制台统一管理数据中心的所有主机和虚拟机,该控制台聚合了集群.主机和虚拟机的性能监控功能. VMware vCenterServer 使管理员能 ...
- 使用Vue.prototype在vue中注册和使用全局变量
在main.js中添加一个变量到Vue.prototype Vue.prototype.$appName = 'My App' 这样 $appName 就在所有的 Vue 实例中可用了,甚至在实例被创 ...