Java I/O系统
目录、文件管理使用File类,可进行文件(夹)的创建、删除、目录跳转、文件查询等操作。
Inputstream,OutputStream是Java I/O的基础,所以输入输出相关的类都应该继承自它们。Reader和Writer是后加入的用于兼容Unicode与面向字符的I/O功能。任何自Inputstream或Reader派生而来的类都含有read()基本方法,用于读取单个字节或者字节数组;任何自OutputStream或Writer派生而来的类都有write()方法,用于写单个字节或字节数组。所有的Inputstream,OutputStream都有相应的Reader,Writer来提供天然的Unicode操作。
一、文件读写
1、从文件读取字符
//从文件读取字符 BufferedReader reader; try { reader = new BufferedReader(new FileReader("path")); String line; while ((line = reader.readLine()) != null){ System.out.println(line); } } catch (IOException e) { e.printStackTrace(); }finally { //注意一定要关闭流,避免内存泄漏 if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } }
2、写入文件
//写入文件 PrintWriter writer; try { writer = new PrintWriter("filepath"); writer.println("content ..."); } catch (IOException e) { e.printStackTrace(); }finally { //注意关闭流,以免造成内存泄漏 if (writer != null) writer.close(); }
3、RandomAccessFile ,使用seek()来跳转到指定位置后进行读写操作,使用RandomAccessFile 需要对文件的排版很清楚。
RandomAccessFile rf = new RandomAccessFile("filepath", "rw");//r只读,rw读写
rf.seek(5 * 8);//定位到第五个字符位置
rf.write("contents".getBytes());
二、标准输入输出
1、读写
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String line = null; while (true) { try { if (!((line = reader.readLine()) != null && line.length() != 0)) break; } catch (IOException e) { e.printStackTrace(); } System.out.println(line); }
2、标准输入、出重定向
方便我们将内容存储到文件,以备后查
System.setIn(InputStream);
System.setOut(PrintStream);
System.setErr(PrintStream);
三、多线程文件加锁
FileOutputStream fos = new FileOutputStream("filepath"); FileLock fileLock = fos.getChannel().tryLock();//非阻塞,如果文件已被其他线程locked且不能共享则返回false,否则则添加锁并返回true FileLock fileLock2 = fos.getChannel().lock();//阻塞,阻塞进程直至可以获取锁; fileLock.release();//释放锁 fileLock.isShared();//查询是否是共享锁
四、压缩、解压GZIP, Zip文件
//1、gzip适用于单个数据流(而不是一系列互异数据) //压缩GZIP BufferedOutputStream gout = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream("file.gz"))); gout.write("content".getBytes()); //解压GZIP数据 BufferedReader greader = new BufferedReader(new InputStreamReader( new GZIPInputStream(new FileInputStream("filepath")) )); greader.readLine(); //2、zip可添加多个参数 // zip压缩 ZipOutputStream zout = new ZipOutputStream(new CheckedOutputStream( new FileOutputStream("filepath"), new Adler32()));// 计算校验方法:Adler32快一些,CRC32慢一些但更准确 zout.setComment("注释说明"); zout.write("content".getBytes()); //zip解压数据 ZipInputStream zin = new ZipInputStream(new CheckedInputStream(new FileInputStream("filename"), new Adler32())); BufferedInputStream zins = new BufferedInputStream(zin); ZipEntry zipEntry; while ((zipEntry = zin.getNextEntry()) != null){ int x ; while ((x = zins.read()) != -1) System.out.println(x); } //zip解压数据方式二 ZipFile zfile = new ZipFile("filepath"); Enumeration<? extends ZipEntry> zentries = zfile.entries(); while (zentries.hasMoreElements()){ ZipEntry ze = zentries.nextElement(); }
注意:所有的流用完都要记得手动关闭!
参考:I/O系统主要的类
ByteArrayInputStream 允许将内存缓冲区当作InputStream使用,与FilterInputStream一起使用;
StringBufferInputStream 将String转换成InputStream(已弃用);
FileInputStream 从文件中读取信息,与FilterInputStream一起使用;
PipedInputStream 产生用于写入PipedOutputStream数据,实现“管道化”;
SequenceInputStream 将两个或多个InputStream对象转换成一个,与FilterInputStream一起使用;
FilterInputStream 抽象类,子类如下:
DataInputStream 读取基本类型及String对象;
BufferedInputStream
LineNumberInputStream 弃用;
PushbackInputStream
ByteArrayInputStream 在内存中创建缓存区,所以送往流的数据都存储在这里;
FileOutputStream 将信息写到文件里;
PipedOutputStream 写入管道;
FileOutputStream 抽象类,子类如下:
DataOutputStream
PrintStream
BufferedOutputStream