什么是Io

io是指Input和Output,指输入和输出 Input是指外部读入数据到内存,例如读取一个文件,或者从网络中读取 Output是指把内存中的数据输出到外部,例如写文件,输出到网络

什么是Io流(InputStream/OutputStream)

Io流是顺序读写数据的模式 数据是单向流动的,类似自来水再水管的流动,所以称为IO流 二进制数据以Byte为最小单位在InputStream/OutputStream中单向流动

读取的数据是中文(Reader/Writer)

如果字符不是单字节表示的ASCI,Java提供了Reader/Writer表示字符流 字符数据以char为最小单位在Reader/Writer中单向流动 字符流输出的Byte取决去编码方式 Reader/Writer本质上是一个能够自动编解码的InputStream/OutputStream,再读取数据源的Byte自动做了编解码

什么是同步Io和异步Io

同步Io:读写Io时等待读取的数据返回时才会执行后面的代码,代码编写简单,执行效率低 异步Io:读写Io仅仅发出请求,立刻执行后面代码,代码编写复杂,执行效率高 JDK提供的java.io是同步Io,java.nio是异步Io

Java.io有哪些抽象类

Java.io提供的总共有4个抽象类,分别是InputStream/OutputStream以及Reader/Writer,其中Reader/Writer就是对InputStream/OutputStream进行了自动编解码的包装 当然他们的实现类有很多,以读写文件为例,有FileInputStream/FileOutputStream,以及FileReader/FileWriter

File对象

java.io.File表示文件系统的一个文件或者目录:
- isFile():是否是文件
- isDirectory():是否是目录
创建File对象本身不涉及IO操作
获取路径/绝对路径/规范路径:getPath() / getAbsolutePath() / getCanonicalPath()
文件操作:
- canRead():是否允许读取该文件
- canWrite():是否允许写入该文件
- canExecute():是否允许运行该文件
- length():获取文件大小
- createNewFile():创建一个新文件
- static createTempFile():创建一个临时文件
- delete():删除该文件
- deleteOnExit():在JVM退出时删除该文件
目录操作:
- String[] list():列出目录下的文件和子目录名
- File[] listFiles():列出目录下的文件和子目录名
- File[] listFiles(FileFilter filter)
- File[] listFiles(FilenameFilter filter)
- mkdir():创建该目录
- mkdirs():创建该目录,并在必要时将不存在的父目录也创建出来
- delete():删除该目录

InputStream对象

InputStream是所有输入流的超类:
- int read()读取一个字节
- int read(byte[])读取若干字节并填充到byte[]数组
read()方法是阻塞(blocking)的
使用try(resource)可以保证InputStream正确关闭
常用InputStream:
- FileInputStream
- ByteArrayInputStream

案例:使用InputStream/OutputStram拷贝一个文件的示例

   public static void main(String[] args) throws IOException {
InputStream inputStream = new FileInputStream("C:\\Users\\jimisun\\Desktop\\hello.txt");
OutputStream outputStream = new FileOutputStream("C:\\Users\\jimisun\\Desktop\\hello1.txt");
int n;
byte[] buff = new byte[1000]; while ((n = inputStream.read(buff)) != -1) {
outputStream.write(buff,0,n);
}
inputStream.close();
outputStream.close();
}

OutputStream对象

OutputStream是所有输出流的超类:
- write(int b)写入一个字节
- write(byte[])写入byte[]数组的所有字节
- flush()方法将缓冲器内容输出
- write()方法是阻塞(blocking)的
使用try(resource)可以保证OutputStream正确关闭
常用OutputStream:
- FileOutputStream
- ByteArrayOutputStream

案例:使用OutputStram向一个文件中输入"hello你好"

    public static void main(String[] args) throws IOException {
OutputStream outputStream = new FileOutputStream("C:\\Users\\jimisun\\Desktop\\hello1.txt");
byte [] b1 = "hello".getBytes("UTF-8");
byte [] b2 = "你好".getBytes("UTF-8");
outputStream.write(b1);
outputStream.write(b2);
outputStream.close();
}

对InputStream/OutputStram进行增强Filter模式

Filter模式是为了解决子类数量爆炸的问题。
直接提供数据的InputStream:
- FileInputStream
- ByteArrayInputStream
- ServletInputStream
提供附加功能的InputStream从FilterInputStream派生:
- BufferedInputStream
- DigestInputStream
- CipherInputStream
- GZIPInputStream
Filter模式又称Decorator模式,通过少量的类实现了各种功能的组合。
FilterOutputStream和FilterInputStream类似

案例:缓冲读取一个GZ压缩后的文件

    public static void main(String[] args) throws IOException {
InputStream inputStream = new GZIPInputStream(new BufferedInputStream(new FileInputStream("C:\\Users\\jimisun\\Desktop\\hello1.txt.gz")));
ByteOutputStream byteOutputStream = new ByteOutputStream();
int n;
byte[] buff = new byte[1024];
while ((n = inputStream.read(buff)) != -1) {
byteOutputStream.write(buff, 0, n);
}
byte[] data = byteOutputStream.toByteArray();
String text = new String(data, "UTF-8");
System.out.println(text);
}
Java io使用Filter模式为InputStream/OutputStream增加功能
可以把一个InputStream和任意的FilterInputStream组合
可以把一个OutputStream和任意的FilterOutputStream组合
Filter模式可以在运行期动态增加功能(又称Decorator模式)

读取classpath下的文件资源

classpath资源 classpath中可以包含任意类型的文件。 从classpath读取文件可以避免不同环境下文件路径不一致的问题。

案例:读取classpath资源

try(InputStream input = getClass().getResourceAsStream("/default.properties"))
{ if (input != null)
{ // Read from classpath }
}

序列化与反序列化

序列化是指把一个Java对象变成二进制内容(byte[])
Java对象实现序列化必须实现Serializable接口
反序列化是指把一个二进制内容(byte[])变成Java对象 使用ObjectOutputStream和ObjectInputStream实现序列化和反序列化
readObject()可能抛出的异常:
- ClassNotFoundException:没有找到对应的Class
- InvalidClassException:Class不匹配
反序列化由JVM直接构造出Java对象,不调用构造方法
可设置serialVersionUID作为版本号(非必需)

案例:把person类进行序列化和反序列化

public static void main(String[] args) throws IOException, ClassNotFoundException {
String dataFile = "saved.data";
try (ObjectOutputStream output = new ObjectOutputStream(
new BufferedOutputStream(new FileOutputStream(dataFile)))) {
// 依次写入 int, String, Person:
output.writeInt(999);
output.writeUTF("Hello, world!");
output.writeObject(new Person("Xiao Ming"));
}
System.out.println("Read...");
try (ObjectInputStream input = new ObjectInputStream(new BufferedInputStream(new FileInputStream(dataFile)))) {
// 依次读入 int, String, Person:
System.out.println(input.readInt());
System.out.println(input.readUTF());
Person p = (Person) input.readObject();
System.out.println(p);
}
}

Reader对象

Reader以字符为最小单位实现了字符流输入:
int read() 读取下一个字符
int read(char[]) 读取若干字符并填充到char[]数组
常用Reader类:
- FileReader:从文件读取
- CharArrayReader:从char[]数组读取 Reader是基于InputStream构造的,任何InputStream都可指定编码并通过InputStreamReader转换为Reader:
Reader reader = new InputStreamReader(input, "UTF-8")

案例:使用Reader读取一个文件

    public static void main(String[] args) throws IOException {
Reader reader = (new FileReader("C:\\Users\\jimisun\\Desktop\\hello1.txt"));
int n;
while ((n = reader.read()) != -1) {
System.out.print((char) n);
}
}

Writer对象

Writer以字符为最小单位实现了字符流输出:
write(int c) 写入下一个字符 write(char[])
写入char[]数组的所有字符
常用Writer类:
- FileWriter:写入文件
- CharArrayWriter:写入char[]数组 Writer是基于OutputStream构造的,任何OutputStream都可指定编码并通过OutputStreamWriter转换为Writer:
Writer writer = new OutputStreamWriter(output, "UTF-8")

案例:使用Writer写入文件内容

 public static void main(String[] args) throws IOException {
FileWriter writer = (new FileWriter("C:\\Users\\jimisun\\Desktop\\hello1.txt"));
writer.write("我是");
writer.write("jimisun");
writer.close();
}

JavaIo编程基础复习的更多相关文章

  1. (一)C#编程基础复习——开启编程之旅

    回想当年学习编程,刚开始学习是非常艰苦的,可能是因为文科生原因,刚开始接触工科类的知识不是很擅长,上去大学第一年基本没有好好学习编程,入门C#编程基础一窍不通,也许那时年少无知,第二学期开始奋发图强, ...

  2. (二)C#编程基础复习——变量和常量

    今天要复习一下C#基础中的变量和常量,所谓变量,就是用来存储特定类型的数据,分为值类型和引类型,可以根据需要随时改变变量中所村存储的数据值,变量必须先声明,然后才能赋值:常量就是固定不变的值,常量的变 ...

  3. java编程基础复习-------第二章

    一.标识符 java中标识符的命名规则: 以数字.字母.下划线和$符号组成:不能用数字开头:不能是java的关键字. 注意:不要用$命名标识符.习惯上,$只用在机器自动产生的源代码中. 二.关键字 1 ...

  4. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  5. Java基础复习笔记系列 八 多线程编程

    Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...

  6. Java网络编程学习A轮_01_目标与基础复习

    A. A轮目标 复习网络编程基础知识,重点学习下TCP三次握手四次挥手,以及可能引发的异常情况. 回顾 Socket 编程,好多年没写(chao)过相关代码了. 重学 NIO,以前学的基本忘光了,毕竟 ...

  7. [.net 面向对象编程基础] (1) 开篇

    [.net 面向对象编程基础] (1)开篇 使用.net进行面向对象编程也有好长一段时间了,整天都忙于赶项目,完成项目任务之中.最近偶有闲暇,看了项目组中的同学写的代码,感慨颇深.感觉除了定义个类,就 ...

  8. [.net 面向对象编程基础] (14) 重构

    [.net 面向对象编程基础] (14) 重构 通过面向对象三大特性:封装.继承.多态的学习,可以说我们已经掌握了面向对象的核心.接下来的学习就是如何让我们的代码更优雅.更高效.更易读.更易维护.当然 ...

  9. Java基础复习笔记系列 四 数组

    Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...

随机推荐

  1. CSS之千变万化的Div

    厂址:http://www.cnblogs.com/yunfeifei/p/4671930.html 一.div和css3在一起 .box1 { width: 100px; height: 100px ...

  2. macbook中使用彩色的ls

    1.首先,macbook中原装的ls和gnu的ls是不相同的,所以,要下载安装正牌ls brew install coreutils //gnu ls 在里面 2.因为和mac的ls有冲突,所以,co ...

  3. SQL命令查看Mysql数据库大小

    SQL命令查看Mysql数据库大小的方法. 要想知道每个数据库的大小的话,步骤如下:1.进入information_schema 数据库(存放了其他的数据库的信息)use information_sc ...

  4. 用注册表更改DNS的代码分享

    用注册表更改DNS,1秒切换完毕,快速又方便,不用麻烦的去等待了,支持远程路劲运行 最进我这里DNS老是间歇性掉,很不稳定,广州地区,如果你的DNS经常需要更换,试试这个批处理, 论坛很多人发过了更改 ...

  5. MySQL编程API

    1.MySQL API数据结构 MySQL API中用到了很多结构体类型,下面就简单说一下常用的结构体. MYSQL 连接数据库前,必须先创建MYSQL变量,此变量在很多MySQL API函数中会用到 ...

  6. Debian7/8安装最新的nginx稳定版本

    我们知道,通过 apt-get install nginx 就可以安装上nginx,可惜这样安装的nginx版本都有些旧,就连最新的Debian 8.0 默认安装的仍然是1.6.2,更别说 Debia ...

  7. linux超级终端minicom的使用方法

    ===== 一.Minicom介绍 =====       Linux下的Minicom的功能与Windows下的超级终端功能相似,可以通过串口控制外部的硬件   设备.适于在linux通过超级终端对 ...

  8. 基于vitamio的网络电视直播源代码

    这个项目是基于vitamio的网络电视直播源代码.也是一个使用了vitamio的基于安卓的网络直播项目源代码,可能如今网上已经有非常多类似这种视频播放应用了.只是这个还是相对来说比較完整的,希望这个案 ...

  9. Unix系统编程()进程和程序

    进程(process)是一个可执行程序(program)的实例. 程序是包含了一系列信息的文件,这些信息描述了如何在运行时创建一个进程,所包括的内容如下所示. 二进制格式标识:每个程序文件都包含用于描 ...

  10. [gpio]Linux GPIO简单使用方式2-sysfs

    转自:http://blog.csdn.net/cjyusha/article/details/50418862 在Linux嵌入式设备开发中,对GPIO的操作是最常用的,在一般的情况下,一般都有对应 ...