数据流分为输入流(InputStream)和输出流(OutputStream)
InputStream属于字节输入类,System.in 作为字节输入流类InputStream 的对象in 实现标准的输入,其中有read方法从键盘接收数据;
InputStream的子类FileInputStream(文件字节输入流类)
FileInputStream用于顺序访问本地文件,读取原始字节流。
如:FileInputStream fis = new FileInputStream(“存放文件的路径”);
FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象file指定。而FileInputStream(String name)通过文件系统中的路径名name 指定。
//一个File的简单运用
File file = new File(fd.getDirectory(),fd.getFile());//获取此文件对话框的目录,根据指定的路径中的文件返回相应的File对象
FileInputStream现阶段最常见的两个方法close()和read()
OutputStream 属于字节输出类,System.out 作为打印流类PrintStream的对象out实现标准输出,其中有print和println两个方法;System.err 与System.out相同,而System.out是实现PrintStream的对象out的标准输出,System.err是实现标准的错误输出。
OutputStream的子类FileOutputStream(文件字节输出流)
用于将数据写入File或FileDescriptor的输入流。
例如:FileOutputStream fos = new FileOutputStream(“文件路径”);
Fos.write(“hell world”);
主要的方法有close()和write()
Reader类和Writer类
它们专门处理字符流,这两类都是抽象类.
Reader常见的方法:int read():读取一个字符。返回的是读到的那个字符,如果读到流的末尾,返回-1。int read(char[]):将读到的字符存入指定的数组中,返回的是读到的字符个数,也就是往数组里装的元素的个数。如果读到流的末尾,返回-1。Close():读取字符其实用的是window系统的功能,就希望使用完毕后,进行资源的释放。
Reader的子类FileReader:
用于读取文本文件的流对象,用于关联文本文件。(读取字符文件)
例如:FileReader fr = new FileReader(“文本文件”);
在使用FileReader操作文本数据时,该对象使用的是默认的编码表,如果要使用指定的编码表时,必须使用转换流。
FileReader fr = new FileReader(”a.txt”);//文本文件中的数据使用的是本系统默认的GBK
等同于InputStreamReader isr = new InputStreamReader(new FileInputStream(“a.txt”));
如果a.txt中的文件中的字符数据是通过utf-8的形式编码。那么在读取时,必须指定编码表并使用转换流InputStreamReader isr = new InputStreamReader(new FileInputStream(“a.txt”),”urf-8”);
字符流的缓冲区BufferedReader
特有方法:readLine():一次读一行,把字符数据作为字符串返回
例如:
BufferedReader bufr = new BufferedReader(new FileReader(“buf.txt”));
String line = null;
While((line=bufr.readLine())!=null){}
Writer中的常见的方法:write(ch):将一个字符写入到流中;write(char[]):将一个字符数组写入到流中。Write(String)将一个字符串写入到流中。Flush():刷新流,将流中的数据刷新到目的地中,流还存在。Close():关闭资源:先关闭前会先调用flush,刷新流中的数据去目的地。然后流关闭。
FileWriter://用法
FileWriter fw = new FileWriter(“demo.txt”);
Fw.write(“safsd”);
BufferedWriter:
特有的方法:newLine():跨平台的换行符。
建立缓冲区对象必须把流对象作为参数传递给缓冲区的构造函数。
bufferedWriter bufw = new BufferedWriter(new FileWriter(“buf.txt”));
bufw.write(:absd”);//将数据写入到了缓冲区
bufw.flush();//对缓冲区的数据进行刷新。将数据刷到目的地中。
bufw.close();/关闭缓冲区,其实关闭的是被包装在内部的流对象。
字节缓冲流 BufferedInputStream 和 BufferedOutputStream
BufferedInputStream为另一个输入流添加一些功能,在创建BufferedInputStream时,会创建一个内部缓冲区数组。
例如:FileInputStream fis = new FileInputStream(“”);
BufferedInputStream bis = new BufferedInputStream(fis);
DateInputStream dis = new DataInputStream(bis);
BufferedOutputStream:该类实现缓冲的输出流。
例如:FileOutputStream fos = new FileOutputStream(“”);
BufferedOutputStream bos = new BufferedOutputStream(fos);
DateOutputStream dos = new DataOutputStream(bos);
主要的方法:flush():刷新此缓冲的输出流;write():将指定的字节写入缓冲的输入流。
打印流PrintStream:为其他输入流添加了功能,使它们能够方便的打印各种数据值表示形式。打印的所有字符都使用平台的默认字符编码转换为字节。在需要写入字符而不是写入字节的情况下,应该使用PrintWriter类。
//既有自动刷新,又可执行编码
PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(“a.txt”),”utf-8”),true);//该自动刷新值为true时,只有三个方法可以用:println,printf,format。
//提高效率并且使用打印方法
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(“a.txt”),”utf-8”)),true);
管道流:PipedInputStream和PipedOutputStream
可以将管道输出流接到管道输入流来创建通信管道,通常两个流在使用的时候,需要加入多线程技术,也就是让读写同时运行。
合并流SequenceInputStream:它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,然后再读取第二个输入流,直到最后一个输入流。
例如:FileInputStream fis1 = new FileInputStream(“res/a.txt”);
FileInputStream fis1 = new FileInputStream(“res/b.txt”);
SequenceInputStream sis = new SequenceInputStream(fis1,fis2);
编码转换:
字符串—>字节数组:编码。通过getBytes(charset);
字节数组à字符串:解码。通过String类的构造函数完成。String(byte[],charset);