流操作分为两种 :1、字节流
2、字符流:字节流读取文字字节数据后,不直接操作而是先查找指定的编码表,获取对应的文字,
再对这个文字进行操作。简单说:字节流+编码表。
输入流(读):把外设数据加载进内存。
输出流(写):把内存数据写入到外设中。
IO常用基类(由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀,如FileInputStream、FileReader) :
1、字节流的抽象基类:InputSream OutputStream
2、字符流的抽象基类(操作文字优先考虑):Reader Writer
public class FileWriterDemo {
private static final String LINE_SEPARATOR = System.getProperty("line.separator");//调用系统换行变量
public static void main(String[] args) {
//要明确写入文字的目的地。如果文件不在会自动创建,如果在则覆盖
FileWriter fw = null;
try {
fw = new FileWriter("C:\\Users\\hp\\Desktop\\demo.txt",true);//boolean代表是否进行续写
fw.write("testing"+LINE_SEPARATOR+"hahaha");//把数据写入临时存储缓冲区(写到流里)
fw.flush();
}catch(IOException e) {
e.printStackTrace();
}finally{
if(fw != null) {//如果路径不存在则fw为null,不加判断会报空指针
try {
fw.close();//关闭前先刷新,关闭后不能写。
}catch(IOException e) {
throw new RuntimeException("系统错误");
}
}
}
}
}
public class FileReaderDemo {
public static void main(String[] args) {
//明确被读取文件,必须存在!!!用一个读取流关联已存在文件
FileReader fr = null;
try {
fr = new FileReader("C:\\Users\\hp\\Desktop\\demo.txt");
char[] res = new char[1024]; //最好是1024的n倍
int num = 0;
while((num = fr.read(res)) != -1) {
//读到几个显示几个。若数组一次装不下第二次读取的数据会从数组开始装填覆盖后面的数据
System.out.print(new String(res,0,num));
}
}catch(IOException e) {
e.printStackTrace();
}finally {
if(fr != null) {
try {
fr.close();
}catch(IOException e) {
throw new RuntimeException("系统错误");
}
}
}
}
}