源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2022-06-08 12:22 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:基于Java回顾之I/O的使用详解
  工作后,使用的技术随着项目的变化而变化,时而C#,时而Java,当然还有其他一些零碎的技术。总体而言,C#的使用时间要更长一些,其次是Java。我本身对语言没有什么倾向性,能干活的语言,就是好语言。而且从面向对象的角度来看,我觉得C#和Java对我来说,没什么区别。   这篇文章主要回顾Java中和I/O操作相关的内容,I/O也是编程语言的一个基础特性,Java中的I/O分为两种类型,一种是顺序读取,一种是随机读取。   我们先来看顺序读取,有两种方式可以进行顺序读取,一种是InputStream/OutputStream,它是针对字节进行操作的输入输出流;另外一种是Reader/Writer,它是针对字符进行操作的输入输出流。   [b]下面我们画出InputStream的结构 [/b][img]http://files.jb51.net/file_images/article/201305/201305080853201.png[/img]     FileInputStream:操作文件,经常和BufferedInputStream一起使用     PipedInputStream:可用于线程间通信     ObjectInputStream:可用于对象序列化     ByteArrayInputStream:用于处理字节数组的输入     LineNumberInputStream:可输出当前行数,并且可以在程序中进行修改   [b]下面是OutputStream的结构 [/b][img]http://files.jb51.net/file_images/article/201305/201305080853332.png[/img]     PrintStream:提供了类似print和println的接口去输出数据   [b]下面我们来看如何使用Stream的方式来操作输入输出[/b] 使用InputStream读取文件
[u]复制代码[/u] 代码如下:
使用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读取文件
[u]复制代码[/u] 代码如下:
 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复制文件
[u]复制代码[/u] 代码如下:
使用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();      }  }
[u]复制代码[/u] 代码如下:
使用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的结构 [img]http://files.jb51.net/file_images/article/201305/20130508091103.png[/img] 这里的Reader基本上和InputStream能够对应上。     Writer的结构如下 [img]http://files.jb51.net/file_images/article/201305/20130508085414.png[/img] 下面我们来看一些使用Reader或者Writer的例子     使用Reader读取文件内容
[u]复制代码[/u] 代码如下:
使用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复制文件
[u]复制代码[/u] 代码如下:
使用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来对文件进行随机操作。     创建一个大小固定的文件
[u]复制代码[/u] 代码如下:
创建大小固定的文件  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();  }
向文件中随机写入数据
[u]复制代码[/u] 代码如下:
向文件中随机插入数据  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();  }
接下里,我们来看一些其他的常用操作     移动文件
[u]复制代码[/u] 代码如下:
移动文件  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);  }
复制文件
[u]复制代码[/u] 代码如下:
复制文件  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();      }  }
复制文件夹
[u]复制代码[/u] 代码如下:
复制文件夹  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());          }      }  }
删除文件夹
[u]复制代码[/u] 代码如下:
删除文件夹  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();      }  }
获取文件夹大小
[u]复制代码[/u] 代码如下:
获取文件夹大小  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;  }
将大文件切分为多个小文件
[u]复制代码[/u] 代码如下:
将大文件切分成多个小文件  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();  }
将多个小文件合并为一个大文件
[u]复制代码[/u] 代码如下:
将多个小文件合并成一个大文件  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();  }
执行外部命令
[u]复制代码[/u] 代码如下:
执行外部命令  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();      }  }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部