File IO

File IO

        在之前学习C#的过程中我们就已经对文件操作有所了解了,现在我们就来了解一下Java的文件操作。在Java中常用的文件编码主要有:utf-8、gbk、iso-8859-1这几种。

一、File类

        在C#中用来操作文件的是File类和FileInfo类,用来操作目录的是Directory类和DirectoryInfo类;而在Java中不论是操作文件还是目录都是用File类并且是非static的。

        创建一个File对象的语法及其常用方法如下:

File file = new File(String pathName);    //小括号里放路径

//常用方法
exists()      //判断文件或目录是否存在
isFile()      //判断是否是文件
isDirectory()    //判断是否是目录
getPath()      //返回此对象表示的文件的相对路径名
getAbsolutePath()     //返回此对象表示的文件的绝对路径名
getName()      //返回此对象表示的文件或目录的名称
delete()      //删除此对象指定得到文件或目录
createNewFile()      //创建名称的空文件,不创建文件夹
length()          //返回文件的长度,单位为字节,若文件不存在,则返回0L

例如,下面来看一下File类是如何获取文件属性的:

public static void main(String[] args) {
		FileMethods fm = new FileMethods();
		File file = new File("D:\\hello.txt");
		fm.showFileInfo(file);
	}
	
	/**
	 * 显示文件信息
	 */
	public void showFileInfo(File file) {
		if(file.exists()) {     //判断文件或目录是否存在
			if(file.isFile()) {     //如果是文件
				System.out.println("名称:" + file.getName());
				System.out.println("相对路径:" + file.getPath());
				System.out.println("绝对路径:" + file.getAbsolutePath());
				System.out.println("文件大小:" + file.length() + "字节");
			}
			if(file.isDirectory()) {
				System.out.println("此文件是目录");
			}
		}else {
			System.out.println("文件不存在");
		}
	}

运行结果为:
在这里插入图片描述

文件读取步骤

1、导入包:java.io;

2、创建流对象;

3、使用对象读写;

4、关闭流。

二、Java的流

        前面讲述了如何利用File类对文件或目录的属性进行操作,但File类不能访问文件的内容,所以我们就需要借助于文件流来对文件进行读写的操作。

        Java的文件流按读取方式分类可分为:字符流(一次读取一个字符)和字节流(一次读取一个字节);根据读取方向分为输入流(读)和输出流(写)。

        读取一张图片一般是采用字节流的方式,,字符流能实现的功能字节流都能实现,反之却不一定。

1、字节流

(1)输入流

        输入流InputStream是一个抽象类,在实际应用中我们通常使用InputStream的子类FileInputStream类来实现文本文件内容的读取。它们的常用方法是:

read()     //读取一个字节数据
read(byte[] b)     //将数据读取到字节数组中
read(byte[] b,int off,int len)     //从输入流中读取最多len长度的字节,保存到字节数组b中,保存的位置从off开始
close()      //关闭输入流
available()     //返回输入流读取的估计字节数

它的读取方法都是返回值为-1的时候表示读取结束。

        DataInputStream类是FileInputStream的子类,他是FileInputStream类的扩展。利用DataInputStream类读取二进制文件的实现步骤其实与FileInputStream类读取文本文件的步骤及其相似,而且还要用到FileInputStream类。

例如:

DataInputStream dis = null;
try {
    //创建输入流对象
    FileInputStream fis = new FileInputStream("D:\\File.class");
    dis = new DataInputStream(fis);
}catch (IOException e) {
    e.printStackTrace();
}finally {
    try {
        if(dis != null) {
            dis.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
(2)输出流

        字节输出流OutputStream类,在实际应用中我们通常使用OutputStream的子类FileOutputStream类来实现文本文件内容的读取。它们的常用方法是:

write(int c)     //写入一个字节数据
write(byte[] buf)     //写入数组buf的所有字节
write(byte[] b,int off,int len)   //将字节数组中从off位置开始,长度为len的字节数据输出到输出流中
close()      //关闭输出流

        DataOutputStream类是FileOutputStream的子类,他是FileOutputStream类的扩展。利用DataOutputStream类读取二进制文件的实现步骤其实与FileOutputStream类读取文本文件的步骤及其相似,而且还要用到FileOutputStream类。

例如:

DataOutputStream dos = null;
try {
    //创建输入流对象
    FileOutputStream outFile = new FileOutputStream("D:\\Temp.class");
	out = new DataOutputStream(outFile);
}catch (IOException e) {
    e.printStackTrace();
}finally {
    try {
        if(dos != null) {
            dos.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

2、字符流

(1)输入流

        字符输入流Reader类,在实际应用中我们通常使用InputStream的子类FileReader类来实现文本文件内容的读取。它们的常用方法是:

read()     //从输入流中读取单个字符
read(byte[] b)     //从输入流中读取b.length长度的字符,保存到字符数组b中,返回实际读取字符数
read(char[] b,int off,int len)     //从输入流中读取最多len长度的字节,保存到字节数组b中,保存的位置从off开始,返回实际读取的字符长度
close()      //关闭输入流

它的读取方法都是返回值为-1的时候表示读取结束。

        字符输入流BufferedReader类也是Reader类的子类,它和FileReader类的区别在于BufferedReader类带有缓冲区,它可以先把一批数据读到缓冲区,接下来的读操作都是从缓冲区内获取数据。它的常用构造方法是:

BufferedReader(Reader in)
br.readLine()      //br为对象名,此方法是BufferedReader独有的方法,表示读取一行数据

例如,使用FileReader和BufferedReader读取文本文件:

FileReader fr = null;
BufferedReader br = null;
try {
    //创建一个FileReader对象
    fr = new FileReader("D:\\hello.txt");
    //创建一个BufferedReader对象
    br = new BufferedReader(fr);
    //读取一行数据
    String line = br.readLine();
    while(line != null) {
        System.out.println(line);
        line = br.readLine();
    }
}catch (IOException e) {
    System.out.println("文件不存在!");
}finally {
    try {
        if(br != null) {
            br.close();
        }
        if(fr != null) {
            fr.close();
        }
    }catch (IOException e) {
        e.printStackTrace();
    }
}

在控制台将输出从文本文件读取出来的内容。

(2)输出流

        字符输出流Writer类,在实际应用中我们通常使用Writer的子类FileWriter类来实现文本文件内容的读取。它们的常用方法是:

write(String c)     //将str字符串里包含的字符输出到指定的输出流中
write(String str,int off,int len)   //将str字符串从off位置开始,长度为len的字符输出到输出流中
close()      //关闭输出流
flush()     //刷新输出流

        字符输出流BufferedWriter类也是Writer类的子类,它和FileWriter类的区别在于BufferedWriter类带有缓冲区,它可以先把一批数据读到缓冲区,接下来的读操作都是从缓冲区内获取数据。它的常用构造方法是:

BufferedWriter(Writer out)

例如,使用FileWriter和BufferedWriter读取文本文件:

FileWriter fw = null;
BufferedWriter bw = null;
try {
    //创建一个FileWriter对象
    fw = new FileWriter("D:\\hello.txt");
    //创建一个BufferedWriter对象
    bw = new BufferedWriter(fw);
    //写入信息
    bw.write("大家好!");
    bw.write("我正在学习BufferedWriter!");
    bw.newLine();
    bw.write("请多多指教!");
    bw.newLine();    //换行
    bw.flush();     //刷新
    bw.close();
    fw.close();    //关闭文件流
}catch (IOException e) {
    System.out.println("文件不存在!");
}finally {
    try {
        if(br != null) {
            br.close();
        }
        if(fr != null) {
            fr.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在指定的文件夹中将添加文本信息。

好啦,今天就到这里啦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值