Java回顾之I/O

来源:互联网 发布:php 互换数组里面的值 编辑:程序博客网 时间:2024/05/01 16:10

我计划在接下来的几篇文章中快速回顾一下Java,主要是一些基础的JDK相关的内容。

  工作后,使用的技术随着项目的变化而变化,时而C#,时而Java,当然还有其他一些零碎的技术。总体而言,C#的使用时间要更长一些,其次是Java。我本身对语言没有什么倾向性,能干活的语言,就是好语言。而且从面向对象的角度来看,我觉得C#和Java对我来说,没什么区别。

  这篇文章主要回顾Java中和I/O操作相关的内容,I/O也是编程语言的一个基础特性,Java中的I/O分为两种类型,一种是顺序读取,一种是随机读取。

  我们先来看顺序读取,有两种方式可以进行顺序读取,一种是InputStream/OutputStream,它是针对字节进行操作的输入输出流;另外一种是Reader/Writer,它是针对字符进行操作的输入输出流。

  下面我们画出InputStream的结构



  • FileInputStream:操作文件,经常和BufferedInputStream一起使用
  • PipedInputStream:可用于线程间通信
  • ObjectInputStream:可用于对象序列化
  • ByteArrayInputStream:用于处理字节数组的输入
  • LineNumberInputStream:可输出当前行数,并且可以在程序中进行修改

  下面是OutputStream的结构


  • PrintStream:提供了类似print和println的接口去输出数据

  下面我们来看如何使用Stream的方式来操作输入输出

  • 使用InputStream读取文件
public static byte[] readFileByFileInputStream(File file) throws IOException{    ByteArrayOutputStream output = new ByteArrayOutputStream();    FileInputStream fis = null;    try    {        fis = new FileInputStream(file);        byte[] buffer = new byte[1024];        int bytesRead = 0;        while((bytesRead = fis.read(buffer, 0, buffer.length)) != -1)        {            output.write(buffer, 0, bytesRead);        }    }    catch(Exception ex)    {        System.out.println("Error occurs during reading " + file.getAbsoluteFile());    }    finally    {        if (fis !=null) fis.close();        if (output !=null) output.close();    }    return output.toByteArray();}

public static byte[] readFileByBufferedInputStream(File file) throws Exception{    FileInputStream fis = null;    BufferedInputStream bis = null;    ByteArrayOutputStream output = new ByteArrayOutputStream();    try    {        fis = new FileInputStream(file);        bis = new BufferedInputStream(fis);        byte[] buffer = new byte[1024];        int bytesRead = 0;        while((bytesRead = bis.read(buffer, 0, buffer.length)) != -1)        {            output.write(buffer, 0, bytesRead);        }    }    catch(Exception ex)    {        System.out.println("Error occurs during reading " + file.getAbsoluteFile());    }    finally    {        if (fis != null) fis.close();        if (bis != null) bis.close();        if (output != null) output.close();    }    return output.toByteArray();}

  • 使用OutputStream复制文件
public static void copyFileByFileOutputStream(File file) throws IOException{    FileInputStream fis = null;    FileOutputStream fos = null;    try    {        fis = new FileInputStream(file);        fos = new FileOutputStream(file.getName() + ".bak");        byte[] buffer = new byte[1024];        int bytesRead = 0;        while((bytesRead = fis.read(buffer,0,buffer.length)) != -1)        {            fos.write(buffer, 0, bytesRead);        }        fos.flush();    }    catch(Exception ex)    {        System.out.println("Error occurs during copying " + file.getAbsoluteFile());    }    finally    {        if (fis != null) fis.close();        if (fos != null) fos.close();    }}

public static void copyFilebyBufferedOutputStream(File file)throws IOException{    FileInputStream fis = null;    BufferedInputStream bis = null;    FileOutputStream fos = null;    BufferedOutputStream bos = null;    try    {        fis = new FileInputStream(file);        bis = new BufferedInputStream(fis);        fos = new FileOutputStream(file.getName() + ".bak");        bos = new BufferedOutputStream(fos);        byte[] buffer = new byte[1024];        int bytesRead = 0;        while((bytesRead = bis.read(buffer, 0, buffer.length)) != -1)        {            bos.write(buffer, 0, bytesRead);        }        bos.flush();    }    catch(Exception ex)    {        System.out.println("Error occurs during copying " + file.getAbsoluteFile());    }    finally    {        if (fis != null) fis.close();        if (bis != null) bis.close();        if (fos != null) fos.close();        if (bos != null) bos.close();    }}

这里的代码对异常的处理非常不完整,稍后我们会给出完整严谨的代码。

   下面我们来看Reader的结构


  这里的Reader基本上和InputStream能够对应上。  

  Writer的结构如下


下面我们来看一些使用Reader或者Writer的例子

  • 使用Reader读取文件内容
public static String readFile(String file)throws IOException{    BufferedReader br = null;    StringBuffer sb = new StringBuffer();    try    {        br = new BufferedReader(new FileReader(file));        String line = null;                while((line = br.readLine()) != null)        {            sb.append(line);        }    }    catch(Exception ex)    {        System.out.println("Error occurs during reading " + file);    }    finally    {        if (br != null) br.close();    }    return sb.toString();}

  • 使用Writer复制文件
public static void copyFile(String file) throws IOException{     BufferedReader br = null;    BufferedWriter bw = null;    try    {        br = new BufferedReader(new FileReader(file));        bw = new BufferedWriter(new FileWriter(file + ".bak"));        String line = null;        while((line = br.readLine())!= null)        {            bw.write(line);        }    }    catch(Exception ex)    {        System.out.println("Error occurs during copying " + file);    }    finally    {        if (br != null) br.close();        if (bw != null) bw.close();    }}

下面我们来看如何对文件进行随机访问,Java中主要使用RandomAccessFile来对文件进行随机操作。

  • 创建一个大小固定的文件
public static void createFile(String file, int size) throws IOException{    File temp = new File(file);    RandomAccessFile raf = new RandomAccessFile(temp, "rw");    raf.setLength(size);    raf.close();}

  • 向文件中随机写入数据
public static void writeFile(String file, byte[] content, int startPos, int contentLength) throws IOException{    RandomAccessFile raf = new RandomAccessFile(new File(file), "rw");    raf.seek(startPos);    raf.write(content, 0, contentLength);    raf.close();}

接下里,我们来看一些其他的常用操作

  • 移动文件
public static boolean moveFile(String sourceFile, String destFile){    File source = new File(sourceFile);    if (!source.exists()) throw new RuntimeException("source file does not exist.");    File dest = new File(destFile);    if (!(new File(dest.getPath()).exists())) new File(dest.getParent()).mkdirs();    return source.renameTo(dest);}

  • 复制文件
public static void copyFile(String sourceFile, String destFile) throws IOException{    File source = new File(sourceFile);    if (!source.exists()) throw new RuntimeException("File does not exist.");    if (!source.isFile()) throw new RuntimeException("It is not file.");    if (!source.canRead()) throw new RuntimeException("File cound not be read.");    File dest = new File(destFile);    if (dest.exists())    {        if (dest.isDirectory()) throw new RuntimeException("Destination is a folder.");        else        {            dest.delete();        }    }    else    {        File parentFolder = new File(dest.getParent());        if (!parentFolder.exists()) parentFolder.mkdirs();        if (!parentFolder.canWrite()) throw new RuntimeException("Destination can not be written.");    }    FileInputStream fis = null;    FileOutputStream fos = null;    try    {        fis = new FileInputStream(source);        fos = new FileOutputStream(dest);        byte[] buffer = new byte[1024];        int bytesRead = 0;        while((bytesRead = fis.read(buffer, 0, buffer.length)) != -1)        {            fos.write(buffer, 0, bytesRead);        }        fos.flush();    }    catch(IOException ex)    {        System.out.println("Error occurs during copying " + sourceFile);    }    finally    {        if (fis != null) fis.close();        if (fos != null) fos.close();    }}

  • 复制文件夹
<pre name="code" class="html" style="background-color: rgb(255, 255, 255);">public static void copyDir(String sourceDir, String destDir) throws IOException{        File source = new File(sourceDir);    if (!source.exists()) throw new RuntimeException("Source does not exist.");    if (!source.canRead()) throw new RuntimeException("Source could not be read.");    File dest = new File(destDir);    if (!dest.exists()) dest.mkdirs();        File[] arrFiles = source.listFiles();    for(int i = 0; i < arrFiles.length; i++)    {        if (arrFiles[i].isFile())        {            BufferedReader reader = new BufferedReader(new FileReader(arrFiles[i]));            BufferedWriter writer = new BufferedWriter(new FileWriter(destDir + "/" + arrFiles[i].getName()));            String line = null;            while((line = reader.readLine()) != null) writer.write(line);            writer.flush();            reader.close();            writer.close();        }        else        {            copyDir(sourceDir + "/" + arrFiles[i].getName(), destDir + "/" + arrFiles[i].getName());        }    }}

  • 删除文件夹
删除文件夹public static void del(String filePath){    File file = new File(filePath);    if (file == null || !file.exists()) return;    if (file.isFile())    {        file.delete();    }    else    {        File[] arrFiles = file.listFiles();        if (arrFiles.length > 0)        {            for(int i = 0; i < arrFiles.length; i++)            {                del(arrFiles[i].getAbsolutePath());            }        }        file.delete();    }}

  • 获取文件夹大小
public static long getFolderSize(String dir){    long size = 0;    File file = new File(dir);    if (!file.exists()) throw new RuntimeException("dir does not exist.");    if (file.isFile()) return file.length();    else    {        String[] arrFileName = file.list();        for (int i = 0; i < arrFileName.length; i++)        {            size += getFolderSize(dir + "/" + arrFileName[i]);        }    }        return size;}

  • 将大文件切分为多个小文件
public static void splitFile(String filePath, long unit) throws IOException{    File file = new File(filePath);    if (!file.exists()) throw new RuntimeException("file does not exist.");    long size = file.length();    if (unit >= size) return;    int count = size % unit == 0 ? (int)(size/unit) : (int)(size/unit) + 1;    String newFile = null;    FileOutputStream fos = null;    FileInputStream fis =null;    byte[] buffer = new byte[(int)unit];    fis = new FileInputStream(file);    long startPos = 0;    String countFile = filePath + "_Count";    PrintWriter writer = new PrintWriter(new FileWriter( new File(countFile)));    writer.println(filePath + "\t" + size);    for (int i = 1; i <= count; i++)    {        newFile = filePath + "_" + i;        startPos = (i - 1) * unit;        System.out.println("Creating " + newFile);        fos = new FileOutputStream(new File(newFile));        int bytesRead = fis.read(buffer, 0, buffer.length);        if (bytesRead != -1)        {            fos.write(buffer, 0, bytesRead);            writer.println(newFile + "\t" + startPos + "\t" + bytesRead);        }        fos.flush();        fos.close();        System.out.println("StartPos:" + i*unit + "; EndPos:" + (i*unit + bytesRead));    }    writer.flush();    writer.close();    fis.close();}

  • 将多个小文件合并为一个大文件
public static void linkFiles(String countFile) throws IOException{    File file = new File(countFile);    if (!file.exists()) throw new RuntimeException("Count file does not exist.");    BufferedReader reader = new BufferedReader(new FileReader(file));    String line = reader.readLine();    String newFile = line.split("\t")[0];    long size = Long.parseLong(line.split("\t")[1]);    RandomAccessFile raf = new RandomAccessFile(newFile, "rw");    raf.setLength(size);    FileInputStream fis = null;    byte[] buffer = null;        while((line = reader.readLine()) != null)    {        String[] arrInfo = line.split("\t");        fis = new FileInputStream(new File(arrInfo[0]));        buffer = new byte[Integer.parseInt(arrInfo[2])];        long startPos = Long.parseLong(arrInfo[1]);        fis.read(buffer, 0, Integer.parseInt(arrInfo[2]));        raf.seek(startPos);        raf.write(buffer, 0, Integer.parseInt(arrInfo[2]));        fis.close();    }    raf.close();}

  • 执行外部命令
public static void execExternalCommand(String command, String argument){    Process process = null;    try    {        process = Runtime.getRuntime().exec(command + " " + argument);        InputStream is = process.getInputStream();        BufferedReader br = new BufferedReader(new InputStreamReader(is));        String line = null;        while((line = br.readLine()) != null)        {            System.out.println(line);        }    }    catch(Exception ex)    {        System.err.println(ex.getMessage());    }    finally    {        if (process != null) process.destroy();    }}

作者:李胜攀
    
出处:http://wing011203.cnblogs.com/
    
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


0 0
原创粉丝点击