Java IO

1.File类是java.io包下代表与平台无关的文件和目录,在程序里操控文件或者目录,都可以通过File类来完成,File可以新建,删除,重命名,文件或目录,但是不能访问文件本身内容。如果需要访问文件本身,则需要使用输入输出流.

File类提供了很多方法来操作文件或目录。

访问文件名的部分方法:

String getName();返回File对象所表示的文件名或路径名(如果是路径,则返回最后一级子路径名)

String getPath();返回File对象所对应的路径名

File getAbsoluteFile();返回File对象的绝对路径

String getAbsolutePath();返回File对象所对应的绝对路径名

boolean renameTo(File newName):重命名,成功返回true,否则返回false



文件检测的部分方法:

boolean exists()判断File对象对应的文件或目录是否存在

boolean canWrite()判断File对象对应的文件或目录是否可写

boolean canRead()判断File对象对应的文件或目录是否可读

boolean isFile()判断File对象对应的是否是文件,而不是目录

boolean isDirectory()判断File对象对应的是否是目录,而不是文件

boolean isAbsolute()判断File对象对应的文件回目录是否是绝对路径



获取常规文件信息:

long lastModified()返回文件最后被修改的时间

long length()返回文件内容的长度



文件操作的部分方法:

boolean createNewFile()当此File对象所对应的文件不存在时,该方法将新建一个该File对象所指定的新文件,如果创建成功返回true,否则返回false

boolean delete()删除File对象所对应的文件或目录



目录操作的部分方法:

boolean mkdir()创建一个File对象所对应的目录,如果创建成功,返回true,否则返回false

String[] list()列出File对象的所有子文件名和路径名,返回String 数组

File[] list()列出File对象的所有子文件和路径,返回File 数组

static File[]listRoots():列出系统所有的根路径。可以直接通过File类调用



下面通过一个简单的程序来测试一下File类的功能
package IO;

import java.io.File;
import java.io.IOException;

public class FileTest {
/**
 * File 类功能的测试
 * @param path 指定的路径
 * @throws IOException
 */
 public void file_test(String path) throws IOException {
  //构造一个File对象file
  File file = new File(path);
  //构造一个File对象file1   重命名时用
  File file1 = new File("f.txt");
       
  System.out.println(file.getName());
  System.out.println(file.getAbsoluteFile());
  System.out.println(file.getAbsolutePath());

  System.out.println(file.canRead());
  System.out.println(file.canWrite());
  System.out.println(file.exists());
  System.out.println(file.isAbsolute());
  System.out.println(file.isFile());
  System.out.println(file.isDirectory());
  System.out.println(file.lastModified());
  System.out.println(file.length());
  file.createNewFile();
  file.delete();
  file.mkdir();
  File []list=file.listFiles();
  file.renameTo(file1);

 }

 public static void main(String[] args) throws IOException {
  FileTest ft = new FileTest();
  ft.file_test("FFFF.txt");
 }
}

下面程序用File类完成了文件搜索器项目,把E盘所有的文件名打印
package IO;

import java.io.File;

/**
 * 文件搜索器
 *
 * @author liurenyou
 *
 */
public class Search {
 /**
  * 搜索文件
  *
  * @param path
  *            文件路径
  */
 public void searh(String path) {
  // 构造File对象
  File file = new File(path);
  // 如果文件存在
  if (file.exists()) {
   // 如果是文件
   if (file.isFile()) {

    System.out.println(file.getAbsolutePath());
    // 如果是文件夹
   } else if (file.isDirectory()) {
    // 建一个File数组
    File[] files = file.listFiles();
    // 遍历File数组
    for (File f : files) {
     searh(f.getAbsolutePath());// 递归调用
    }
   }
  } else
   System.out.println("不存在此文件");
 }

 public static void main(String[] args) {
  Search search = new Search();
  search.searh("E://");
 }

}

2.java IO流

java中文件输入输出流是FileInputStream和FileOutputStream,文件输入流从文件系统中的某个文件中获得输入字节,然后可以用输出流将数据写入文件中。

首先创建两个流的对象:

FileInputStream的构造方法有三种重载方式,常用的是FileInputStream(File file)和FileInputStream(String path),前者需要传递的是一个File对象,输入流将直接与这个文件相关联,获取这个文件的数据;后者需要传递的参数是文件的路径名,输入流则将关联此路径下的文件。

FileOutputStream的构造方法有五种重载形式,常用的是FileOutputStream(File file),FileOutputStream(File file, boolean append),FileOutputStream(String name)和FileOutputStream(String name, boolean append),第一个和第三个与FileInputStream相同,都是将文件或路径对应的文件与输出流相关联,其他两种的参数多了一个布尔型的append,是指定输出流是否追加的,如果为true,则将字节写入文件末尾处,而不是写入文件开始处 ,为false则是重新输出到文件中,默认为true。

无论是创建FileInputStream还是创建FileOutputStream时,如果指定文件不存在,或者它是一个目录,而不是一个常规文件,抑或因为其他某些原因而无法打开进行读取,则抛出 FileNotFoundException异常,所以创建这两类对象时,应该处理这些异常,一般将它们放到try/catch块中进行捕获。

进行文件的读写操作时首先是关联好读取的文件和要写出的文件,接下来就需要调用文件输入输出流中的几个重要的方法,输入流中的read()方法读取数据,输出流的write()方法输出数据,调用这两个方法时需要进行异常捕获IO异常。

read()有几种重载方式,其中常用的有int read()和int read(byte[] bytes),前者是一次读取一个字节,读取的数据作为返回值返回,如果读到文件末尾则返回-1,后者是从此输入流中将最多bytes.length 个字节的数据读入一个 byte 数组中,返回读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回-1。这如同文件是一缸水,前者是一滴一滴去取,后者是用一个容器去取,显然前者更安全,后者更快速。

同样的write()也有void write(int i)和void write(byte[] bytes)两种重载,前者是将指定字节写入此文件输出流,后者是将bytes.length 个字节从指定 byte 数组写入此文件输出流中。

另外文件输入流和文件输出流中都有一个close()的方法,这个方法用来关闭流对象并释放与此流有关的所有系统资源,所以每次在使用完流对象后应注意分别调用文件输入流和文件输出流的close()方法,此方法有可能抛异常,必须进行捕捉。

另外一些方法请自行查阅java API文档


下面的程序是实现文件的读与写
其中读文件函数中方法一,方法二,方法三,方法四
方法一不能识别中文,其他可以识别,个人喜欢方法二。gbk和utf-8都是支持中文的

package FileWR;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

/**
 * 文件读写类
 *
 * @author
 */
public class FileRWTest {

 /**
  * 读取文件内容的方法,并将文件内容打印输出
  *
  * @param fileName
  *            指定的文件名
  */
 public void readFile(String fileName) throws Exception {
  // 构造一个File对象
  File file = new File(fileName);
  // 构造一个文件输入流对象
  FileInputStream fis = new FileInputStream(file);

  BufferedInputStream bis = new BufferedInputStream(fis);
  
                // // 读取字节 方法一
  // int i;
  // while ((i = fis.read()) != -1) {
  // System.out.print((char) i);
  // }



  byte[] bytes = new byte[bis.available()]; // 方法二
  bis.read(bytes);
  System.out.println(new String(bytes));



  // String content = "";//方法三
  // int i;
  // while ((i = fis.read()) != -1) {
  // content = content + (char) i;
  // }
  // System.out.println(new String(content.getBytes("iso-8859-1"),"gbk"));



  // StringBuffer sb = new StringBuffer();//方法四
  // int i = fis.read();
  // while (i != -1) {
  // // 将读取到的字节添加到缓冲区sb中
  // sb.append((char) i);
  // i = fis.read();
  // }
  // // 将sb中的字符转换成一个String
  // System.out.println(new String(sb.toString().getBytes("iso-8859-1"),
  // "gbk"));




  // 关闭流
  fis.close();
 }

 /**
  * 向指定的文件写入数据
  *
  * @param fileName
  *            指定的文件名
  * @param data
  *            要写入的数据
  */
 public void writeToFile(String fileName, String data) throws Exception {
  // 构造一个File对象
  File file = new File(fileName);
  // 构造一个文件输出流对象
  FileOutputStream fos = new FileOutputStream(file, true);//加了true,则写文件是会追加到末尾
  // 将data变成一个个字节
  byte[] datas = data.getBytes();
  // 将数据写入文件
  fos.write(datas);
  System.out.println("文件写入ok");
  // 关闭流
  fos.close();
 }

 public static void main(String[] args) throws Exception {
  FileRWTest test = new FileRWTest();
  test.readFile("D:\\ecplise\\paint\\src\\FileWR\\FileRWTest.java");
 }
}


下面的程序用java IO流实现了文件的复制粘贴

package Copy_paste;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

/**
 * 复制粘贴
 *
 * @author liurenyou
 *
 */
public class CopyPaste extends JFrame {
 boolean flag = false;

 public void UI() {

  setTitle("复制粘贴神器                        Author:刘仁有");
  setSize(400, 160);
  setLocationRelativeTo(null);
  setResizable(false);
  setDefaultCloseOperation(3);
  setLayout(new FlowLayout(1, 60, 20));
  JTextField copy_text = new JTextField(18);
  JTextField paste_text = new JTextField(18);
  JButton CopyPaste_button = new JButton("复制粘贴");
  add(copy_text);
  add(paste_text);
  add(CopyPaste_button);
  setVisible(true);

  CopyPaste_button.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    try {

     copy_paste(copy_text.getText(), paste_text.getText());
    } catch (Exception e1) {
     e1.printStackTrace();
    }

   }

  });

 }

 /**
  * 递归完成文件或者文件夹的复制粘贴
  *
  * @param src_address
  *            源地址
  * @param pre_address
  *            现地址
  * @throws Exception
  */
 public void copy_paste(String src_address, String pre_address) throws Exception {

  File file = new File(src_address);// 源地址
  File file1 = new File(pre_address);// 现地址
  FileOutputStream fos = new FileOutputStream(file1, true);// true 追加
  FileInputStream fis = new FileInputStream(file);
  BufferedInputStream bis = new BufferedInputStream(fis);//用BufferedInputStream,BufferedOutputStream更快的复制粘贴
  BufferedOutputStream bos = new BufferedOutputStream(fos);
  // 如果文件存在
  if (file.exists()) {
   // 如果是文件
   if (file.isFile()) {
    // byte[] bytes = new byte[fis.available()];//一次性读完所有字节,如果文件过大可能出错
    // fis.read(bytes);
    // fos.write(bytes);
    long start = System.currentTimeMillis();

    byte[] bytes = new byte[1024];// 缓冲区(定义一个1024字节大的缓冲区)
    int i = bis.read(bytes);//i=-1表示文件到末尾了
    while (i != -1) {
     bos.write(bytes, 0, i);
     i = bis.read(bytes);

    }
    long end = System.currentTimeMillis();
    System.out.println((double) (end - start) / 1000 + "秒");

   }
  }

  fis.close();
  fos.close();

 }

 public static void main(String[] args) throws Exception {
  new CopyPaste().UI();
 }
}











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值