[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)

简介:
上季内容回顾:
File类 
RandomAccessFile类
 ---> 文件读、写操作
本季主要知识点:
1、字节流:InputStream、OutputStream 
2、字符流:Reader、Writer
字节流和字符流
image
InputStream和OutputStream
image
为什么现在非要用子类去实例化InputStream和OutputStream呢?
查JDK文档
image 
先完成向文件中写入数据: 
OutputStream定义: 
public abstract class OutputStream
extends  Object
implements  Closeable Flushable
OutputStream是一个抽象类,如果是抽象类,则肯定要用其子类进行对象的实例化。
如果要向文件中保存,则要使用FileOutputStream。
就用这两个类完成向文件中写入一个字符串的目的。
FileOutputStream构造方法: 
· public FileOutputStream(File file) throws FileNotFoundException:以File类的对象创建文件输出流 
· public FileOutputStream(File file,boolean append) throws FileNotFoundException:以File类的对象创建文件输出流,在最后的append参数表示的是是否在文件后面追加内容,默认是追加的。 
· public FileOutputStream(String name) throws FileNotFoundException:直接写入文件的路径,进行输出操作,实际上里面就自动包含了一个File类的对象,自动进行实例化 
· public FileOutputStream(String name, boolean append) throws FileNotFoundException
向输出流中写入内容: 
public void write(byte[] b) throws IOException 
现在要写入的内容是一个字符串,但是write方法接收的只能是一个byte数组,必须把字符串变为字符数组才可以。
image
image
以上的程序为字节的输出流,因为最终结果都是把字符串变为了byte数组了。 
追加的时候就直接在后面写上一个控制的标记,内容为true: out = new FileOutputStream(f,true) ;
image
看下效果:
image
现在我们灵活点哈~由外部输入
image
image
能否通过程序把在文件中的内容读进来呢? 
InputStream --> 字节肯定是byte数组 
文件中的内容都是字节
InputStream中的方法: 
把byte数组变为字符串就直接找String的构造方法。
image
image
看下效果:因开辟byte[1024]空间,当读完文件中内容后剩余空间读不到数据就报错输出"?"符号。
image  
下面解决读取报错问题哈~
image
看下效果,现在出错的问号没有了,都换成空格了哈~
image
下面我们想办法将空格去掉哈~定义一个计数,计算到底一共读了多少位
image
看下效果:
image
如果直接使用InputStream类中的read()方法读取,则必须一个一个读,当文件读到底(read的返回值为-1时就表示文件读到底),则退出循环,之后用String把byte数组变为字符串输出。
使用另外一个read方法,传入一个byte数组,之后由类自动把内容赋给byte数组。
image
看下修改后的效果是否一样哈~
image
在字节流的操作中,可以发现一切都必须以byte数组为标准。
字符流:直接支持字符的操作 
Reader、Writer
使用Writer向文件中写入内容:
image
看下效果有没写入数据哈~
image
与之前的OutputStream在使用上是非常相似的,只是现在可以直接操作字符串了。
Reader的使用:
image
image
关于OutputStream与Writer及InputStream与Reader到底有那些区别呢? 
· 字节流是没有使用到缓冲区的,是直接操作文件的 
· 字符流是使用到了缓冲区,所有的内容要先放在缓冲区中,之后才能向文件中写入。
OutputStream
image
看下效果:文件流最后没有关闭,内容也依然可以输出
image
现在把程序换成字符流,又会如何?
image
发现如果不关闭,则内容是无法输出的,因为内容全部都在缓冲区中,之前是因为调用了close()方法,所以会自动把缓冲区给清空掉。
image
可以直接使用强制性的把缓冲内容输出的操作完成。 
public abstract void flush() throws IOException
image
看下效果:
image
证明字节流不使用缓冲区,字符流使用到缓冲区~~~
总结
练习题(下季讲解哈~~~)
image
掌握四个类的基本操作: 
InputStream、OutputStream、Reader、Writer,分别的四个文件的操作子类:FileXxx之类。

############################################










本文转自redking51CTO博客,原文链接:http://blog.51cto.com/redking/133113,如需转载请自行联系原作者

相关文章
|
1天前
|
缓存 监控 Java
Java中的并发编程:理解并应用线程池
在Java的并发编程中,线程池是提高应用程序性能的关键工具。本文将深入探讨如何有效利用线程池来管理资源、提升效率和简化代码结构。我们将从基础概念出发,逐步介绍线程池的配置、使用场景以及最佳实践,帮助开发者更好地掌握并发编程的核心技巧。
|
3天前
|
Java 数据库连接 数据库
Java服务提供接口(SPI)的设计与应用剖析
Java SPI提供了一种优雅的服务扩展和动态加载机制,使得Java应用程序可以轻松地扩展功能和替换组件。通过合理的设计与应用,SPI可以大大增强Java应用的灵活性和可扩展性。
22 11
|
3天前
|
Java 数据处理
技术分享:高效与灵活并存——Java版通用树形结构转换工具的实现与应用
在软件开发中,树形结构的数据表现形式无处不在,从文件系统的目录树到组织架构的部门树,再到各类产品的分类结构。处理这些具有层级关系的数据时,将其转换为树形结构以便展示和操作显得尤为重要。Java作为一门成熟的编程语言,虽然提供了强大的集合框架,但并未直接提供树形结构转换的内置工具。因此,开发一个高效且灵活的通用树形结构转换工具成为许多项目中的必备需求。
10 2
|
8天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
10天前
|
数据采集 存储 前端开发
Java爬虫开发:Jsoup库在图片URL提取中的实战应用
Java爬虫开发:Jsoup库在图片URL提取中的实战应用
|
12天前
|
Java
java代码和详细的代码应用
代码块分为局部、构造、静态和同步代码块。局部代码块控制变量生命周期,例如 `int a` 只在特定代码块内有效。构造代码块用于创建对象时执行附加功能,避免构造方法中代码重复。静态代码块随类加载执行一次,常用于初始化操作。同步代码块确保多线程环境下方法执行的原子性,通过 `synchronized` 关键字实现。
22 3
|
11天前
|
Java Spring 开发者
Java Web开发新潮流:Vaadin与Spring Boot强强联手,打造高效便捷的应用体验!
【8月更文挑战第31天】《Vaadin与Spring Boot集成:最佳实践指南》介绍了如何结合Vaadin和Spring Boot的优势进行高效Java Web开发。文章首先概述了集成的基本步骤,包括引入依赖和配置自动功能,然后通过示例展示了如何创建和使用Vaadin组件。相较于传统框架,这种集成方式简化了配置、提升了开发效率并便于部署。尽管可能存在性能和学习曲线方面的挑战,但合理的框架组合能显著提升应用开发的质量和速度。
23 0
|
11天前
|
设计模式 安全 Java
Java编程中的单例模式实现与应用
【8月更文挑战第31天】在Java的世界里,单例模式是构建高效且资源友好应用的基石之一。本文将深入浅出地介绍如何通过单例模式确保类只有一个实例,并提供一个全局访问点。我们将探索多种实现方法,包括懒汉式、饿汉式和双重校验锁,同时也会讨论单例模式在多线程环境下的表现。无论你是Java新手还是资深开发者,这篇文章都将为你打开一扇理解并有效应用单例模式的大门。
|
12天前
|
Java 程序员 API
从代码中寻找平衡:’java代码块和具体的代码应用
Java 8 引入的 Lambda 表达式是一项革命性特性,使编写简洁、灵活且易维护的代码成为可能。Lambda 表达式作为一种匿名函数,支持任意数量参数和返回值,其基本语法为 `(parameters) -> expression` 或 `(parameters) -> { statements; }`。
25 0
|
12天前
|
Java 程序员 调度
Java中的多线程基础与实战应用
【8月更文挑战第30天】在Java的世界里,多线程是提升程序性能的利器,但也是新手开发者常碰壁的难点。本文旨在通过浅显易懂的语言和生动的比喻,带领读者走进Java多线程的大门。我们将从线程的基本概念出发,逐步深入到线程的创建、启动、管理以及同步机制,最后通过一个简易版的图书管理系统实例,展示如何在实际开发中灵活运用多线程技术。