输出和输入都是以程序为中心
File类:代表系统文件名(路径和文件名)
可以进行创建、删除文件和路径等操作,只对文件本身进行操作,并不涉及文件的具体内容
路径分隔符常量:public static final String separator;
String separator = File.separator;
创建带路径的文件:
创建文件前判断父路径(getParentFile()取得父路径)是否存在,
如果不存在则应该先创建目录(mkdirs()创建多级目录),再创建文件
列出指定目录下的所有文件及子目录信息(FileList.java)
先判断给定的路径是否是目录,如果是则应该列出,再对每个子目录进行判断
采用递归的方式
判断文件是否存在:public boolean exists();
java.io包中定义了多个流类型来实现输入输出功能
所有的流类型都分别继承四个抽象流(抽象类),
字节流 字符流
输入流:IntputStream Reader
输出流:OutoutStream Writer
继承自IntputStream的流都是用于向程序中输入数据,且数据的单位为字节(8 bit)
继承自Writer的流都是用于向程序中输入数据,且数据的单位为字符(16 bit)
继承自Reader的流都是用于向程序中输出数据,且数据的单位为字符(16 bit)
继承自OutputStream的流都是用于向程序中输出数据,且数据的单位为字节(8 bit)
节点流:可以从一个特定的数据源(节点)读写数据(如文件、内存),
处理流:“连接”在已存在的流(节点流和处理流)之上,通过对数据处理为程序提供更强大的读写功能
流相当于一个管道,比如fileInputStream就是连接在文件的上一个管道。
FileInputStream in = new FileInputStream("E:\\Java\\eclipse-jee-mars-R-win32-x86_64 JDK 1.7+\\MyProject\\mydir1\\mydir2\\myfile2.txt");
in这个对象(管道)就连接在文件myfile2.txt上,可以从文件中输出数据,输入到程序中
处理流就是在管道外面再套一层管道,BufferedInputStream属于处理流。
BufferedInputStream bis = new BufferedInputStream(in),
bis这个对象(管道)就是套在in这个管道外面的一个管道,也可以从文件myfile2.txt上得到数据
输出一般用打印流,输入一般用BufferedReader或者扫描流
输出
OutputStream常用方法:
a、public void close() throws IOException 关闭字节输出流
b、flush()这个函数是清空的意思,用于清空缓冲区的数据流,
进行流的操作时,数据先被读到内存中,然后再用数据写到文件中,
那么当你数据读完时,我们如果这时调用close()方法关闭读写流,这时就可能造成数据丢失
c、public void write(byte b[], int off, int len) throws IOException 输出部分字节数组数据
d、c表明使用OutputStream输出数据必须是字节类型数据,为了解决这个问题,java提供了打印流
FileOutputStream是抽象类OutputStream的一个字类,用于进行文件操作
构造方法:public FileOutputStream(File file) throws FileNotFoundException
一根管道插在了文件file上面,用于程序向文件输出数据
举例: P478
输入
字符缓冲流输入:a、 BufferedReader buf = new BufferedReader(new InputStreamReader(System.in))
//System.in是InputStream类对象,BufferedReader的构造方法里面需要接收Reader类对象
//利用InputStreamReader将字节流对象变为字符流对象
b、 BufferedReader in = new BufferedReader(new FileReader(file));
String str=in.readLine();
重点 //BufferedReader是Reader的子类,具有readLine方法(读一行数据,且以String类型的形式返回)
字节流和字符流的区别:
a、字节流直接与终端文件进行数据交互,字符流需要将数据经过缓冲区处理才与终端文件数据交互
b、字符流可以对中文进行有效处理,如果没有中文则推荐使用字节流
转换流:InputStreamReader、OutputStreamWriter
构造方法:public InputStreamReader(InputStream in)
InputStreamReader类的构造方法中接受InputStream类的对象,
而InputStreamReader是Reader类的子类,该类可以向上转型成Reader类对象,
这样可以把字节输入流转换成字符输入流
打印流:
PrintStream(字节打印流)、PrintWriter(字符打印流)
PrintStream是OutputStream的子类
PrintStream的方法:
构造方法:public PrintStream(OutPutStream out)
普通方法:public void print()
public void println()
System.out是进行屏幕输出的操作对象,是一个PrintStream类的实例化对象
由于PrintStream是OutputStream的子类,所以也可以利用System.out为OutputStream类进行实例化
OutPutStream out = System.out;
Out.write("cqubob".getBytes[]);
System.in是进行键盘输入的操作对象,是一个InputStream类的实例化对象
InputStream input = System in;
byte data[] = new byte[1024];
int len = input.read(data);
System.out.println(new String(data,0,len))
扫描流:java.util.Scanner
构造方法:public Scanner(InputStream source) 接受InputStream输入流对象,以此为输入源
方法:public boolean hasNext() 判断是否有数据输入
public String next() 取得数据,以String的形式返回
public Scanner useDelimiter(String pattern) 设置读取的分隔符
P512、
内存流: ByteArrayInputStream(内存字节输入流)、ByteArrayOutputStream(内存字节输出流)
构造方法:public ByteArrayInputStream(byte buf[])
构造方法:public ByteArrayOutputStream()
在内存流实例化对象时就必须准备好要操作的数据信息,
内存流的操作实质就是将操作数据先保存到内存(不是程序)中,然后利用IO流操作进行单个字节的处理
P498
对象序列化:将内存中所保存的对象数据转换为二进制数据流进行传输的操作
实现Serializable接口的类可进行序列化操作
在开发中只有需要传输对象所在的类时才需要实现Serializable接口,主要是指简单java类
一个类中的属性如果使用transient关键字声明,则此属性的内容不会被序列化
对象的输入输出主要使用ObjectInputStream和ObjectOutputStream类完成
以后开发中,只要操作的不是二进制数据,输出都使用打印流,输入使用扫描流或者字符缓冲区输入流