Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言. Java 技术具有卓越的通用性, 高效性, 平台移植性和安全性, 广泛应用于 PC, 数据中心, 游戏控制台, 科学超级计算机, 移动电话和互联网, 同时拥有全球最大的开发者专业社群.
给你学习路线: html-CSS-js-jq-javase - 数据库 - jsp-servlet-Struts2-hibernate-mybatis-spring4-springmvc-ssh-ssm
一, 概念
在 Java 中, 文件的输入和输出是通过流 (Stream) 来实现的. 一个流, 必有源端和目的端, 它们可以是计算机内存的某些区域, 也可以是磁盘文件, 甚至可以是 Internet 上的某个 URL. 对于流而言, 我们不用关心数据是如何传输的, 只需要向源端输入数据, 从目的端获取数据即可.
流按照处理数据的单位, 可以分为字节流和字符流. 字节流的处理单位是字节, 通常用来处理二进制文件, 例如音乐, 图片文件等. 而字符流的处理单位是字符, 因为 Java 采用 Unicode 编码, Java 字符流处理的即为 Unicode 字符, 所以在操作汉字, 国际化等方面, 字符流具有优势.
小编推荐一个学 Java 的学习裙[ 七六零, 二五零, 五四一 ] , 无论你是大牛还是小白, 是想转行还是想入行都可以来了解一起进步一起学习! 裙内有开发工具, 很多干货和技术资料分享!
二, 字节流
所有的字节流类都继承自 InputStream 和 OutputStream 这两个抽象类, 下面列举了 5 个输入字节流类, 输出字节流类和输入字节流类存在对应关系, 这个就不一一列举了.
FileInputStream: 把一个文件作为输入源, 从本地文件系统中读取数据字节, 实现对文件的读取操作.
ByteArrayInputStream: 把内存中的一个缓冲区作为输入源, 从内存数组中读取数据字节.
ObjectInputStream: 对以前使用过 ObjectOuputStream 写入的基本数据和对象进行反序列化, 用于恢复那些以前序列化的对象, 注意这个对象所属的类必须实现 Serializable 接口.
PipeInputStream: 实现了管道的概念, 从线程通道中读取线程字节. 主要在线程中使用, 用于两个线程间通信.
SequenceInputStream: 表示其他输入流的逻辑串联. 它从输入流的有序集合开始, 并从第一个输入流开始读取, 直到到达文件末尾, 接着从第二个输入流读取, 依次类推, 直到到达包含的最后一个输入流的文件末尾为止.
System.in: 从用户控制台读取数据字节, 在 System 类中, in 是 InputStream 类的静态导入.
public static void main(String[] args) { InputStream in = null; OutputStream out = null; try { // 得到输入流 in = new FileInputStream("E:\test\a.txt"); // 得到输出流 File file = new File("E:\test\b.txt"); if (!file.exists()) { file.createNewFile(); } out = new FileOutputStream(file, true); int i;// 从输入流读取一定数量的字节, 返回 0 到 255 范围内的 int 型字节值 while ((i = in.read()) != -1) { out.write(i); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (in != null) { in.close(); } if (out != null) { out.close(); } } catch (IOException e) { e.printStackTrace(); } } }
三, 字符流
所有的字符流类都继承自 Reader 和 Writer 这两个抽象类, 其中 Reader 是用于读取字符流的抽象类, Writer 是用于写入字符流的抽象类.
Reader 和 Writer 要解决的最主要问题是国际化. 原先的 I/O 类库只支持 8 位的字节流, 因此不能很好的处理 16 位的 Unicode 字符. Unicode 是国际化的字符集, 这样增加了 Reader 和 Writer 之后, 就可以自动在本地字符集和 Unicode 国际化字符集之间进行转换.
FileReader: 与 FileInputStream 对应, 从文件系统中读取字符序列.
CharArrayReader: 与 ByteArrayInputStream 对应, 从字符数组中读取数据.
PipedReader: 与 PipedInputStream 对应, 从线程管道中读取字符序列.
StringReader: 从字符串中读取字符序列.
/** * 由于是字符, 存在编码不一致导致乱码的问题 * @param args */ public static void main(String[] args) { Reader reader = null; Writer writer = null; try { // 得到输入流 reader = new FileReader("E:\test\a.txt"); // 得到输出流 writer = new FileWriter("E:\test\c.txt", true); char[] chars = new char[50]; int i; while ((i = reader.read(chars)) != -1) { writer.write(chars, 0, i); writer.flush(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (reader != null) { reader.close(); } if (writer != null) { writer.close(); } } catch (IOException e) { e.printStackTrace(); } } }
四, 缓冲流
前面介绍的字节流, 字符流都是无缓冲的输入, 输出流, 这就意味着, 每一次的读, 写操作都会交给操作系统来处理. 这样的做法可能会对系统的性能造成很大的影响, 因为每一次操作都可能引起磁盘硬件的读, 写或网络的访问. 因此, 对于字节流和字符流, 一般不直接使用.
缓存流是一种装饰器类, 目的是让原字节流, 字符流 新增缓冲的功能. 以字符缓冲流为例进行说明, 字符缓冲流从字符流中读取, 写入字符, 不立刻要求系统进行处理, 而是缓冲部分字符, 从而实现按规定字符数, 按行等方式高效 ed 读取或写入.
字节缓冲流:
public static void main(String[] args) { BufferedInputStream in = null; BufferedOutputStream out = null; try { in = new BufferedInputStream(new FileInputStream("E:\test\a.txt")); out = new BufferedOutputStream(new FileOutputStream("E:\test\e.txt", true)); byte[] b = new byte[1024]; int i; while ((i = in.read(b)) != -1) { out.write(b, 0, i); out.flush();// 手动刷新该流的缓冲, 立即将他们写入预期目标 } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (in != null) { in.close(); } if (out != null) { out.close(); } } catch (IOException e) { e.printStackTrace(); } } }
小编推荐一个学 Java 的学习裙[ 七六零, 二五零, 五四一 ] , 无论你是大牛还是小白, 是想转行还是想入行都可以来了解一起进步一起学习! 裙内有开发工具, 很多干货和技术资料分享!
字符缓冲流:
public static void main(String[] args) { BufferedReader bufferedReader = null; BufferedWriter bufferedWriter = null; try { // 设置文件编码, 解决文件乱码问题 // 将字节流转换为字符流, 实际上使用了一种设计模式 -- 适配器模式 InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\test\a.txt"), "GBK"); bufferedReader = new BufferedReader(isr); bufferedWriter = new BufferedWriter(new FileWriter("E:\test\d.txt")); String s; while ((s = bufferedReader.readLine()) != null) { bufferedWriter.write(s); bufferedWriter.newLine();// 按行读取, 写入一个分行符, 否则所有内容都在一行显示 } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (bufferedReader != null) { bufferedReader.close(); } if (bufferedWriter != null) { bufferedWriter.close(); } } catch (IOException e) { e.printStackTrace(); } } }
来源: http://www.jianshu.com/p/dc7df1835a0a