一.缓冲输入文件
public class BufferedReaderFile {
public static String read (String filePath){
//确定流对象是一个文件故通过FileReaderf封装文件(在java中将有能力产生数据的数据源对象或有能力接收数据的接收端对象抽象成"流")
FileReader in = new FileReader(filePath);
//BufferedReader是一个装饰器对象,他提供一个用来一个按行读取的方式,最重要的是这个对象对文件进行了缓存,能提高读取的速度
BufferedReader reader = new BufferedReader(in);
String s;
StringBuffered buffer = new StringBuffered();
while((s = reader.readLine()) != null){
buffer.append(s);
}
return buffer.toString();
}
}
二.从内存中输入
public class MemoryInput {
public static void main(String [] args){
//通过read()方法我们获取的是字符串故我们的源对象是字符串类型的,所以我们用StringReader来封装我们的流对象
StringReader in = new StringReader(BufferedReaderFile.read(filePath));
int c;
//read()方法是已int类型返回下一个字节
while ((c = in.read()) != -1){
System.out.print((char) c);
}
}
}
三.内存输入格式化
//要读取格式化数据,可以使用DataInputStream,它是一个面向字节I/O类(并且他是一个装饰器类继承FilterInputStream类),因为我们的数据源是字符串故我们将数据源转换成字节。之所以DataInputStream 能读取格式化数据,是因为它提供了诸如readDouble(),readeUTF,readByte()等方法,在格式数据前你必须清除数据源中的数据都是什么类型的。
public class FormatterMemoryInput {
public static void main (String [] args){
DataInputStream in = new DataInputStream(new ByteArrayInputStream(BufferedReader.read(filePath).getBytes))
//available()方法字面意思是"在没有阻塞的情况下所能读取的字节数".对于文件,意味着整个文件;但对于不同类型的流,可能就不是这样的了,因此要谨慎使用
while (in.available() != 0){
System.out.print((char)in.readByte());
}
}
}
四.基本的文件输出
//既然我们的流对象是文件,那么我们可以使用FileWriter将文件写入数据,但我们为了增强I/O操作的性能,会使用BufferedWriter将其包装起来用缓冲输出,同时使用PrintWriter提供格式化
public class BasicFileOutput{
public static void main(String [] args){
//创建一个输入流对象
StringReader reader = new StringReader(BufferedReaderFile.read(filepath));
BufferedReader in = new BuffferedReader(reader);
//创建一个输出流对象(方式一)
FileWriter writer = new FileWriter(filePath);
BufferedWriter buffer = new BufferedWriter(writer);
PrintWriter out = new PrintWriter(buffer);
//创建一个输出流对象(方式二) 这种方式可谓是PrintWriter输出数据的快捷方式
//PrintWriter out = new PrintWriter(file)
String s;
while ((s = in.readLine()) != null){
//写入一行后换行
out.println(s)
}
}
}
五.存储和恢复数据
//PrintWriter 可以对数据进行格式化,以便人们阅读。但是为了输出可供另一个"流"恢复数据,我们需要用DataOutputStream写入数据,并用DataInputStream恢复数据。我们已文件为例。并且对读写操作进行缓冲
public class StoringAndRecoveringData{
public static void main(String [] args){
DataOutputStream out = new DataOutputStream( new BufferedOutputStream(new FileOutputStream(file)));
out.writeDouble(3.1415);
out.writeUTF("That was pi");
out.writeDouble(1.434);
out.close();
DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
System.out.println(in.readDouble());
System.out.println(in.readUTF());
System.out.println(in.readDouble());
//可以看到我们使用DataOutputStream写入数据,Java保证我们用DataInputStream准确地读取数据(无论读和写数据的平台多么不同)
}
}
六.读写随机访问文件
//RandomAccessFile是一个比较独立的类,之所以说他独立是因为他既没有实现InputStream 也没有实现OutputStream,他提供了seek()方法可以移动到文件的任意位置进行写入操作,因为他实现了DataOutInput和DataInput接口可以说是DataInputStream和DataOutputStream的集合体
public class UsingRandomAccessFile{
public static void main(String [] args){
//构造函数接收两个参数,一个表示文件对象,第二个表示对文件对象的操作权利(读r和写w)
RandomAccessFile rf = new RandomAccessFile(file,"rw");
for (int i = 0; i < 7; i++){
rf.writeDouble(i * 3.1314);
}
//因为double是8个字节长度,查找第5个double值(相当于将光标移动到此处)
rf.seek(5*8);
rf.writeUTF("This end");
rf.close();
}
}
七.管道流
PipedInputStream, PipedOutputStream,PipedReader,PipedWriter 他们的价值是用于任务之间的通信。