Java基础知识梳理——第十章 IO

1.File类

File是Java.io包下代表与平台无关的文件和目录。File能新建、删除、重命名文件和目录。

File类可以用文件路径字符串创建File实例。File对象常用的方法:

访问文件名相关的方法:

  • String getName():返回此文件对象所表示的文件名或路径名。
  • String getPath():返回此File对象所对应的路径名。
  • File getAbsoluteFile():返回此File对象所对应的绝对路径指向的File对象。
  • String getAbsolutePath():返回此File对象所对应的绝对路径。
  • String getParent():返回此File对象所对应的目录的父目录,以工作路径为准,如果已经在工作路径的根目录下,则返回null,否则返回父目录。
  • boolean renameTo(File newName):重命名此File对象所对应的文件或目录,成功返回true,否则返回false。

文件检测相关的方法:

  • boolean exists():判断File对象所对应的文件或目录是否存在。返回ture/false
  • boolean canWrite():判断File对象所对应的文件和目录是否可写。
  • boolean canRead():判断File对象所对应的文件和目录是否可读。
  • boolean isFile():判断File对象所对应的是否是文件。
  • boolean isDirectory():判断File对象所对应的是否是目录。
  • boolean isAbsolute():例如:如果在Unix/Linux等系统上,如果路径名的开头是/,则表明File对象对应一个绝对路径,在Windows等系统上,如果路径开头是盘符,则说明它是一个绝对路径。

获取常规文件信息

  • long lastModified():返回文件的最后修改时间。
  • long length():返回文件内容的长度。

文件操作相关的方法

  • boolean createNewFile():当此File对象对应的文件不存在时,创建一个该File对象所对应的文件,创建成功返回true,否则返回false。
  • boolean delete():删除File对象所在的文件或路径.

目录操作相关的方法

  • boolean mkdir():创建一个File对象所对应的目录,创建的是目录而不是文件。
  • boolean mkdirs():创建一个File对象所对应的所有目录,如果上级目录不存在,会同时将上级目录创建出来。
  • File[] listFile():列出File对象的所有子文件和路径,返回File数组。
  • Static File[] listRoots():列出系统所有根路径。

2.IO流

Io流是实现输入/输出的基础,Java把所有流类型都放在Java.io包中,用以实现输入/输出功能。

 流的分类:

按照流向,分为输入/输出流。输入流:只能读取数据,从磁盘文件到系统内存;输出流:只能写入数据,从系统内存到磁盘文件。输入流由inputStream和Reader作为基类,输出流由OutputStream和Write作为基类。都是抽象基类,能直接创建对象。

按照操作的数据单元,分为字节流和字符流。 字节流操作的是8位的字节(一个字节),字符流操作的是16位的字节(两个字节)。字节流有InputStream和OutputStream作为基类,字符流由Write和Reader作为基类。

字节输入流InputStream和字符输入流Reader

InputStream和Reader是所有输入流对的基类,本身不能创建实例来执行输入。

在InputStream里包含如下方法:

  • int read():从输入流中读取单个字节,返回所读取的字节数据。
  • int read(byte[] b):从输入流中最多读取b.length个字节的数据,并将其存储在字节数组b中,返回实际读取的字节数。
  • int read(byte[] b,int off,int len):从输入流中最多读取len个字节的数据,并将其存储在数组b中,放入数组b中时,并不是从数组起点开始,而是从off位置开始,返回实际读取的字节数。

在Reader里包含如下方法:

  • int read():从输入流中读取单个字符,返回所读取的字符数据
  • int read(char[] ch):从输入流中最多读取ch.length个字符的数据,并将其存储在字符数组ch中,返回实际读取的字符数。
  • int read(char[] ch,int off,int len):从输入流中最多读取len个字符的数据,并将其存储在字符数组ch中,放入数组时,从数组的off位置开始,返回实际读取的字符数。

3.OutputStream和Writer

OutputStream和Write都提供了如下方法进行输出:

  • void write(byte[]/char[] buf):将字节数组/字符数组中的数据输出到指定输出流中。
  •  void Write(int c):将指定的字节/字符输出到输出流中,c既可以表示字节,也可以表示字符。
  • void write(byte[]/char[] buf,int off,int len):将字节数组/字符数组中从off位置开始,长度为len的字节/字符输出到输出流中

因为字符流直接以字符作为操作单位,所有Write可以用字符串来代替字符数组,即以String对象作为参数:

  • void write(String str):将str字符串里包含的字符输出到指定输出流中。
  • void write(String str,int off,int len):将字符串从off位置开始,长度为len的字符输出到指定输出流中。

4.InputStreamReader和OutputStreamWrite

输入输出体系中提供了两个转换流InputStreamReader和OutputStreamWrite,这两个转换流用于实现字节流转换成字符流。InputStreamReader用于将字节输入流转换成字符输入流,OutPutStreamWrite用于将字节输出流转换成字符输出流。

5.BufferedReader和bufferedWrite

BufferedReader(读)和BufferedWrite(写)类各拥有8192字符的缓冲区。当BufferedReader()读取文本文件时,会先尽量从文件中读入数据并置入缓冲区,之后使用Reader()方法,会先从缓冲区中读取,如果缓冲区中数据不足,才会从文件中读取。使用BufferedWrite()时,写入的数据不会先输出到目的地,而是先存储至缓冲区中,如果缓冲区中的数据满了,才会一次 对目的地进行写出。如果要在缓冲区中数据未满的情况下将数据写入到目的地,需要使用flush()方法,将数据刷新一下。

6.PrintStream和PrintWrite(打印流)

PrintStream的构造函数:

·public PrintStream(File file):创建具有指定文件新打印流。

·public void print(Object obj):功能强大,可以输出任何对象而不必加以说明。另外

print()方法有许多重载形式,即有多种参数。

·public void println(Object obj):换行

printWrite是与字节流相对应的字符流。printWrite用于大多数输出。

7.内存流、数据流

ByteArrayInputStream和ByteArrayOutputStream为内存流或称为数组流。用于以Io流的方式来完成对字节数组内容的读写,来支持类似内存虚拟文件或者内存映射文件的功能。

ByteArrayInputStream包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪read()方法要提供的下一个字节。

ByteArrayOutputStream类实现了一个输出流,其中的数据被写入一个byte数组。缓冲区会随着数据的不断写入而自动增长。

可用toByteArray()和toString()获取数据。

8.Object对象流

对象序列化:对象序列化可以将对象保存在磁盘中,或者将对象在网络中进行传输。序列化的机制是可以将对象脱离程序的运行而独立存在。

支持序列化机制,需要实现serialisable接口,该接口无须实现任何方法。

使用对象流ObjectInputStream和ObjectOutputStream将对象保存到磁盘上或者通过网络进行传输。

9.浅克隆与深克隆

克隆:Object的clone()方法,会产生此对象的一个副本返回,类似于拷贝了一份当前对象。clone方法是protected修饰的,要实现这个方法首先要实现cloneable接口,然后重写Object对象的clone()方法。

浅克隆:假如有两个类,一个是A类,一个是B类,A类中包含了B类的这样一个引用,例如class B{} ,

class A{

B b=null;

}

在调用A类的clone方法时,返回一个此类的对象副本。需注意的是对于A类中引用类型变量b跟副本中的引用类型b,他们指向了同一个对象。因此无论是通过A类中的引用变量b还是副本中的引用变量b来操作B对象实际上是对同一个对象进行操作,这种不完全的克隆,称为浅克隆。

深克隆:对于IO流中的对象流ObjectInputStrean、ObjectOutputStream来说,当把对象从内存中写入到文件中时,写入的对象保持了对象当时的一个状态。同样如果有两个类,一个A类,一个B类,A类中包含了对B类的一个引用,如果把A类型的对象a1写入到文件中时,因为要保存状态,因此会把a1中的引用类型的B对象也写入到文件中去,当我们把a1对象读取出来时, 此时这个对象是以完全独立的方式存在,与a1没有什么关系了,这时此对象可以成为a1的副本对象a2。通过a1操作它的引用类型b时,a2中的引用类型并不发生变化。这种克隆成为深克隆。

10.ZipOutputStream、ZipFile、ZipInputStream(压缩)

Java中实现zip的压缩需要导入Java.util.zip包,可以用此包下的.ZipOutputStream、ZipFile、ZipInputStream、ZipEntry来实现压缩。

ZipEntry代表的是压缩包中的一个文件实体。

11.RandomAccessFile

用来访问保存数据记录的文件,唯一父类是Object,可以用seek()访问记录并进行读写。

工作方式:把DataInputStream和DataOutputStream粘起来,再加上它自己的一些方法,比如定位用的getFilePointer(),在文件里移动用的seek()、以及判断文件大小的length()。它的构造函数还需要一个打开文件方式的参数,只读‘r’或读写‘rw’,不支持只写文件。

题目:

1.IO是什么意思?data source是什么意思?

Input/output;data source :数据源

2.字节流和字符流有什么区别?输入流和输出流有什么区别?

字节流:处理单元为一个字节,操作字节和字节数组,write、reader。字符流:处理单元为一个字符,用于处理二进制数据,InputStream/OutputStream。输入输出的方向是针对程序而言,向程序中读东西就是输入流,从程序中向外读东西就是输出流。

3.节点流和处理流有什么区别?

节点流可以从(向)一个特定的地方(节点读写数据)。处理流是对一个已存在的流连接和封装,通过所封装的流的功能调用实现数据读写。

4.Word文档能使用字符流操作吗?

不能,可以用字节流操作。Word文档不是纯文本文件,除了文字还包含多种格式信息。

5.流对象使用完后,一般要调用close方法关闭,释放资源,这种做法对吗?

对。

6.InputStream和OutputStream基本特点是?

字节流输入输出类的抽象父类,以字节为单位处理数据,每次读取/写入一个字节,适合处理二进制文件,如音频、视频、文件等。实现类有FileinputStream和FileOutputStream。

7.Reader和Writer的基本特点是?

字符流输入输出的抽象父类,以字符为单位处理数据,每次读取/写入一个字符,适合处理纯文本文件。实现类有FileReader和FileWrite。

8.FileInputStream和FileOutputStream的基本作用是?

字节输入输出流的实现类。

9.FileReader和FileWriter的作用是?

字符输入输出流的实现类。

10.BufferedInputStream和BufferedOutputStream的特点是?

缓冲字节输入/输出流,它不直接连接数据源/目的地,而是以一个节点流为参数,在节点流的基础上,提供一些简单操作。

缓冲流的工作原理:读取到一个字节/字符,先不输出,等凑足了缓冲的最大容量后一次性写出去,从而提高了工作效率。

优点:减少对硬盘的读取次数,降低对硬盘的损耗。

11.InputStreamReader和OutputStreamWriter的作用是?

转换流,用于字节流转换为字符流。InputStreamReader是将字节输入流转换成字符流,OutPutStreamWriter是将字节输出流转换为字符输出流。

12.PrintStream打印流经常用于什么情况?System.out是不是打印流?

PrintStream字节打印流,是OutputStream的实现类,提供了多个重载的print、println方法,可以方便的向文本文件中写入数据。

System.out是字节打印流(printStream的对象),被称为标准的输出流,输出目的地是标准的输出设备,即显示器。

13.DataInputStream和DataOutputStream的特点是?

写入是什么类型的数据,读取时什么类型的数据。要先写后读。

读写顺序要一致,否则会报EOF异常:end of file

数据流可以跨平台写入和读出,适合网络应用。

14.中文乱码是怎么造成的?

编码方式设置不当

15.Unicode字符集几个字节表示一个字符?为什么需要utf-8

2个字节,万国码

16.序列化和反序列化指的是什么?

序列化:将对象以Byte流的形式写入到文件中。将要被序列化的对象的类实现Serializable接口。

反序列化:将文件中的数据以byte流的形式读到程序中来

17.想序列化某个类的对象,该类必须实现Serializable接口吗?

要序化的对象必须实现Serializable接口,以启动序列化的功能。

18.说说Serializable接口的特点.

(1)需要被序列化的对象的类必须实现Serializable接口。给类加个序列化编号,即给类定义一个标记,如:public static final long serialVersionUID=1L;

(2)新的修改后的类还可以操作曾经序列化的对象。

(3)静态是不能被序列化的,序列化只能对堆中的对象进行序列化 ,不能对”方法区”中的对象进行序列化。

(4)不需要序列化的字段前加 transient,如:private transient String password;

19.Transient的作用是?

不希望序列化的属性,可以添加transient关键字;

密码字段是非常敏感的字段,所在在序列化时,不允许写到文件:

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值