Input,Output,Stream IO流
I/O Input/Output缩写、I/O技术用于处理设备之间的数据传输,读写文件,网络通讯
Java程序对于数据的操作以Stream流的形式进行
io包提供了各种流的类与接口,以获取不同种类型的数据,并通过标准方式输入输出数据
输入和输出的关系
Input 输入 是从数据存储文件中把数据读取到内存中的过程【硬盘 -> 内存】
Output输出 是从内存中把数据写入到存储文件中的过程 【内存 -> 硬盘】
流的分类
- 按数据单位分:字节流 8bit、字符流 16bit
- 按流的方向分:输入流、输出流
- 按流的角色分: 节点流 处理流
抽象基类4个
- 输入流 InputStream
- 输出流 OutputStream
- 读取流 Reader
- 读写流 Writter
继承的实现就是这4个实现类加前缀名称,节点流、缓冲流、XX流等等
节点的读取操作:
public class IOTest { public static void main(String[] args) throws IOException { File file = new File("fileSample.txt"); FileReader fileReader = new FileReader(file); // 返回读入的一个字符,如果读入文件的末尾,返回-1 //int read = fileReader.read(); int c = fileReader.read() ; while ( c != -1 ){ System.out.print((char)c + "\t"); c = fileReader.read(); } // 读取完毕 释放资源 物理链接GC不会对其回收 Scanner JDBC I/O Socket fileReader.close(); // 异常处理、为了保证流资源一定可以执行关闭操作、建议使用try-catch-finally // FileNotFoundException 系统找不到指定的文件 要保证文件位置正确和存在 } }
使用try-catch-finally处理
public class IOTest { public static void main(String[] args) { File file = new File("fileSample.txt"); FileReader fileReader = null; try { fileReader = new FileReader(file); int c = fileReader.read() ; while ( c != -1 ){ System.out.print((char)c + "\t"); c = fileReader.read(); } } catch (Exception e) { e.printStackTrace(); }finally { if (fileReader != null) { try { fileReader.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
使用数组作为缓冲容器的问题:
public class IOTest { public static void main(String[] args) throws Exception { File file = new File("fileSample.txt"); Reader reader = new FileReader(file); // 缓冲容器 char[] buffer = new char[5]; int len; while ( (len = reader.read(buffer)) != -1){ // 根据索引的个数遍历 for (int i = 0; i < buffer.length; i++) { // Hello World!!!ld!!! 可能会出现这样的情况 // 问题出现在于如果已经读完了数据,但是多出的之前的已经放进去的数据也被读出来了!!! System.out.println(buffer[i]); } } reader.close(); } }
正确的遍历方式
public class IOTest { public static void main(String[] args) throws Exception { File file = new File("fileSample.txt"); Reader reader = new FileReader(file); // 缓冲容器 char[] buffer = new char[5]; int len; while ( (len = reader.read(buffer)) != -1){ // 根据索引的个数遍历 for (int i = 0; i < len; i++) { // Hello World!!!ld!!! 可能会出现这样的情况 // 问题出现在于如果已经读完了数据,但是多出的之前的已经放进去的数据也被读出来了!!! System.out.println(buffer[i]); } } reader.close(); } }
用String接收
public class IOTest { public static void main(String[] args) throws Exception { File file = new File("fileSample.txt"); Reader reader = new FileReader(file); // 缓冲容器 char[] buffer = new char[5]; int len; while ( (len = reader.read(buffer)) != -1){ // 用String读取 从0 到末尾的前一位读取 String str = new String(buffer,0,len); System.out.print(str + "\t"); } reader.close(); } }
写出数据:
public class IOTest { public static void main(String[] args) throws Exception { // 输出的文件如果不存在,输出流对象会直接创建文件然后进行输出 File file = new File("fileSample.txt"); // 写出文件的位置 Writer writer = new FileWriter(file,true); // new FileWriter(file,true) 在原有文件上追加写入数据 // new FileWriter(file,false) or new FileWriter(file) 覆写操作 // 原始数据 String data = "\n这是我们要写入的数据!!!"; // 转换成字符数组作为可传输的格式 char[] chars = data.toCharArray(); // 读写数据 覆盖写入的操作 writer.write(chars); writer.write("\n直接写入的数据".toCharArray()); writer.close(); } }
读写同时操作,复制文件
public class IOTest { public static void main(String[] args) throws Exception { // 读取文件 File src = new File("fileSample.txt"); // 读写文件 File dest = new File("destSample.txt"); // 文件读取流对象 Reader reader = new FileReader(src); // 文件读写对象 Writer writer = new FileWriter(dest); // 缓冲数组 char[] readerBuffer = new char[3]; int read; // 每次读取的个数 while ( (read = reader.read(readerBuffer)) != -1 ){ System.out.print(read+"..."); // 打印显示 System.out.print("\n" + new String(readerBuffer) + "\n"); writer.write(readerBuffer,0,read); // 写入字符数组 } reader.close(); writer.close(); } }