IO流详解

来源:互联网 发布:日本男装品牌 知乎 编辑:程序博客网 时间:2024/06/06 14:12

一.InputStream和OutputStream,Reader和Writer

    InputStream类是字节输入流的抽象类,是所有字节输入流的父类。

    部分方法;read(),read(byte[] b),mark(int readlimit),reset(),skip(long n),markSupport(),close();

    OutputStream类是字节输出流的抽象类,是所有字节输出流的父类

部分方法:write(int b),write(byte[] b),write(byte[] b,int off,int len),flush();close();

Reader是字符输入流的抽象类,是所有字符输入流的父类

Writer是字符输出流的抽象类,是所有字符输出流的父类

二.File类

File类是java.io包中唯一代表磁盘文件本身的对象。File类定义了一些与平台无关的方法来操作文件,同时可以通过File类来获取文件本身的信息。文件可以是一个路径。

构造方法省略;

获取文件信息的办法:getname();canread&canwrite();isfile&isdirectory&ishidden();getabsolutepaht&getparent();

<span style="font-family:SimSun;font-size:18px;">import java.io.*;public class FileTest { // 创建类public static void main(String[] args) {File file = new File("word.txt"); // 创建文件对象if (file.exists()) { // 如果文件存在String name = file.getName(); // 获取文件名称long length = file.length(); // 获取文件长度boolean hidden = file.isHidden(); // 判断文件是否是隐藏文件System.out.println("文件名称:" + name); // 输出信息System.out.println("文件长度是:" + length);System.out.println("该文件是隐藏文件吗?" + hidden);} else { // 如果文件不存在System.out.println("该文件不存在"); // 输出信息}}}</span>

三.文件输入输出流

1.FileInputStream和FileOutputStream提供简单的文件操作,仅提供简单的文件输入输出,可以通过文件路径或者File创建。

2.FileReader和FileWriter一般用于有汉字存在的情况下(双字节)。只要不关闭流,可一通过不断调用read()提取文件内容。

<span style="font-family:SimSun;font-size:18px;">import java.io.*;public class FileTest { // 创建类public static void main(String[] args) { // 主方法File file = new File("word.txt"); // 创建文件对象try { // 捕捉异常// 创建FileOutputStream对象FileOutputStream out = new FileOutputStream(file);// 创建byte型数组byte buy[] = "我有一只小毛驴,我从来也不骑。".getBytes();out.write(buy); // 将数组中信息写入到文件中out.close(); // 将流关闭} catch (Exception e) { // catch语句处理异常信息e.printStackTrace(); // 输出异常信息}try {// 创建FileInputStream类对象FileInputStream in = new FileInputStream(file);byte byt[] = new byte[1024]; // 创建byte数组int len = in.read(byt); // 从文件中读取信息// 将文件中信息输出System.out.println("文件中的信息是:" + new String(byt, 0, len));in.close(); // 关闭流} catch (Exception e) {e.printStackTrace(); // 输出异常信息}}}</span>


四.带缓存的输入输出流

缓存是对文件操作的优化,缓存流提供了定位操作。

1.BufferedInputStream和BufferedOutputStream,可以通过输入输出流为参数来创建,默认32字节的缓冲区,也可以自己定义。

2.BufferedReader和BufferedWriter,可以通过文件类为参数来哦创建(注意字符流可以读取一行)。

<span style="font-family:SimSun;font-size:18px;">import java.io.*;public class Student { // 创建类public static void main(String args[]) { // 主方法// 定义字符串数组String content[] = { "好久不见", "最近好吗", "常联系" };File file = new File("word.txt"); // 创建文件对象try {FileWriter fw = new FileWriter(file); // 创建FileWriter类对象// 创建BufferedWriter类对象BufferedWriter bufw = new BufferedWriter(fw); for (int k = 0; k < content.length; k++) { // 循环遍历数组bufw.write(content[k]); // 将字符串数组中元素写入到磁盘文件中bufw.newLine(); // 将数组中的单个元素以单行的形式写入文件}bufw.close(); // 将BufferedWriter流关闭fw.close(); // 将FileWriter流关闭} catch (Exception e) { // 处理异常e.printStackTrace();}try {FileReader fr = new FileReader(file); // 创建FileReader类对象// 创建BufferedReader类对象BufferedReader bufr = new BufferedReader(fr);String s = null; // 创建字符串对象int i = 0; // 声明int型变量// 如果文件的文本行数不为null,则进入循环while ((s = bufr.readLine()) != null) { i++; // 将变量做自增运算System.out.println("第" + i + "行:" + s); // 输出文件数据}bufr.close(); // 将FileReader流关闭fr.close(); // 将FileReader流关闭} catch (Exception e) { // 处理异常e.printStackTrace();}}}</span>

五.输出输入输出流

DateInputSream和DateOutStream允许应用程序用与机器无关的方式从底层输入流中读取基本Java数据类型。

以输入流和输出流为参数创建

三种写入方法:writeBytes(String s),writeChars(String s),writeUTF(String s).

补充:UTP编码对于字符串的操作很方便,可以通过readUT获得UTP方式写入的字符串,否则将不知道字符串的开始结束。

<span style="font-family:SimSun;font-size:18px;">import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;public class DataStreamTest {public static void main(String[] args) {try{//创建Fileoutputstream对象FileOutputStream fs=new FileOutputStream("word.txt");//创建DataOutputStream对象DataOutputStream ds=new DataOutputStream(fs);ds.writeUTF("使用writeUTF写入数据");  //写入磁盘文件数据ds.writeChars("使用writechar写入数据");ds.writeBytes("使用writeBytes写入数据");ds.close();//创建文件输入对象FileInputStream fis = new FileInputStream("word.txt");//创建数据输入对象DataInputStream dis = new DataInputStream(fis);System.out.print(dis.readUTF());dis.close();}catch(Exception e){e.printStackTrace();}}}</span>

六.ZIP压缩输入输出流

ZIP操作时要求使用ZipEntry对象作为进入点

<span style="font-family:SimSun;font-size:18px;">import java.io.*;import java.util.zip.*;public class MyZip { // 创建类private void zip(String zipFileName, File inputFile) throws Exception {ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName)); // 创建ZipOutputStream类对象zip(out, inputFile, ""); // 调用方法System.out.println("压缩中…"); // 输出信息out.close(); // 将流关闭}private void zip(ZipOutputStream out, File f, String base)throws Exception { // 方法重载if (f.isDirectory()) { // 测试此抽象路径名表示的文件是否是一个目录File[] fl = f.listFiles(); // 获取路径数组out.putNextEntry(new ZipEntry(base + "/")); // 写入此目录的entrybase = base.length() == 0 ? "" : base + "/"; // 判断参数是否为空for (int i = 0; i < fl.length; i++) { // 循环遍历数组中文件zip(out, fl[i], base + fl[i]);}} else {out.putNextEntry(new ZipEntry(base)); // 创建新的进入点// 创建FileInputStream对象FileInputStream in = new FileInputStream(f);int b; // 定义int型变量System.out.println(base);while ((b = in.read()) != -1) { // 如果没有到达流的尾部out.write(b); // 将字节写入当前ZIP条目}in.close(); // 关闭流}}public static void main(String[] temp) { // 主方法MyZip book = new MyZip(); // 创建本例对象try {// 调用方法,参数为压缩后文件与要压缩文件book.zip("hello.zip", new File("src"));System.out.println("压缩完成"); // 输出信息} catch (Exception ex) {ex.printStackTrace();}}}</span>

<span style="font-family:SimSun;font-size:18px;">import java.io.*;import java.util.zip.*;public class Decompressing { // 创建文件public static void main(String[] temp) {ZipInputStream zin; // 创建ZipInputStream对象try { // try语句捕获可能发生的异常zin = new ZipInputStream(new FileInputStream("hello.zip"));// 实例化对象,指明要进行解压的文件ZipEntry entry = zin.getNextEntry(); // 获取下一个ZipEntrywhile (((entry = zin.getNextEntry()) != null)&& !entry.isDirectory()) {// 如果entry不为空,并不在同一目录下File file = new File("d:\\" + entry.getName()); // 获取文件目录System.out.println(file);if (!file.exists()) { // 如果该文件不存在file.mkdirs();// 创建文件所在文件夹file.createNewFile(); // 创建文件}zin.closeEntry(); // 关闭当前entrySystem.out.println(entry.getName() + "解压成功");}zin.close(); // 关闭流} catch (Exception e) {e.printStackTrace();}}}</span>

0 0
原创粉丝点击