JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习
JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习
JAVA之旅林林总总也是写了二十多篇了,我们今天终于是接触到了I/O了。如果你初学,不懂IO流,你可以从前往后慢慢看,但是你工作了一段时间你会发现,流的使用场景以及技术点是非常的强硬的,我们势必要掌握这个知识点,如果你觉得翻阅API比较鼓噪,看视频得不到精髓,看书看不到要点,你就跟随我的JAVA之旅,一起去探索吧!
一.I/O概述
I/O全名:Input Output,输入输出的意思
- IO流用来处理设备之间的数据传输
- JAVA对数据的操作都是通过流的方式
- JAVA用于操作流的对象都在IO包里
- 流操作分两种:字节流,字符流
- 流按流向分为:输入流,输出流
对数据的操作,其实就是File文件,我们可以去网上偷张图片来描述我们本大系列的所有知识点
图片来自于网络
字节流的抽象积累
- InputStream
- OutputStream
字符流的抽象基类
- Reader
- Writer
从图中可以看出,都是从这四个类中派生出来的子类,但是他们的后缀都是这四个
二.FileWriter
我们先从字符流开始,肯定是从子类对象下手,我们对文件操作开始吧!
- 需求:在硬盘上创建一个文件,并且写入数据
那我们怎么去做?他构造函数比较多的,我们看例子
package com.lgl.hellojava;
import java.io.FileWriter;
import java.io.IOException;
public class HelloJJAVA {
public static void main(String[] args) {
/**
* 需求:在硬盘上创建一个文件,并且写入数据
*/
// 一被初始化就必须要有被操作的文件
// 如果不指定位置,就创建在同目录下
// 如果目录下存在同名文件,覆盖
try {
FileWriter fileWriter = new FileWriter("test.txt");
// 写入数据到内存
fileWriter.write("abcde");
// 刷新该流的缓冲
// fileWriter.flush();
// 关闭流 关闭之前会刷新,和flush的区别在于flush刷新后流可以继续工作
fileWriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这样在我们的项目根目录下就可以看到生成的文件了
我用白话再说一遍吧,其实就是创建fileWriter ,他没有空构造函数,你创建一个文件,可以传文件名或者路径,然后wirter写数据,这样你是看不到的,你需要刷新,刷新是刷新缓冲区,你现在就可以看到了,抛异常,还有关闭,关闭之前会刷新的,但是这个流就没用了,根据自己的场景来分析
三.IOException、
我们来看看怎么处理IO的异常,IO异常大致有三个,一个是IO异常,一个是找不到文件异常,还有一个就是没有对象异常了,我们比较严谨的写法
package com.lgl.hellojava;
import java.io.FileWriter;
import java.io.IOException;
public class HelloJJAVA {
public static void main(String[] args) {
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter("demo.txt");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (fileWriter != null) {
fileWriter.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
四.文件续写
我们知道,文件存在的话就会覆盖,但是我们不想这样,我们想在原有的数据中续写,这该去怎么做?
package com.lgl.hellojava;
import java.io.FileWriter;
import java.io.IOException;
public class HelloJJAVA {
public static void main(String[] args) {
try {
//参数2代表不覆盖已有的文件,支持续写
FileWriter fileWriter = new FileWriter("demo.txt",true);
fileWriter.write("你好");
fileWriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
构造传参的时候设置为true就可以续写文件了
五.FileReader
既然写已经会了,那我们就来读取了
package com.lgl.hellojava;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class HelloJJAVA {
public static void main(String[] args) {
try {
// 创建一个文件读取流对象,和指定名称的文件关联,保证文件存在,
// 如果不存在,异常
FileReader fileReader = new FileReader("demo.txt");
// 读取单个字符,自动往下读
int cd = fileReader.read();
System.out.println((char) cd);
//全部打印
int ch = 0;
while ((ch = fileReader.read()) != -1) {
System.out.println(ch);
}
fileReader.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这样就可以按照字节读取了,我们也可以把读到的字符存储在数组中
package com.lgl.hellojava;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class HelloJJAVA {
public static void main(String[] args) {
try {
FileReader fileReader = new FileReader("demo.txt");
char[] buf = new char[3];
int num = fileReader.read(buf);
System.out.println("num:" + num + new String(buf));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
OK,读出来了
六.小练习
我们字符流的读取和一些小操作算是了解了一点了,我们用一个小练习来结束本篇幅吧
- 需求:读取一个.java的文件,打印出来
好的,其实这个是比较简单的,我们看代码
package com.lgl.hellojava;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class HelloJJAVA {
public static void main(String[] args) {
try {
FileReader fileReader = new FileReader("Single.java");
char[] cs = new char[1024];
int num = 0;
while ((num = fileReader.read(cs)) != -1) {
System.out.println(new String(cs, 0, num));
}
fileReader.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
是不是比较简单,读取到之后就直接存在数组中,打印出来
OK,到这里我们的IO入门算是了解了一点,不过这还不够,我们应该继续深入一下,我们下一篇继续跟进IO,敬请期待!
欢迎加群:555974449,我们一起探索!
JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习的更多相关文章
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...
- Java开发学习(二十四)----SpringMVC设置请求映射路径
一.环境准备 创建一个Web的Maven项目 参考Java开发学习(二十三)----SpringMVC入门案例.工作流程解析及设置bean加载控制中环境准备 pom.xml添加Spring依赖 < ...
- Java从零开始学二十四(集合工具类Collections)
一.Collections简介 在集合的应用开发中,集合的若干接口和若干个子类是最最常使用的,但是在JDK中提供了一种集合操作的工具类 —— Collections,可以直接通过此类方便的操作集合 二 ...
- Java学习笔记二十四:Java中的Object类
Java中的Object类 一:什么是Object类: Object类是所有类的父类,相当于所有类的老祖宗,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object ...
- 夯实Java基础(二十四)——Java8新特征之Optional类
1.概述 对于Java程序员来说,到目前为止出现次数最多的应该是NullpointException,它是导致Java应用程序失败的最常见原因.之前处理空指针我们必须先通过条件先去判断,然后再确认是否 ...
- Java基础(二十四)Java IO(1)输入/输出流
在Java API中,可以从其中读入一个字节序列的对象称作输入流,而可以向其中写入一个字节序列的对象称为输出流. 输入流的指向称为源,程序从指向源的输入流中读取数据. 输出流的指向是字节要去的目的地, ...
- java 面向对象(二十四):interface:接口
interface:接口1.使用说明: 1.接口使用interface来定义 * 2.Java中,接口和类是并列的两个结构 * 3.如何定义接口:定义接口中的成员 * * 3.1 JDK7及以前:只能 ...
- Java之集合(二十四)ConcurrentLinkedDeque
转载请注明源出处:http://www.cnblogs.com/lighten/p/7517454.html 1.前言 本章介绍并发队列ConcurrentLinkedDeque,这是一个非阻塞,无锁 ...
- 攻城狮在路上(叁)Linux(二十四)--- linux设置开机挂载及镜像文件挂载
虽然可以手动进行文件系统的挂载,但是每次都手动挂载就会很麻烦,开机挂载的目的就是实现文件系统的自动挂载. 一.开机挂载:/etc/fstab及/etc/mtab 主要是通过修改/etc/fstab文件 ...
随机推荐
- 如何为分布式系统优雅的更换RPC
为啥需要更换RPC? 很多小伙伴都遇到过需要为分布式系统调用更换RPC的问题,为什么会遇到这种事呢?其实,在系统搭建初期,需求简单,架构简单,最重要的是请求量也少,所以很多系统都采用快速原型开发模式, ...
- 上篇:python的基本数据类型以及对应的常用方法(数字、字符串、布尔值)
为了日后便于查询,本文所涉及到的必记的基本字符串方法如下: "分隔符".join(字符串) #将字符串的每一个元素按照指定分隔符进行拼接.split("字符串&qu ...
- 0428css样式
CSS样式表|-引入的三种方式|--内联样式|----标签内部(空格style)|--内嵌样式|----<head></head>标签内部(<style></ ...
- C++笔记十二:C++对C的扩展——struct关键字类型增强
C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型. C++中的struct是一个新类型的定义声明. struct Student { char name[100]; int ...
- Docker常见仓库CentOS
CentOS 基本信息 CentOS 是流行的 Linux 发行版,其软件包大多跟 RedHat 系列保持一致. 该仓库提供了 CentOS 从 5 ~ 7 各个版本的镜像. 使用方法 默认会启动一个 ...
- JavaScript 调试
在编写 JavaScript 时,如果没有调试工具将是一件很痛苦的事情. JavaScript 调试 没有调试工具是很难去编写 JavaScript 程序的. 你的代码可能包含语法错误,逻辑错误,如果 ...
- OpenResty 自定义 access_log 格式
定义access log的format是 Nginx已经提供的功能,有了 ngx_lua 之后就可以更灵活的记录请求相关的信息,而不仅仅拘泥于 Nginx的内置变量了,可以自定义一些格式和变量来存储结 ...
- myeclipse中修改maven的默认仓库位置
1.本地需要安装Maven.这里假设安装在D:\Program Files\apache-maven-2.2.1 2.修改本地maven库的路径:在D:\Program Files\ap ...
- 【mybatis深度历险系列】mybatis中的动态sql
最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...
- Android对话框Dialog深度剖析
对话框 对话框是提示用户作出决定或输入额外信息的小窗口. 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件. 对话框设计 Dialog 类是对话框的基类,但您应该避免直接实例化 Di ...