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

2016-02-19 09:48 5 1 收藏

下面是个超简单的基于Java回顾之I/O的使用详解教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~

【 tulaoshi.com - 编程语言 】

  工作后,使用的技术随着项目的变化而变化,时而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:可输出当前行数,并且可以在程序中进行修改

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  下面是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的例子

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

    使用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 = 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();
     }
 }

来源:https://www.tulaoshi.com/n/20160219/1592233.html

延伸阅读
项目结构: 运行效果: ======================================================================== 下面是代码部分: ======================================================================== /tray/src/com/b510/tray托盘/DesktopCapture.java 代码如下: package com.b510.tray托盘;  import java.awt.event.Ac...
在Java 5.0之前启动一个任务是通过调用Thread类的start()方法来实现的,任务的提于交和执行是同时进行的,如果你想对任务的执行进行调度或是控制 同时执行的线程数量就需要额外编写代码来完成。5.0里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行,并且可以建立一个类似数据库连接 池的线程池来执行任务。这个架构主要有三个接...
细心的读者会发现,C++Builder不再支持如inportb()、outportb()一类I/O端口读写指令了。准确地说,在Windows环境下,BorlandC++仅支持16位应用程序的端口操作,对32位应用程序的端口操作不再支持,而C++Builder开发出来的程序是32位的。我个人以为,这是C++Builder设计者的败笔。因为PC机中,I/O地址空间与内存地址空间从来都是各自独立的。...
2006年3月份,netbeans.org发布了Mobility Pack 5.0 for CDC,这样使用Netbeans的开发者可以很轻易地开发基于CDC的Java ME应用程序了,唯一要做的就是安装Mobility Pack 5.0 for CDC插件。本文介绍如何搭建CDC的开发环境,编写一个简单的入门程序。相比基于CLDC的Java ME开发,CDC的相关技术方兴未艾,还有待我们去挖掘和探索。 目前...
在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子...

经验教程

559

收藏

52
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部