输出:
[ resource/StudyFile/access resource/StudyFile/HuaYi.txt resource/StudyFile/HongXing.txt resource/StudyFile/Cinema resource/StudyFile/UME.txt ] 13:59:20[testFileTool]: file.length(): 4096 13:59:20[testFileTool]: file.getName(): StudyFile 13:59:20[testFileTool]: file.getParent(): resource 13:59:20[testFileTool]: file.canRead(): true 13:59:20[testFileTool]: file.canWrite(): true 13:59:20[testFileTool]: file.lastModified(): 2017-11-30 13:55:00:000一个用于操作数组或列表的实用打印输出类,其实这种写法我们自己也会经常在业务代码中写出。
package javaS.IO; import java.util.Arrays; import java.util.Collection; public class PPrint { public static String pFormat(Collection<?> c) {// 泛型方法 if (c.size() == 0) return "[]"; StringBuilder result = new StringBuilder("["); for (Object elem : c) { if (c.size() != 1) { result.append("\n"); } result.append(elem); } if (c.size() != 1) { result.append("\n"); } result.append("]"); return result.toString(); } /** * 打印一个可视化的集合 * * @param c */ public static void pprint(Collection<?> c) { System.out.println(pFormat(c)); } /** * 打印一个可视化的数组 * * @param c */ public static void pprint(Object[] c) { System.out.println(pFormat(Arrays.asList(c))); } } 2.文件流文件流包括输入输出字符字节四种类,首先来看文件字节流处理。
package javaS.IO; +import java.io.BufferedOutputStream; /** * 字节流的学习 * * 基于字节I/O操作的基类:InputStream和OutputStream * * 对应的缓存类:BufferedInputStream和BufferedOutputStream * * 出入的主语是“内存”,出内存就是写入文件,入内存就是读取文件 * * @author Evsward * */ public class ByteStreamS extends IOBaseS { @Test /** * 使用输出流OutputStream.write,将内存中的内容写入设备文件(这里的设备文件为File:磁盘文件) */ public void testWrite2OutputStream() throws IOException { OutputStream fos = new FileOutputStream(root+"/UME.txt");//找不到该文件会自动创建(包括路径) /** * 内容中的字符串内容content */ String content = "哈哈哈\n嘿嘿"; fos.write(content.getBytes());// 直接写入字节 fos.close();// 操作完注意将流关闭 /** * 文件后面追加内容,构造函数加第二个参数true */ OutputStream fosadd = new FileOutputStream(root+"/UME.txt", true); fosadd.write(" 你好".getBytes()); fosadd.close(); } @Test /** * 使用输入流读取InputStream.read,将设备文件(这里的磁盘文件是File)读到内存buffer中去。 */ public void testRead2InputStream() throws IOException { int bufferSize = 200; FileInputStream fis = new FileInputStream(root+"/UME.txt"); byte buffer[] = new byte[bufferSize]; int length; while ((length = fis.read(buffer, 0, bufferSize)) > -1) { String str = new String(buffer, 0, length); logger.info(str); } fis.close();// 操作完注意将流关闭 /** * 输出: * 13:41:02[testInputStreamS]: 举杯邀明月床前明月光 */ } }Buffered 缓冲区的作用
可以将数据流从数据源中处理完毕都存入内存缓冲区,然后统一一次性与底层IO进行操作,可以有效降低程序直接操作IO的频率,提高io执行速度。以下为缓冲区处理流的使用。
/** * 缓冲区处理流:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter, * 一次性写入,降低占用IO的频率 * 避免每次和硬盘打交道,提高数据访问的效率。 */ @Test public void testWrite2BufferedOutputStream() throws IOException { // OutputStream为基类 OutputStream fosaddOnce = new FileOutputStream(root+"/UME.txt"); OutputStream bs = new BufferedOutputStream(fosaddOnce); bs.write("举杯邀明月".getBytes()); bs.flush();// 每次flush会将内存中数据一齐刷入到外部文件中,但不会close该流。 bs.write("床前明月光".getBytes()); /** * close方法除了有关闭流的作用,在其关闭流之前也会执行一次flush。 * 注意一定要先关闭BufferedOutputStream,再关闭FileOutputStream,从外到内打开,要从内到外关闭。 */ bs.close(); fosaddOnce.close();// 两个流都要关闭 }使用构造函数套接的方式优化代码
我们很少使用单一的类来创建流对象,而是通过叠合多个对象来提供所期望的功能。(这就是装饰器模式)
public void testWrite2BufferedOutputStream() throws IOException { OutputStream bs = new BufferedOutputStream(new FileOutputStream(root+"/UME.txt")); bs.write("举杯邀明月".getBytes()); bs.close();//只关闭一次即可。 }