java学习一目了然——IO
IO是java学习当中很重要的一部分.IO流实现数据的上传下载,即读写数据,包括输入和输出流,输入流指的是将数据以字符或字节形式从外部媒介比如文件、数据库等读取到内存中所以也分为字符输入流和字节输入流。
数据类型:
- 基本流(低级流)
字节流 InputStream/OutputStream 字符流 Reader/Writer(接口类型)
- 高级流(处理流):对基本流进一步操作
字符: Writer--FileWriter Reader--FileReader 字节: Writer--FileOutputStream Reader--FileInputStream
Writer--FileWriter
FileWriter(String filename); FileWriter(File file); write(int c); 写一个单独的字符(在缓冲区中) write(char cbuf[], int off, int len) 写入字符数组(在缓冲区中) public void write(String str, int off, int len) 写入字符串(在缓冲区中) flush(); 刷新缓冲区,将数据真正写入文件,注意这里的写入为修改,而不是追加 close(); 刷新缓冲区,关闭流对象,释放相关资源
构造函数FileWriter(String filename,boolean isAppend)中boolean参数为true时,write()方法为追加
这里的write方法介绍三种种重载
-
写入单个字符
int c = 0; //初始化 while((c=fr.read())!=-1){ fw.write(c); }
-
写入字符数组
char[] chs = new char[1024]; int len = chs.length; while(fr.read(chs)!=-1){ fw.write(chs,0,len); //添加字符数组的长度,为了防止写入时缓冲区未写满而产生多余数据 }
-
写入字符串
char[] chs = new char[1024]; int len = chs.length; while((len = fr.read(chs))!=-1){ fw.write(new String().valueOf(chs,0,len)); //fw.write(new String().valueOf(chs), 0 , len); }
flush方法为刷新缓冲区,在flush方法使用之后write方法写入的数据才真正有效.而close方法调用的同时,会自动将缓冲区flush一下,然后关闭流.
Reader--FileReader
FileReader(String filename); FileReader(File file); int read() 返回读入单一字符对应的int值,并将read位置移到下一位.如果没有读到,返回-1 int read(char cbuf[]) 返回多字符值 int read(char cbuf[], int off, int len)
注意:read和write(Writer类中)其中一个使用三参数的重载即可
代码见FileWriter
Writer--FileOutputStream
write(char); write(int); write(byte[]);//因为是字节流,write没有参数为String的重载 write(byte[],int off,int len);最常用
Reader--FileInputStream
read(byte[]);
高效流:
BufferedWriter(Writer w); BufferedReader(Reader r); 使用方法同上 BufferedWriter: write(String); newLine(); 换行 BufferedReader String readLine(); 读取一行信息
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"));
String line = null; //初始化
while((line = br.readLine())!= null){
if(line.equals("quit")){
break; //读取到退出信息
}
else{
//写入数据三步:写入-换行-刷新
bw.write(line);
bw.newLine();
bw.flush();
}
}
bw.close();
br.close();
字节流与字符流的转化:
字节流转换字符流: InputStreamReader(InputStream); 此时InputStringReader对象将InputStream对象转换为字符流 常用于键盘输入(字节流)的保存或输出(字符流) 注意:键盘输入时的System.in为InputStream类型 因此,高效转换过程为BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 字符流转换字节流: 与之相似,常用于键盘输出 BufferedWriter(new OutputStreamWriter(System.out));
Properties(Map)
Properties可保存到流中也可从流中加载 Object setProperties(String key,String value); 添加 String getProperties(String key) Set<StringstringPropertyNames()
Properties实现集合与IO流的拼接
void load(InputStream is); void load(Reader r); 读到的文件输入流按照格式直接存入Properties的Map集合中 void store(OutputStream os,String comments); void store(Writer w,String comments);以键值对的形式写入文件
打印流
直接操作文件 PrintWriter(File file); PrintWriter(String filePath);(不自动刷新缓冲区) PrintWriter(OutputStream os); PrintWriter(Writer w); println自动刷新缓冲区 print(...); println(...); println在某些情况下可以自动刷新缓冲区,具体情况如上 当println方法自动刷新时,相当于BufferedWriter中的writer(ln);newLine();flush();三个方法