1.IO的概念
IO操作就是指使用JAVA进行输入和输出的操作,JAVA所有的IO操作都是基于数据流进行的,这些数据流代表了字符或者字节数据的流动顺序。JAVA中提供了读写数据的标准方法。JAVA中任何数据源的对象都会提供数据流方法。Java.io包中包含了大多数输入输出类。
2.数据流的概念
假设我们在桌面上新建了一个文件,现在要用Java向其中写入一段数据,这段数据来源于另一个文件。可以将这两个文件想象为两个装水的桶A和B,现在要用水管将A桶中的水转移到B桶中,流就是水管中的水流,数据——即水,就会通过这个水管从A桶流向B桶。而B可以选择每次接受的水量,可以是1g,也可以是1kg。但是由于水已经在管道中排好顺序,所以B不能选择接受水的顺序,只能按顺序每次接受一定量的水。
当程序需要读取数据时,就会开启一条通往数据源的数据流管道,同样,当程序需要写入数据的时候,就会开启一条通往目的地的数据流管道。数据流就会通过管道在内存中往返。
概括起来就是:
数据流:一组有序,有起点和终点的数据序列。包括输入流和输出流。
输入流:程序从输入流读取数据。
输出流:程序向输出流发送数据。
数据流分为字节流和字符流。
3.标准输入输出流
在java.lang.System类中,有三个常量:
public final static InputStream in = null;
public final static PrintStream out = null;
public final static PrintStream err = null;
1)标准输出流System.out
向输出设备输出数据
2)标准输入流System.in
从键盘获得数据
3)标准错误流System.err
输出错误提示(通常输出语句标红)
4.java.io包中的重要类和接口
五个类:File、OutputStream、InputStream、Writer、Reader;
一个接口:Serializable;
在io包中主要包含以下三个部分:
1.流式部分:IO主体部分
2.非流式部分:主要包含一些辅助流式部分的类
3.其他类:文件读取部分的与安全相关的类
5.File类
包含了文件或者目录的一些操作方法,比如:生成新目录,修改文件名,删除文件,判断文件所在路径等;
public class File implements Serializable, Comparable<File>{
}
构造方法:
1.File(String pathname)
作用:通过给定的路径名来创建File对象,若字符串为空,结果是空的路径名
例如:File f1 = new File(“c:\test\test.txt”);(注:多一个“\”是因为“\t”是转义字符)
2.File(String parent,String child)
作用:通过传入的父子路径名创建新的File对象,如果parent是null则创建新的File实例,等价于构造方法1。
例如:File f2 = new File(“c:\test”,“test.txt”);
3.File(File parent,String child)
作用:通过传入的父子路径名创建新的File对象,如果parent是null则创建新的File实例,等价于构造方法1。
例如:File parent = new File(“c:\test”);
File f3 = new File(parent,“text.txt”);
常用方法
1.boolean createNewFile():创建文件(文件路径和文件名在构造方法中已给出)
2.boolean mkdir():创建文件夹
3.boolean delete():删除文件或文件夹
4.String getName():返回路径中表示的文件或文件夹名
5.String getPath():返回路径名
6.long length():返回文件字节数
7.String getAbsolutePath()
File getAbsoluteFile():获取绝对路径
8.String getParent()
File getParebtFile():获取父路径
9.boolean exists():判断路径是否存在
10.boolean isDirectory():判断路径是不是文件夹
11.boolean isFile():判断是否是文件
12.String[] list()
File[] listFiles():遍历文件夹
例如:
package test;
import java.io.File;
import java.io.IOException;
public class test {
public static void main(String[] args) throws Exception {
File f1 = new File("D:\\text");
File f2 = new File(f1,"text.txt");
f1.mkdir();
f2.createNewFile();
String fileName = f2.getName();
String pathName = f2.getPath();
long length = f2.length();
System.out.println("文件名为"+fileName);
System.out.println("路径为"+pathName);
System.out.println("文件字节大小为"+length);
f2.delete();
f1.delete();
}
}
输出为:
文件名为text.txt
路径为D:\text\text.txt
文件字节大小为0
6.流式部分类
1)IO基类(InputStream/Reader、OutputStream/Writer)
输入流InputStream和Reader
常用方法:
abstract int read():从输入流读取下一个字节/字符并返回,无字节/字符可读取则返回-1
重载方法:read(byte[] b/char[] b):读取b.length长度的字节/字符到缓冲区b,返回读取的字节/字符长度,无字节/字符可读取则返回-1
read(byte[] b/char[] b,int off,int len):读取len长度的字节/字符并从b[off]开始储存,返回读取的字节/字符长度,无字节/字符可读取则返回-1
输出流OutputStream和Writer
常用方法:
void write():将指定的字节/字符输出到输出流中,其中c即可以代表字节,也可以代表字符。
重载方法:write(byte[] b/char[] b):将字节数组/字符数组中的数据输出到指定输出流中。
write(byte[] b/char[] b,int off,int len):将字节数组/字符数组中从off位置开始,长度为len的字节/字符输出到输出流中
Writer中还包含两个方法:
void write(String str); 将str字符串里包含的字符输出到指定输出流中。
void write (String str, int off, int len); 将str字符串里面从off位置开始,长度为len的字符输出到指定输出流中。
2)IO文件流(FileInputStream/FileReader、FileOutputStream/FileWriter)
InputStream和Reader都是抽象类,本身不能创建对象,但他们分别有一个用于读取文件的输入流:FileInputStream和FileReader,他们都是节点流,会直接和文件关联。
FileInputStream
构造方法:FileInputStream(File file)
FileInputStream(String name)
创建实例对象并与指定文件关联
FileReader
构造方法:FileReader(File file)
FileReader(String name)
创建实例对象并与指定文件关联
FileOutputStream和FileWriter相似
3)IO缓冲流(BufferedInputStream/BufferedReader, BufferedOutputStream/BufferedWriter)
缓冲流概述:
缓冲流是对文件流处理的一种流,其本身并不具备IO功能,只是加上缓冲提高了效率。当处理文件时,缓冲力会先将数据放到内存中缓存起来,当积累一定数量时,再将数据一次性写入或读取出来。在IO操作时加上缓冲流能提高效率。
因为缓冲流实现了缓冲功能,所以在使用完后,要记得调用flush或close方法,取出缓冲区中的数据,否则可能无法写出数据。
构造方法:
Class (父类 cl):创建默认缓冲区大小的对象并保存参数
Class(父类 cl,int size):创建指定缓冲区大小的对象并保存参数
4)IO转换流(InputStreamReader/OutputStreamWriter)
InputStreamReader:
字节流通向字符流的桥梁,用指定的编码表读取字节并将其解码为字符。
OutputStreamWriter:
字符流向字节流的桥梁,用指定的编码表将要写入流中的字符解码为字节。
构造方法:
InputStreamReader(InputStream in) :创建一个使用默认字符集的InputStreamReader。
InputStreamReader(InputStream in, Charset cs) :创建一个使用给定字符集的InputStreamReader。
OutputStreamWriter(OutputStream out) :创建一个使用默认字符编码的OutputStreamWriter。
OutputStreamWriter(OutputStream out, Charset cs) :创建一个使用给定字符集的OutputStreamWriter。
两个子类:FileReader/FileWriter
子类与父类的区别:
父类能使用指定的编码表进行解码,而子类只能使用系统默认的编码表进行解码。
5)IO对象流(ObjectInputStream/ObjectOutputStream)
对象的读写,对对象进行序列化和反序列化。
要求:
1.类必须实现Serializable接口;
2.静态不能被序列化;
3.不需要序列化的字段前加transient。