字节流与字符流

File类不支持对文件内容进行相关的操作,所有若要处理文件的内容,则需要通过流操作模式来完成。

流的基本操作步骤:

Step1:根据文件路径创建File类对象.

Step2:根据字节流或字符流的子类实例化父类对象.

Step3:进行数据的读取或写入操作.

Step4:关闭流(Close()).

(1)字节流

A. 字节输出流(OutputStream)

(1)Outputstream的类结构

public abstract class OutputStream implements Closeable, Flushable

观察OutputStream的结构,可以发现其为一个抽象类(要想对父类实例化必须使用子类)并且实现了Closeable和Flushable两个接口:

public interface Closeable extends AutoCloseable

public interface Flushable

若要通过程序对内容进行输出,则需要引入java.io.OutputStream.

(1)Outputstream类提供的方法

因为OutputStream为抽象类,所以要用子类对其进行实例化操作。我们若要对文件进行操作,则需用到FileOutputStream类对其进行实例化。

将给定字符数组的内容全部输出:

public void write(byte b[]) throws IOException

将部分字节数组的内容输出:

public void write(byte b[], int off, int len) throws IOException

输出单个字节:

public abstract void write(int b) throws IOException


  1. public class Test2 {
  2. public static void main(String[] args) throws IOException {
  3. String singal = File.separator;
  4. //1.根据文件路径创建File对象
  5. File file = new File("G:"+singal+"lemon"+singal+"testIO"+singal+"TestIO.java");
  6. //保证父目录存在
  7. if(!file.getParentFile().exists()) {
  8. //若目录不存在则创建多级目录
  9. file.getParentFile().mkdirs();
  10. }
  11. //根据字节流的子类实例化父类对象
  12. //此时只能操作File类
  13. OutputStream outputStream = new FileOutputStream(file);
  14. //使得内容实现追加操作,而非覆盖
  15. //OutputStream outputStream = new FileOutputStream(file,true);
  16. //将指定语句输出到文件的内容中
  17. String string = "今天真热啊!";
  18. //将内容变为字节数组
  19. outputStream.write(string.getBytes());
  20. //将内容变为字节数组,并且设置要输出的范围
  21. //outputStream.write(string.getBytes(),0,5);
  22. outputStream.close();
  23. }
  24. }

在进行文件输出的时候,所有的文件会自动帮助用户创建,不在需要调用createFile()方法手工创建。

当我们运行多次时发现文件中的内容仍然只有一句,这是因为FileOutputStream(File file)该构造函数只能实现内容的覆盖并不能实现内容的追加处理,若想使得内容得到追加,则需使用提供的另外一个构造函数 FileOutputStream(File file,boolean append)来实现。

实现追加输出运行结果如下:

将给定部分内容输出结果如下:

(2)字符流

字符流适用于处理中文数据

A. 字符输出流(Writer)

public abstract class Writer implements Appendable, Closeable, Flushable比OutputStream多实现了一个Appendable接口。

在Writer类里面也提供write()方法,而且该方法接收的类型都是char型,要注意的是,Writer类提供了一个直接输出字符串的方法

public void write(String str) throws IOException

Writer类的结构与方法的使用与OutputStream非常相似,只是Writer类对于中文的支持很好并且提供了直接写入 String的方法而已。


  1. /*
  2. * 字符输出流
  3. * */
  4. public class Test2{
  5. public static void main(String[] args) throws IOException {
  6. String singal = File.separator;
  7. //1.根据文件路径创建File对象
  8. File file = new File("G:"+singal+"lemon"+singal+"testIO"+singal+"TestIO.java");
  9. //利用子类实例化父类对象
  10. Writer writer = new FileWriter(file);
  11. writer.write("你好");
  12. writer.close();
  13. }
  14. }

B. 字符输入流(Reader)

public abstract class Reader implements Readable, Closeable

Reader仍然为抽象类,若要对文件进行读取操作,则要使用FileReader对其进行实例化操作。

由上面的Writer类中可知其提供的方法可以直接向目标源写入字符串,但是Reader类提供的方法中只能通过字符数组进行读取操作,而没有直接的方法使其可以直接读取字符串类型。


  1. /*
  2. * 字符输入流
  3. * */
  4. public class Test2{
  5. public static void main(String[] args) throws IOException {
  6. String singal = File.separator;
  7. //1.根据文件路径创建File对象
  8. File file = new File("G:"+singal+"lemon"+singal+"testIO"+singal+"TestIO.java");
  9. //利用子类实例化父类对象
  10. Reader reader = new FileReader(file);
  11. char[] cs = new char[1024];
  12. int len = reader.read(cs);
  13. String result = new String(cs,0,len);
  14. System.out.println(result);
  15. //关闭流
  16. reader.close();
  17. }
  18. }

(3)字符流与字节流的区别

A. 字节流是原生操作,而字符流是经过加工处理后的操作。

B. 字符流适合处理中文,字节流适合处理一切数据类型(对中文支持不好)。

C. 所有字符流的操作,无论是写入还是输出,数据都先保存在缓存中。

D. 如果字符流不关闭,数据就有可能保存在缓存中并没有输出到目标源。这种情况下就必须强制刷新才能够得到完整数据。


  1. public class Test2{
  2. public static void main(String[] args) throws IOException {
  3. String singal = File.separator;
  4. //1.根据文件路径创建File对象
  5. File file = new File("C:"+singal+"Users"+singal+"lenovo"+singal+"DeskTop"+singal+"Test.txt");
  6. if(!file.getParentFile().exists()) {
  7. file.getParentFile().mkdirs();
  8. }
  9. Writer writer = new FileWriter(file);
  10. writer.write("hello world !");
  11. //进行刷新,若不进行刷新,则内容无法写入
  12. //强制清空所有缓冲区内容,所有内容都输出
  13. //writer.flush();
  14. }
  15. }


javaIO——输入输出流的更多相关文章

  1. Java-IO 输入输出流详解

    一.文件的编码               开发时一定要注意项目默认的编码!!!!!!!!               文件操作的时候一定要记得关闭!!!!!!!!        ASCII:美国标准 ...

  2. java.IO输入输出流:过滤流:buffer流和data流

    java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...

  3. Java中IO流,输入输出流概述与总结

    总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...

  4. 第27章 java I/O输入输出流

    java I/O输入输出流 1.编码问题 import java.io.UnsupportedEncodingException; /** * java涉及的编码 */ public class En ...

  5. java 对象输入输出流

    对象的输入输出流的作用: 用于写入对象 的信息读取对象的信息. 对象的持久化. 比如:用户信息.              ObjectInputStream   : 对象输入流            ...

  6. 【转】输入/输出流 - 全面掌握IO

    File类: 程序中操作文件和目录都可以使用File类来完成即不管是文件还是目录都是使用File类来操作的,File能新建,删除,重命名文件和目录,但File不能访问文件内容本身,如果需要访问文件本身 ...

  7. 输入输出流(IO)

    输入输出流(IO)文件(File)java.io.File用于表示文件(目录),也就是说程序员可以通过File类在程序中操作硬盘上的文件和目录.File类只用于表示文件(目录)的信息(名称.大小等), ...

  8. Java输入/输出流体系

    在用java的io流读写文件时,总是被它的各种流能得很混乱,有40多个类,理清啦,过一段时间又混乱啦,决定整理一下!以防再忘 Java输入/输出流体系 1.字节流和字符流 字节流:按字节读取.字符流: ...

  9. JAVA Io 缓冲输入输出流

    java中提供带缓冲的输入输出流.在打开文件进行写入或读取操作时,都会加上缓冲,提高了IO读写性能. 1. BufferedInputStream 缓冲输入流 2. BufferedOutputStr ...

随机推荐

  1. Jmeter 正则表达式提取Response Headers,Response Body里的值

    实践过程中遇到需要提取Response Headers,Response Body里的值 一.获取Response Body的值,这里采用json提取器形式 1.Response Body返回值,如下 ...

  2. 计算机网络-3-5-以太网MAC层及交换机

    MAC层的硬件地址 在局域网中,硬件地址又称为物理地址或者MAC地址(因为这种地址用在MAC帧中) IEEE 802标准为局域网规定了一种48位(6字节)的全球地址,固化在适配器的ROM中. 如果计算 ...

  3. Flink 实践教程:入门(6):读取 PG 数据写入 ClickHouse

    作者:腾讯云流计算 Oceanus 团队 流计算 Oceanus 简介 流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的具备一站开发.无缝连接.亚 ...

  4. k8s网络模型与集群通信

    在k8s中,我们的应用会以pod的形式被调度到各个node节点上,在设计集群如何处理容器之间的网络时是一个不小的挑战,今天我们会从pod(应用)通信来展开关于k8s网络的讨论. 小作文包含如下内容: ...

  5. [bzoj2400]Optimal Marks

    首先肯定每一位单独考虑,对于每一位,源点连向该位点权为0的节点inf的边,点权为1的节点连向汇点inf的边,每一条无向边拆成两条流量为1的有向边,跑最小割. 考虑一组割,一定将原图划分成源点和汇点两部 ...

  6. [noi38]游戏

    用线段数维护一段区间内的两个信息:1.需要多少经验就可以让有一个人升级,2.等级和.单点修改直接暴力做就可以,区间修改考虑如果这个区间不会产生升级就不递归下去而是打上懒标记. 考虑这个算法的时间复杂度 ...

  7. IPv6 寻址方式简介

     在计算机网络中,寻址模式是指在网络上托管地址的机制.IPv6 提供了多种类型的模式,可以通过这些模式对单个主机进行寻址.也可以同时对多个主机进行寻址或者寻址最近距离的主机. 单播寻址 在单播寻址方式 ...

  8. 2017Java前景怎么样?

    当今社会互联网软件行业属于高薪技术行业,伴随着互联网的发展Java在Web领域的优势也日渐凸显,并且java语言本身就应用最广泛,最高效.据说,全球有25亿Java器件运行着Java,450多万Jav ...

  9. 【洛谷1340】兽径管理(最小生成树 Kruskal)(sort的一些技巧)【2012福建省信息学奥林匹克CCF NOIP夏令营第05天训练】

    Description 约翰农场的牛群希望能够在 N 个(1<=N<=6000) 草地之间任意移动.草地的编号由 1到 N.草地之间有树林隔开.牛群希望能够选择草地间的路径,使牛群能够从任 ...

  10. PowerDotNet平台化软件架构设计与实现系列(05):ETCD分布式键值存储平台

    ETCD目前在PowerDotNet已经被用于注册中心和配置管理(常见的配置中心在PowerDotNet中仅仅是一个小小的模块而已)中,作为基础设施的重要组成部分,ETCD的重要性不言而喻. 本文简单 ...