终于有时间整理了一下Java IO的相关类的情况。
Java的IO操作分为字符流与字节流的操作,针对文本文件最好使用字符流。如果不知道文件类型,那就用字节流吧。
下面看看常用IO的相关类的情况
字节流: java.io.InputStream: javax.sound.sampled.AudioInputStream Java.io.ByteArrayInputStream Java.io.FileInputStream Java.io.FilterInputStream java.io.BufferedInputStream java.util.zip.CheckedInputStream javax.crypto.CipherInputStream java.io.DataInputStream java.util.zip.DeflaterInputStream java.security.DigestInputStream java.util.zip.InflaterInputStream java.io.LineNumberInputStream java.swing.ProgressMonitorInputStream java.io.PushbackInputStream org.omg.CORBA.portable.InputStream Java.io.ObjectInputStream Java.io.PipedInputStream Java.io.SequenceInputStream Java.io.StringBufferInputStream java.io.OutputStream: Java.io.ByteArrayOutputStream Java.io.FileOutputStream Java.io.FilterOutputStream Java.io.BufferedOutputStream, java.util.zip.CheckedOutputStream, javax.crypto.CipherOutputStream, java.io.DataOutputStream, java.util.zip.DeflaterOutputStream, java.security.DigestOutputStream, java.util.zip.InflaterOutputStream, java.io.PrintStream Java.io.ObjectOutputStream org.omg.CORBA.portable.OutputStream Java.io.PipedOutputStream
字符流:
java.io.Reader Java.io.BufferedReader Java.io.LineNumberReader Java.io.CharArrayReader Java.io.FilterReader Java.io.PushbackReader Java.io.InputStreamReader Java.io. FileReader Java.io.PipedReader Java.io.StringReader java.io.Writer Java.io.BufferedWriter Java.io.CharArrayWriter Java.io.FilterWriter(抽象类,目前还没有子类) Java.io.OutputStreamWriter Java.io.FileWriter Java.io.PipedWriter Java.io.PrintWriter Java.io.StringWriter
网上找了一张图片,能够很好的展示:
上面就是整理的相关类,可能不是很完善,下面看看几个常用类的使用
1、首先看看对文件类File的使用
package org.bond.basic; import java.io.*; /** * 文件类File的一些操作 * * @author Administrator * */ public class FileView { public static void main(String[] args) { FileView io = new FileView(); io.printFileTree(); } /** * 显示所有文件信息 */ public void printFileTree() { // 获取根目录 File[] files = File.listRoots(); for (File item : files) { if (item.isAbsolute()) {// 绝对根目录 printFileTree(item); } else if (item.isDirectory()) {// 普通目录 printFileTree(item); } else if (item.isFile()) {// 文件 System.out.println(item.getAbsolutePath()); } else if (item.isHidden()) {// 隐藏的目录或文件 // } } } /** * 递归显示文件信息 * * @param dir * 文件 */ public void printFileTree(File dir) { File[] files = dir.listFiles(); if (files != null && files.length > 0) { for (File item : files) { if (item.isFile()) { System.out.println(item.getName()); } else { printFileTree(item); } } } } }
package org.bond.basic; import java.io.*; /** * 字符流的一些操作 * * @author Administrator * */ public class CharStreamView { /** * @param args */ public static void main(String[] args) { CharStreamView view = new CharStreamView(); view.test1(); view.test2(); } /** * FileWriter与FileReader的使用 */ public void test1() { try { File file = new File("C:\\test1.txt"); FileWriter writer = new FileWriter(file); writer.write("第二代Surface的确平庸 但却是未来发展趋势"); writer.append("第二代Surface虽然毫无惊艳,但带来的却是务实修改风,丰富组件使得Surface应用和用户体验得以提升,而这必是未来设备发展趋势,因为:1.设备融合趋势。2.一个设备需求。3.微软的优势能替代iPad。4.生活不只是娱乐。"); writer.append("早上工作时才知道第二代Surface于昨晚发布了,简单看完了这一代Surface的相关文字图片和视频介绍后,头脑中对它也已有了初步的评价——简单的配置升级。"); writer.flush(); writer.close(); FileReader reader = new FileReader(file); char[] chars = new char[1024]; while (reader.read(chars) > 0) { System.out.print(String.valueOf(chars)); } reader.close(); System.out.println(); System.out.println("test1操作完成!"); } catch (IOException e) { e.printStackTrace(); } } /** * BufferedWriter与BufferedReader的使用 */ public void test2() { try { File file = new File("C:\\test2.txt"); BufferedWriter writer = new BufferedWriter(new FileWriter(file)); writer.write("负责Surface业务的副总裁Panos Panay表示,他们的目标不是重新发明轮子,而是要大力改进它。从这句话也可以看得出,这一代Surface不会给人们带来任何惊艳,取而代之的是务实的修改风,比如克服续航短板,带来更高的移动工作能力等"); writer.newLine(); writer.append("不是重新发明轮子,而是大力改进它,也确如这句话一样,微软除了升级Surface配置之外"); writer.newLine(); writer.append(""); writer.newLine(); writer.append("娱乐潮之后,类Surface平板将是未来发展趋势"); writer.flush(); writer.close(); BufferedReader reader = new BufferedReader(new FileReader(file)); String str = ""; while ((str = reader.readLine()) != null) { System.out.println(str); } reader.close(); System.out.println("test2操作完成!"); } catch (IOException e) { e.printStackTrace(); } } }
package org.bond.basic; import java.io.*; public class ByteStreamView { public static void main(String[] args) { ByteStreamView view = new ByteStreamView(); view.test1(); view.test2(); view.test3(); } public void test1() { try { File file = new File("C:\\test1.txt"); FileOutputStream output = new FileOutputStream(file); String text = "在发布会上,微软一直强调Surface平板带来的性能提升和广泛的应用场景,这使得人们除了娱乐之."; byte[] b = text.getBytes("UTF-8"); output.write(b); output.flush(); output.close(); FileInputStream input = new FileInputStream(file); b = new byte[1024]; while (input.read(b) > 0) { System.out.print(new String(b, "UTF-8")); } input.close(); System.out.println(); System.out.println("test1操作完成!"); } catch (Exception e) { e.printStackTrace(); } } public void test2() { try { File file = new File("C:\\test2.txt"); BufferedOutputStream output = new BufferedOutputStream( new FileOutputStream(file)); String text = "这些设备的融合先决条件就是出现一个设备能将这些设备的形态和功能这两者囊括在一个中,"; byte[] b = text.getBytes("UTF-8"); output.write(b); output.flush(); output.close(); BufferedInputStream input = new BufferedInputStream( new FileInputStream(file)); b = new byte[1024]; while (input.read(b) > 0) { System.out.print(new String(b, "UTF-8")); } input.close(); System.out.println(); System.out.println("test2操作完成!"); } catch (Exception e) { e.printStackTrace(); } } public void test3() { try { File file = new File("C:\\test3.txt"); DataOutputStream output = new DataOutputStream( new FileOutputStream(file)); output.writeUTF("结束语:生活除了娱乐之外,还有更重要的事情要做"); output.flush(); output.close(); DataInputStream input = new DataInputStream(new FileInputStream( file)); System.out.println(input.readUTF()); input.close(); System.out.println("test3操作完成!"); } catch (Exception e) { e.printStackTrace(); } } }
4、针对一些视频等大文件的复制操作,需要采用循环读取的方式
package org.bond.basic; import java.io.*; /** * 针对大的文件,采用字节流,拆分几次操作 * * @author Administrator * */ public class BigFileView { // 每次循环读取的文件大小 private final int MAX_BYTE = 1024 * 1024; public static void main(String[] args) { BigFileView view = new BigFileView(); view.test1(); } public void test1() { try { // 将infile.avi 复制到 outfile.avi File inFile = new File("C:\\infile.avi"); File outFile = new File("C:\\outfile.avi"); FileInputStream inStream = new FileInputStream(inFile); FileOutputStream outStream = new FileOutputStream(outFile); // 源文件总字节数 int total = inStream.available(); byte[] b = new byte[MAX_BYTE]; // 循环读取数据 for (int i = 0; i < total / MAX_BYTE; i++) { inStream.read(b, 0, MAX_BYTE); outStream.write(b); outStream.flush(); } // 不能整除,有剩余数据 if (total % MAX_BYTE > 0) { int level = total % MAX_BYTE; b = new byte[level]; inStream.read(b, 0, level); outStream.write(b); outStream.flush(); } // 关闭流 inStream.close(); outStream.close(); System.out.println("test1操作完成!"); } catch (Exception e) { e.printStackTrace(); } } }