java把输入/输出源称为流。流可分为输入流(只能从中读取数据)和输出流(只能向其写入数据)。输入、输出都是站在内存的角度来划分的,比如从程序运行所在内存写数据到磁盘,通常称为输出流。流又可分为字节流(所操作的数据单元是8位字节)、字符流(所操作的数据单元位16位字符)。流还可分为节点流和处理流,节点流和数据源直接相连,处理流将已存在的流根据数据源类型进行封装,可以采用相同的输入/输出代码访问不同的数据源。处理流还可提供缓存提高输入、输出效率,允许批量输入、输出数据。
InputStream和Reader是所有输入流的基类,它们分别有两个对应的实现类:FileInputStream,FileReader。
public class FileInputStreamTest { public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("E:/wz.txt"); byte[] buff = new byte[1024]; int hasRead = 0; // while read end,read() return -1 while ((hasRead = fis.read(buff)) > 0) { System.out.print(new String(buff, 0, hasRead)); } //I/O resource is not internal memory,as a result,it can not collection by GC fis.close(); } }
IO资源需要手动进行关闭,java7对其进行了改进,可以通过try语句对其进行自动关闭。
public class FileReaderTest { public static void main(String[] args) throws IOException { try (FileReader fr = new FileReader("E:/wz.txt")) { char[] buff = new char[1024]; int hasRead = 0; while ((hasRead = fr.read(buff)) > 0) { System.out.println(new String(buff, 0, hasRead)); } } catch (IOException ex) { ex.printStackTrace(); } } }