目录

一,摘要:

二、磁盘操作File

File类的基本使用:

三、字节流操作:InputStream 和 OutputStream

1、字节输出流 OutputStream

类结构:

常用子类、方法:

OutputStream的使用案例:向文件中写入内容

2、字节输入流 :InputStream

类结构:

InputStream中常用方法:

InputStream的使用案例:读取文件中的信息

InputStream和OutputStream一起使用的案例:文件复制

四、字符操作 Reader & Writer

4.1  字符输入 - Reader

4.2  字符输出 - writer

五、字符编码

5.1   常见的字符编码

5.2 乱码产生分析

六、内存操作流

七、对象操作 - 序列化 & 反序列化

Serializable接口:

transient关键字:

八、网络操作:

InetAddress:

URL:

Sockets:

Datagram:

九、NIO

9.1 流与块

9.2 通道与缓冲区

9.4 文件I/O实例 — 通过NIO实现文件的快速复制实例

9.6 普通IO和NIO的区别


一,摘要:

Java中的I/O操作大致可以分为这几类:

  • 磁盘操作:File
  • 字节操作:InputStream 和 OutputStream
  • 字符操作:Reader 和 Writer
  • 对象操作:Serializable
  • 网络操作:Socket
  • 新I/O

二、磁盘操作File

File类这个名字或许存在一定的误导性。看见它我们会觉得它就是代指的文件,事实上并非如此。File类它既能代表一个特定的文件名称,又可以代表一个目录下的一组文件的名称,注意,但是它并不能表示文件的内容

File类的基本使用:

File类产生实例化对象的方法:


    File file1 = new File("文件路径"); //比较常用File file2 = new File("父路径", "子路径");

创建新文件:


boolean createNewFile() throw IOException

判断文件是否存在:


exists() ;

删除文件:


delete() ; 

两层目录中间的分隔符(如在Windows下文件表示方法为:C:\aaa\bbb ; 而在Linux下的文件目录表示方法为:/home/workplace 两个的斜杠是反着的,在Java中,JVM虚拟机会根据操作系统的不同,使用不同的‘斜杠’):


File.separator

比如:对于上面的文件例子,还可以这么描述:

取得文件的父路径或父File对象:

getParentFile();
getParent()

创建目录(可以连续创建多级目录):

mkdirs();

文件和目录操作:判断一个文件的父目录是否存在,如果不存在就创建,然后判断该文件是否存在,如果存在将其删除,在创建新文件

运行结果:如下图所示,目录创建成功

File类里还有一些其他方法:

  1. 判断路径是否是文件: public boolean isFile()
  2. 判断路径是否是目录: public boolean isDirectory()
  3. 取得文件大小(字节): public long length()
  4. 最后一次修改日期 : public long lastModified()
  5. 列出一个路径下是所有文件:public File[] listFiles()

针对以上方法的一个综合案例:递归的遍历一个目录下的所有文件

import java.io.File;
public class Test {public static void listFiles (File file) {System.out.println(file); //打印当前文件if (file.exists() && file.isDirectory()) {File[] files = file.listFiles();//列出这个目录下的所有文件,返回一个存了 File对象的数组for (File file1 : files) //遍历数组{if (file1 != null){listFiles(file1); //如果文件不为空,使用递归继续遍历}}}}public static void main(String[] args) {File file = new File("C:"+File.separator+"Users"+File.separator+"ASUS"+File.separator+"Desktop");System.out.println(file.exists());listFiles(file);}
}

File类不支持文件内容的处理,要想处理文件内容,必须使用流的操作,流又分为两种,字符流和字节流

三、字节流操作:InputStream 和 OutputStream

  • 字节输入流:InputStream
  • 字节输出流:OutputStream

字节流的操作流程:

  1. 获取File对象
  2. 根据字节流的字类实例化父类对象
  3. 进行数据读取或者写入操作
  4. 关闭流(对于I/O操作属于资源处理,所有的资源处理操作(I/O操作,数据库操作,网络操作)都要进行关闭操作)

1、字节输出流 OutputStream

注意:这里所谓的输出指的是将指定内容输出到文件中,而不是将文件中的内容输出来;

类结构:

是一个抽象方法,所以实例化对象需要通过其字类来创建。

常用子类、方法:

  1. 接受File类(覆盖原来的内容):public FileOutputStream(File file) throws FileNotFoundException
  2. 接受File类(接着原来的内容在追加新内容):public FileOutputStream(File file, boolean append)
  3. 将给定的字节数组全部输出:public void write(byte b[ ]) throws IOException
  4. 将部分字节数组内容输出:public void write(byte b[ ],  int off,  int len) throws IOExceptio
  5. 单个字节输出:public abstract void write(int b) throws IOException;

OutputStream的使用案例:向文件中写入内容

2、字节输入流 :InputStream

注意:这里的所说的输入指的是从一个文件中读取内容。

类结构:

InputStream同样是一个抽象类,实例化对象时要使用对应的子类去实例化,它实现了Closeable接口。

InputStream中常用方法:

  1. public int  read(byte[ ] ) throws IOException  ---  读取数据到字节数组中,返回读取的数据个数。如果此时开辟的数组大小大于读取的数据的大小,则返回读取的数据个数;如果此时读取的数据大于数组的长度,则返回数组长度;如果没有数据了还在读,就返回-1
  2. public  int  read (byte[ ]   b, int off,  int  len )  throws  IOException   ---   读取部分数据到字节数组中,每次只读取传递数组的部分内容,如果读取满了则返回长度len,如果没有则返回读取的个数,如果读取到最后没有数据了,就返回-1
  3. public  abstract  int  read()throws  IOException  读取单个字节,每次读取一个字节的内容,知道没有数据了返回-1

InputStream的使用案例:读取文件中的信息

1、一次读取一个字节

2、一次读取多个字节

InputStream和OutputStream一起使用的案例:文件复制

import java.io.*;
public class Test {public static void main(String[] args) throws IOException {//获取File对象File sourceFile = new File("C:\\Users\\ASUS\\Desktop\\a.png");File desFile = new File("C:\\Users\\ASUS\\Desktop\\aCopy.png");// 判断源文件是否存在if (!sourceFile.exists()){System.out.println("源文件不存在,拷贝失败!!!");return;}//源文件存在, 判断目标文件的父目录是否存在if (!desFile.getParentFile().exists()){desFile.getParentFile().mkdirs(); //如果不存在,创建父目录}//开始拷贝文件//通过子类获取对象InputStream in = new FileInputStream(sourceFile); // 从源文件中读取OutputStream out = new FileOutputStream(desFile); // 将读取到的数据写入到目标文件中byte[] bt = new byte[1024];int rd ;while ((rd=in.read(bt)) != -1){out.write(bt, 0, rd);}//关闭in.close();out.close();}
}

四、字符操作 Reader & Writer

字符操作适合处理中文数据

4.1  字符输入 - Reader

Reader是一个抽象类,如果要进行文件读取,依然要用其子类进行实例化操作;在读取时需要通过字符数组进行读取

使用案例 - 读取文件内容

4.2  字符输出 - writer

Reader是一个抽象类,如果要进行文件读取,依然要用其子类进行实例化操作;Reader类输入的是字符数组,但是Writer类提供了一个直接输出字符串的方法

使用案例 - 朝文件中写入内容

五、字符编码

在计算机的世界中,所有文字都是通过编码来描述的,如果没有正确解码,就会导致乱码问题。

5.1   常见的字符编码

  1. GBK、GB3212:表示国标编码,GBK包含简体中文和繁体中文,而GB3212只包含简体中文,这两种编码都是为中文服务的 ;
  2. UNICODE编码:Java提供的16进制编码,可以描述世界上的任意一种文字信息,但是有一个问题,如果现在所有的字母也都采用16机制编码,那么这个编码就太庞大了,会造成网络传输负担 ;
  3. ISO8859-1:国际通用编码,但是所有的编码都需要进行转换 ;
  4. UTF-8编码:相当于结合了UNICODE编码和ISO8859-1编码,也就是说如果需要使用到16进制文字就用UNICODE编码,如果只是字母就使用ISO8859-1编码 ;

5.2 乱码产生分析

Java中的默认编码格式:UTF-8

乱码产生的原因:编码和解码的格式不一致

六、内存操作流

在这之前所说的I/O操作都发生在文件中的,除此之外,I/O操作也可以发生在内存中,这种流称为内存操作流。文件流的操作里面一定会产生文件(不管这个文件最后会不会被保存),但是如果现在想进行I/O操作,但是又不想产生文件,就可以使用内存作为操作终端。

对于内存流,也可以分为两种:

  • 字节内存流:ByteArrayInputStream、ByteArrayOututStream
  • 字符内存流:CharArrayReader、 CharArrayWriter

构造方法:

使用实例  ---   将一个字符串转为大写

七、对象操作 - 序列化 & 反序列化

序列化操作就是将内存中保存的对象变为二进制数据流的形式传输,或者将其保存在文本中。

实现序列化操作:

  • 类:ObjectOutputStream
  • 方法:writeObject()

实现反序列化操作:

  • 类:ObjectInputStream
  • 方法:readObject()

序列化操作不会对静态变量进行序列化,因为序列化只是保存对象的状态,静态变量属于类状态。需要被序列化的类需要实现Serializable接口。

Serializable接口:

序列化的类需要实现Serializable接口,这个接口中没有定义任何方法,他只是一个标准,如果你没有实现这个类而去进行序列化的话,会抛出异常。

transient关键字:

transient关键字会使一些属性不会被序列化。因为实现了Serializable接口的类中,会默认将所有属性全部进行序列化操作,但是有时候我们不想让一些属性被序列化操作,这时候就需要使用transient关键字了;比如在ArrayList中,存储数据的数组elementData就是用transient关键字修饰的,因为这个数组的动态扩容的,并不是它的所有空间都会被使用,因此就不需要将所有空间序列化,通过重写序列化和反序列化方法,可以使得只序列化数组中有数据的那一部分。

八、网络操作:

Java中对网络的支持:

  • InetAddress:用于表示网络上的硬件资源,即IP地址
  • URL:统一资源定位符
  • Sockets:使用TCP协议实现网络通信
  • Datagram:使用UDP协议实现网络通信

InetAddress:

没有共有的构造函数,只能通过静态方法来创建实例:

    InetAddress.getByName(String host);InetAddress.getByAddress(byte[] address);

URL:

可以直接从URL中读取字节流数据:

运行结果:

Sockets:

  • Socket 客户端
  • ServerSocket:服务器类
  • 客户端和服务器之间通过InputStream和OutputStream进行输入输出

Datagram:

DatagramSocket:通信类

DatagramPacket:数据包类

九、NIO

新的I/O是在JDK1.4中引入的,弥补了原来IO的不足,提供了快速的,面向块的IO

9.1 流与块

I/O和NIO的区别就是数据打包和传输的方式,I/O以流的方式进行处理数据,而NIO以块的方式进行处理数据

面向流的I/O一次处理一个字节的数据:一个输入产生一个字节的数据,一个输出处理一个字节的数据。

  • 优点:为流式数据创建过滤器非常简单,链接几个过滤器,以便每个过滤器只负责处理复杂处理机制的一部分。
  • 缺点:面向流的I/O处理数据非常慢

面向块的I/O一次处理一个数据块,按块处理比按流处理块的多,但是面向块的I/O没有面向流的I/O的那些优点。

现在I/O和NIO已经很好的集尘了,java.io.* 已经以NIO为基础重新实现了,所以他可以利用一些NIO的特性,例如java.io.*里面的一些类包含以块的形式读写数据的方法,使得这些面向流的I/O处理速度也非常快。

9.2 通道与缓冲区

  • 通道:通道channel是对原I/O包中的流的模拟,可以通过它进行数据的读写

    • 通道和流的区别在于流只能在一个方向上移动(一个流必须是InputStream或者OutputStream的子类),而通道是双向的,可以用于读、写或者同时读写
    • 通道包含一些几种类型
    1. FileChannel :从文件中读写数据
    2. DatagramChannel :通过UDP读写网络中的数据
    3. SocketChannel :通过TCP读取网络中的数据
    4. ServerSocketChannel :可以监听新进来的TCP连接,对每一个新进来的TCP连接都会创建一个SocketChannel
  • 缓冲区:发送给 通道的所有数据都必须先放到缓冲区中,同样的从通道中读取数据也必须是先读到缓冲区中。也就是说不会直接操作缓冲区,而是先要经过缓冲区
    • 缓冲区实际上是一个数组,但它不仅仅是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。
    • 缓冲区包含一些几种类型:
    1. ByteBuffer
    2. CharBuffer
    3. ShortBuffer
    4. IntBuffer
    5. LongBuffer
    6. FloatBuffer
    7. DoubleBuffer
    • 缓存区的状态变量

      • capacity  最大容量
      • position   当前已经读写的字节数
      • limit   还可以读写的字节数
    • 状态变量的工作过程图解:

9.4 文件I/O实例 — 通过NIO实现文件的快速复制实例

public class Test {public static void main(String[] args) throws IOException {// 获取源文件的输入字节流FileInputStream fileInputStream = new FileInputStream("E:\\QLDownload\\aaa.zip");// 获取输入字节流的文件通道FileChannel inputChannel = fileInputStream.getChannel();// 获取目标文件的输出字节流FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\ASUS\\Desktop\\aCopy.zip");// 获取输出字节流的文件通道FileChannel outputChannel = fileOutputStream.getChannel();// 为缓冲区分配1024个字符ByteBuffer buffer = ByteBuffer.allocateDirect(1024);System.out.println("开始时间:"+new Date());while (true){// 从输入通道中读取数据到缓冲区int r = inputChannel.read(buffer);if (r == -1) // == -1 表示数据读取完了{break;}// 切换读写操作buffer.flip();// 把缓冲区的内容写入到输出文件中outputChannel.write(buffer);// 清空缓冲区buffer.clear();}System.out.println("结束时间:"+new Date());}
}

9.6 普通IO和NIO的区别

  • NIO是非阻塞的, I/O是阻塞操作
  • NIO面向块,I/O面向流

Java学习篇之I/O篇相关推荐

  1. 视频教程-Java学习指南(Swing高级篇)-Java

    Java学习指南(Swing高级篇) 邵发,清华大学毕业,从业软件开发十余年,自2015年起致力于C/C++/Java等基础教育领域,希望能通过提高每一个个体的素质来推动中国IT业的整体发展.代表作: ...

  2. 个人开发经历--我的java学习之路(学校篇)

    个人开发经历--我的java学习之路(学校篇) 个人介绍: 姓名: 不在这里说明 联系信息: 个人历程 jdbc阶段 sql生成器 一代代码生成器 servlet阶段 servlet项目中,sql生成 ...

  3. invader的java学习第三天基础篇

    invader的java学习第三天基础篇 一.整数的取值范围表 类型名称 数据类型 所占空间 表数范围 字节型 byte 1字节 -128-127 短整型 short 2字节 +-3w(-2^15-2 ...

  4. invader的java学习第五天基础篇

    invader的java学习第五天基础篇(持续更新中-) 一.位运算符 ^.&.|.~.>>.<<.>>>,位运算符就是基于二进制直接进行运算(0为f ...

  5. invader的java学习第四天基础篇

    invader的java学习第四天基础篇(持续更新中-) 一.类型转换 自动转换(数值之间在进行四则运算时,数据类型会自动向大类型靠拢) byte num=10; short a=num; Syste ...

  6. java学习 类变量 类方法_这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下类变量(...

    这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类变量(static) 类变量是该类的所有对象共 ...

  7. JAVA学习笔记 (语言入门篇01)

    一.java前期准备 1.java介绍 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称.由 James G ...

  8. 【Java学习—(13)看完这篇文章,这些继承、多态、抽象、接口就是小儿科】

    文章目录 面向对象编程 前言 继承 关于protected(继承权限)访问权限 super 关键字 super 修饰属性 super 修饰构造方法 super 修饰普通方法 final 关键字和继承的 ...

  9. JAVA学习之旅番外篇

    进入朗沃学习已经有一个月的时间了,从开始对这里感到的无比陌生和些许的惴惴不安,到现在安心学习,和同学们互相帮助,为了自己的理想去努力,时间不短不长,忙忙碌碌,但也平平淡淡,这样的感觉,挺好,不过,由于 ...

  10. 【Java学习笔记】【基础篇】07.JavaDoc以及两种使用方式

    JavaDoc 1.介绍 JavaDoc是一种将注释生成HTML文档的技术,生成的HTML文档类似于Java的API,易读且清晰明了. JavaDoc是Sun公司提供的一个技术,它从程序源代码中抽取类 ...

最新文章

  1. jmeter跨线程组传值
  2. Android SlidingMenu以及ActionBarSherlock的基础使用教程
  3. jdk安装好后没有jre,手动生成jre
  4. 腾讯大数据高级产品总监洪桃李:决胜未来的4大关键能力
  5. 再见 Postman!Apifox 才是 YYDS!
  6. [xsy1144]选物品
  7. kaldi GMM模型解码指令 gmm-latgen-faster详解
  8. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_15-异常处理-异常处理流程...
  9. 维修小记:电脑更换不同型号主板时可能碰到的问题以及其解决方案
  10. 认识网络、几种常用的网络拓扑图
  11. ps蒙版怎么用:你会用ps蒙版吗?【萧蕊冰】
  12. hadoop到底是什么
  13. 你为什么始终做不好会议营销?「会议营销」电子书免费下载
  14. #中秋节#迅镭激光第四届中秋游园会活动精彩回顾
  15. WPS office根目录在哪?_wps和office的区别是什么
  16. android 程序根据重力感应切换程序的方向
  17. 计划测试系列(一)--万事开头难
  18. 本地搜索神器,秒速定位文件-Everything
  19. bdd java 界面测试_基于Cucumber的BDD自动化测试
  20. 学3D游戏建模用什么软件好?尤其是人物角色建模

热门文章

  1. node.js是干什么的
  2. linux中运行alise,Linux学习笔记
  3. cvc降噪和主动降噪_音频知识:CVC降噪和ANC主动降噪的区别和应用
  4. 宝塔面板windows建站教程_宝塔面板建站教程
  5. python图像锐化滤波_Laplacian滤波器实现并用于图像锐化
  6. 微信推送封面尺寸_微信公众平台图片尺寸是多少?
  7. 树的计数 + prufer序列与Cayley公式 学习笔记
  8. 计算机毕业论文选题影视方向,毕业设计选题方向
  9. 怎样带团队,带好团队
  10. 将A3排版的PDF内容转成A4纸张