JavaSE---IO流
1、Java中把不同的输入、输出源(键盘、文件读写、网络连接等)抽象为流(Stream);
2、通过流的方式,允许Java程序 以相同的方式 来访问不同的输入/输出源;
3、流的分类:
1、按流向分:(输入、输出是从程序运行所在的内存角度出发)
输入流:只能从其读取数据,不能写入数据;
输出流:只能向其写数据,不能读取数据;
2、按操作数据单元的不同:
字节流:操作的最小数据单元是8位的字节;
字符流:操作的最小数据单元是16位的字符;
3、按流的角色:
节点流:可以从/向一个特定的IO设备(磁盘、网络等)读/写数据的流(又称为低级流、使用节点流,程序直接连接到实际的数据源);
处理流:对一个已存在的流进行封装来实现数据的读/写(又称为高级流);
使用处理流的好处:只要使用相同的处理流,就可以使用相同的输入/输出代码来访问不同的数据源;
4、【节点流---输入流】
1、InputStream:
方法:
int read(); 从输入流中读取单个字节,返回 读取的字节数据;
int read(byte[] buffer); 从输入流中读取最多buffer.length个字节的数据, 并将其存储在字节数组buffer中, 返回 实际读取的字节数;
int read(byte[] buffer,int off,int length);
package com.an.io; import java.io.FileInputStream; import java.io.InputStream; public class InputSreamTest { public static void main(String[] args) { String userDir = System.getProperty("user.dir"); InputStream inputStream = null; try { inputStream = new FileInputStream(userDir + "/src/com/an/Server.java"); byte[] buffer = new byte[1024]; int length = inputStream.read(buffer); if (length > 0) { System.out.println(new String(buffer, 0, buffer.length).trim()); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (inputStream != null) { inputStream.close(); } } catch (Exception e) { e.printStackTrace(); } } } }
2、Reader:
方法:
int read(); 从输入流中读取单个字符,返回 读取的字符数据;
int read(char[] buffer); 从输入流中读取最多buffer.length个字符的数据, 并将其存储在字符数组buffer中, 返回 实际读取的字符数;
int read(char[] buffer,int off,int length);
package com.an.io;
import java.io.FileReader;
import java.io.Reader;
public class ReaderTest {
public static void main(String[] args){
Reader reader=null;
try {
reader=new FileReader(System.getProperty("user.dir")+"/src/com/an/Server.java");
char[] buffer=new char[10240];
int length=reader.read(buffer);
if (length>0){
System.out.println(new String(buffer,0,buffer.length).trim());
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if (reader!=null){
reader.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
3、InputStream和Reader本身不能创建实例,它们都有一个 用于读取文件的流:FileInputStream、FileReader
5、【节点流---输出流】
1、OutputStream
方法:
void write(int c); 将指定字节、字符输出到输出流中;
void write(byte[]/char[] buffer); 将指定字节/字符数组输出到输出流中;
void write(byte[]/char[] buffer,int off,int length);
package com.an.io; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; public class OutputStreamTest { public static void main(String[] args){ InputStream inputStream=null; OutputStream outputStream=null; try { inputStream=new FileInputStream(System.getProperty("user.dir")+"/src/com/an/Server.java"); byte[] buffer=new byte[10240]; int length=inputStream.read(buffer); if (length>0){ outputStream=new FileOutputStream(System.getProperty("user.dir")+"/src/com/an/CopyServer.text"); outputStream.write(buffer); } }catch (Exception e){ e.printStackTrace(); }finally { try { if (outputStream!=null){ outputStream.close(); } if (inputStream!=null){ inputStream.close(); } }catch (Exception e){ e.printStackTrace(); } } } }
2、Writer
方法:
void write(String s); 将指定字符串输出到输出流中;
void write(String s,int off,int length);
package com.an.io; import java.io.FileReader; import java.io.FileWriter; import java.io.Reader; import java.io.Writer; public class WriterTest { public static void main(String[] args){ Reader reader=null; Writer writer=null; try { reader=new FileReader(System.getProperty("user.dir")+"/src/com/an/Server.java"); char[] buffer=new char[10240]; int length=reader.read(buffer); if (length>0){ writer=new FileWriter(System.getProperty("user.dir")+"/src/com/an/CopyTwoServer.text"); writer.write(buffer); } }catch (Exception e){ e.printStackTrace(); }finally { try { if (writer!=null){ writer.close(); } if (reader!=null){ reader.close(); } }catch (Exception e){ e.printStackTrace(); } } } }
6、【处理流】
1、当使用处理流时,关闭输入/输出流资源时,只需要关闭最上层的处理流即可(系统会自动关闭该处理流封装的节点流);
2、BufferReader
1.1 BufferReader具有一个缓冲功能,一次可以读取一行文本(以换行符为准,如果没有读到换行符,程序将阻塞,直到读到换行符为止);
1.2 经常把读取文本的输入字节流包装为BufferReader;
package com.an.io; import java.io.BufferedReader; import java.io.InputStreamReader; /** * java的标准输入流System.in、标准输出流System.out */ public class TransferStreamTest { public static void main(String[] args){ InputStreamReader inputStreamReader=null; BufferedReader bufferedReader=null; try { inputStreamReader=new InputStreamReader(System.in); bufferedReader=new BufferedReader(inputStreamReader); String line=null; while ((line=bufferedReader.readLine())!=null){ if (line.equals("exit")){ System.exit(1); } System.out.println(line); } }catch (Exception e){ e.printStackTrace(); }finally { try { if (bufferedReader!=null){ bufferedReader.close(); } }catch (Exception e){ e.printStackTrace(); } } } }
7、【节点流、处理流使用指南】:
如果需要处理的内容是文本,推荐使用字符流;
如果需要处理的内容是二进制内容,推荐使用字节流;
8、常识:
计算机的文件分为:文本文件、二进制文件(实质是:计算机中所有的文件均为二进制文件,当二进制文件恰好被解析成字符时,就成了文本文件)
【文本文件】:
二进制文件能被解析成字符的文件称为文本文件;
【二进制文件】:
二进制文件不能被解析成字符的文件;
9、转换流:
1.1 InputStreamReader: 将字节输入流转换为字符输入流;
1.2 OutputStreamWriter: 将字节输出流转换为字符输出流;
9、IO流体系