Java入门:IO

IO

I(Input)指从设备上输入数据到程序中;
O(Output)指从程序中向设备中输出数据;
IO是相对于程序而言的。

File类

操作文档和目录。FIle类以一种与平台无关的方式描述一个文件或目录对象的属性。

File类功能

  • 获取文件或目录的各种属性信息
  • 创建目录
  • 对文件或目录改名
  • 列出一个目录下所有的文件和子目录

创建File类的方式

  • File(String pathname):根据文件名创建一个File类对象
  • File(File parent,String child):根据parent目录和child文件名构建一个File对象
  • File(String parent,String child):根据字符串parent目录和child文件名构建一个File对象
  • File(URI uri):根据uri创建一个File对象

Windows和Linux存在路径表示方式的区别,Windows下用\分割路径,所以pathname里需要用\\分割路径,第一个\是转义字符。Linux是/没有问题。

File类常用方法

  • boolean createNewFile():根据文件路径(构造方法传进来的路径),创建一个文件。如果文件存在会创建失败。
  • boolean mkdirs():创建目录
  • boolean delete():删除文件
  • boolean exists():判断是否已经存在该文件或文件夹
  • File[] list():列出目录中的所有文件和文件夹,可以接受FilenameFilter参数,该参数可以只列出符合条件的文件。在FilenameFilter接口里包含一个accpet(File dir,String name)方法,该方法将依次对指定File的所有子目录,子文件进行迭代。

来个新鲜的栗子:列出指定目录下名称包含java的文件或文件夹
过滤文件名称的类Java_Filter.java
Java_Filter.java

包含当前main类listFiles.java
listFiles.java

流是Java中输入/输出的抽象表述。
程序想要访问内存、硬盘、网络等IO目的地,全部通过IO流的方法就可以完成,统一了访问方法。
根据数据流方向的不同,可以将数据分为输入流和输出流。
输入流只能从中读取数据,而不能向其写数据;输出流只能向其写出数据,而不能从中读取数据。

字节流
假设硬盘中有数据a中bcd,其中a用一个字节表示,字用两个字节表示,bcd分别都用一个字节表示,字节输入流,一次只从硬盘上读取一个字节,遇到字需要读取两次,数据a中bcd一个6个字节,需要读6次。
字节流传送的是字节数据(byte)。

字符流
而字符输入流,一次读取一个字符,字也是一个字符,使用字符输入流,则之需要读取5次。
字符流传送的是字符数据(char)。

流是一个逻辑概念,它把各种都写操作统一起来。一个字节输入流指向一个字节序列,可从中一次读出字节,用户不必关心它的内部结构、来源。一个字节输出流,可向其依次写入字节,它的去向和内部结构用户同样不必关心。

字节输入流

  • FileInputStream:表示指向文件的字节输入流
  • ByteArrayInputStream:表示指向内存中的byte数组的字节流
  • ObjectInputStream:用于读取对象
  • FilterInputStream:表示过滤器流
  • DataInputSteam:用于从流中读取基本类型的数据
  • BufferedStream:用于给流增加缓冲的功能

InputStream是字节输入流的顶层父类。
InputStream提供的三个基本的read方法:

  • int read():读取一个字节
  • int read(byte[] buffer):读取数据到buffer数组中
  • int read(byte[] buffer,int offset,int length):读取数据到buffer数组中的指定位置。

字节输出流

OutputStream为字节输出流的顶层父类。

  • FileOutputStream:表示输出到文件的字节输出流
  • ByteArrayOutputStream:表示输出到内存的byte数组的字节流
  • ObjectOutputStream:表示对象输出流,用于将对象写入到流中
  • FilterOutputStream:表示过滤器输出流
  • DataOutputStream:用于向流中写入基本类型的数据
  • BufferedOutputStream:用于给流增加缓冲的功能

字节输出流OutputStream,用来向流中写入数据。OutputStream是所有字节输出流的顶层父类。
OutputStream类提供的三个基本write方法:

  • void write(int c)
  • void write(byte[] buffer)
  • void write(byte[] buffer,int offset,int length)

其他方法:

  • void close():关闭流
  • void flush():将流中的数据输出

下面一个例子,实现了文件复制功能,综合了输入流输出流和缓存流的知识:
小栗子

序列化
Java中,很多数据是以对象的方式存在,程序运行后,希望将这些数据储存,以供下次使用,可以使用ObjectInputStream、ObjectOutputStream来做到。将对象写入流中,这个过程称为序列化,写入流中的对象必须要实现接口Serializable,才能对象序列化。

ObjectOutputStream主要方法:

  • writeObject(Object obj):将对象写入流中
  • flush():将缓冲输出
  • close():关闭流

ObjectInputStream主要方法:

  • readObject():从流中读取一个对象
  • close():关闭流

字节流

字节流一次读取一个字节的数据,而字符流一次读取一个字符的数据。比如中文,一个字符占用两个字节,使用字节流读取,就会成乱码,而用字符流就可以正常显示。

字符输入流的类
Reader类为字符输入流的顶层父类,子类如下:

  • StringReader:表示从内存中的String对象中读取数据的字符输入流
  • CharArrayReader:表示从内存中的一个Char数组中读取的字符输入流
  • InputStreamReader:表示一个字节流转换为字符流的工具流
  • FileRead:表示指向文件的字符输入流
  • BufferedReader:表示给字符输入流增加缓冲功能的字符流

Reader类的三个基本方法:

  • int read():读取一个字符的数据
  • int read(char[] cbuf):将字符数据读取到cbuf数组中
  • int read(char[] cbuf,int offset,int length):将字符数据读取到cbuf数组中从offset处开始写入,写length个字符

Reader的其他方法:

  • void close():关闭流
  • boolean ready():判断流是否就绪可用
  • skip(long n):从当前位置跳过n个字符不读
  • void reset():关闭流

使用Reader的栗子:
Reader的栗子

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值