当前位置:  编程技术>java/j2ee

基于Java回顾之I/O的使用详解

    来源: 互联网  发布时间:2014-10-24

    本文导语:    工作后,使用的技术随着项目的变化而变化,时而C#,时而Java,当然还有其他一些零碎的技术。总体而言,C#的使用时间要更长一些,其次是Java。我本身对语言没有什么倾向性,能干活的语言,就是好语言。而且从面向对...

  工作后,使用的技术随着项目的变化而变化,时而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读取文件

代码如下:

使用FileInputStream读取文件信息
 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();
 }

使用BufferedInputStream读取文件
代码如下:

 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复制文件
代码如下:

使用FileOutputStream复制文件
 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();
     }
 }

代码如下:

使用BufferedOutputStream复制文件
 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读取文件内容

代码如下:

使用BufferedReader读取文件内容
 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复制文件
代码如下:

使用BufferedWriter复制文件
 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();
     }
 }

复制文件夹
代码如下:

复制文件夹
 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

    
 
 

您可能感兴趣的文章:

  • java map(HashMap TreeMap)用法:初始化,遍历和排序详解
  • 哪位java同门师兄有《java2编程详解》电子文档,注意不是影印版
  • 请问哪儿有java2编程详解的电子书下载??本人急需!!跟贴有分!!!
  • 谁有JAVA的类库详解或下载地址?
  • 请问那里有《JAVA2编程详解》可以下载?
  • 《Java 2 编程详解》程序清单14.12中的一个问题。
  • 网络技术 iis7站长之家
  • 我非常想知道JAVA跟C/C++对于硬件控制的能力孰强孰弱.(菜鸟问题,要详解,在线等待)
  • Java中的随机数详解
  • 深入分析Java内存区域的使用详解
  • Java加载JDBC驱动程序实例详解
  • Java代码重构的几种模式详解
  • JAVA中list,set,数组之间的转换详解
  • Java中关于int和Integer的区别详解
  • java equals函数用法详解
  • Java I/O技术之文件操作详解
  • java this super使用方法详解
  • java全角、半角字符的关系以及转换详解
  • 深入JAVA对象深度克隆的详解
  • 深入Java不可变类型的详解
  • 浅谈java中静态方法的重写问题详解
  • 基于Java回顾之网络通信的应用分析
  • 基于Java回顾之多线程详解
  • 基于Java回顾之反射的使用分析
  • 基于Java回顾之集合的总结概述
  • 基于Java回顾之JDBC的使用详解
  • 基于Java回顾之多线程同步的使用详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 使用java jdk中的LinkedHashMap实现简单的LRU算法
  • MySocketServer.java 使用或覆盖一个不鼓励使用的API???
  • java将类序列化并存储到mysql(使用hibernate)
  • JAVA中不赞成使用(Deprecated)的方法是否可以使用
  • 各位使用过JAVA的朋友们!JAVA好用吗?它有向VC那样的集成开发环境吗?
  • java 可以使用 可是javac不可以使用。老兄帮帮忙
  • 哪位知道如何用JAVA进行图形文件的缩放? 是使用JAVA2D 或是有第三方的软件?
  • java堆栈类使用实例(java中stack的使用方法)
  • env查看环境变量,JAVA_HOME明明在里面,但使用nutch时还是提示JAVA_HOME not set?
  • 如何使用linux下的java编译器????
  • 如何使用java这个命令?
  • 为什么使用cat输出的文本文件是中文的,使用java从文件读取出来时显示的是乱码?
  • linux 远程上使用java
  • UNIX下使用java运行class的问题
  • java:sun公司的联机帮助如何使用?
  • 请教如何使用Java编写的Applet程序关闭浏览器??
  • 怎么使用 JAVA 的包呀???
  • 针对使用java进行硬件编程
  • 使用editplus编写java如何编译成字节码文件,如何解释
  • 谁能告诉我哪里能找到java包内部类及方法使用介绍
  • 使用java时间的调查,谢谢大家
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 我对JAVA一窍不通,可惜别人却给我一个Java的project,要我做一个安装程序,请问哪里有JAVA INSTALLER下载,而且我要不要安装java的sdk才能完成此项任务?




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3