Files

使用 FileInputStream 或 FileReader 可以用于读入文件,前者基于二进制,后者基于文本。使用它们不需要读取整个文件,但是只能按照它们存储的顺序,依次读取字节,或字符。

使用 FileOutputStream 或 FileWriter 可以把数据写出到文件,按照数据被写入的顺序,依次存储数据。

RandomAccessFile 可以在文件中跳转,读入数据,或者写出数据到文件。Random Access 并不意味着你真的从随意的位置读入数据,或者把数据写入到随意位置。而是意味着你可以在文件中跳跃,然后在停留的位置读入数据,并且写出数据。写出数据时,是覆盖原来的数据,不会是数据。

File 类用于获取文件大小,属性,不能用于获取文件内容。

File 类

Java IO API 中的 File 类可以访问底层文件系统,获取文件的信息元,即获取用于描述文件的信息,例如文件大小,属性等。如果需要访问文件内容,需要使用 FileInputStream, FileOutpuStream, RandamAccessFile。在 Java NIO 中,则使用 java.nio.FileChannel 读入文件内容。

创建文件对象的实例

        File file = new File("/tmp/tony/a.txt");

检查文件是否存在

在创建 File 对象时,即使文件不存在,构造器也不会报错。

        File file = new File("/tmp/tony/a.txt");
boolean isFileExist = file.exists();

创建目录

mkdirs() 方法可以创建 File 路径上面没有的全部文件夹。 下面例子中,如果 resources 以及之前的目录已存在,而 aaa 和 bbb 两层目录不存在,mkdirs() 会创建 aaa/ 以及其子目录 bbb/。

        File folder = new File("/tmp/tony/aaa/bbb/");
boolean isSuccess = folder.mkdirs();

mkdir() 方法只会最里面的那个目录。上面例子如果使用 mkdir() ,bbb 不会被创建,因为没有 aaa 目录,返回 false.

文件大小

        File file = new File("/tmp/tony/a.txt");
long size = file.length();

移动文件、改名

修改文件名字,移动文件位置,都是用 renameTo() 方法,和 Linux 中的 mv 命令相似。

        File file = new File("/tmp/tony/a.txt");
boolean isSuccess = file.renameTo(new File("/tmp/tony/aaa/xx.txt"));

删除文件

        File file = new File("/tmp/tony/a.txt");
file.delete();

列举目录下的文件

list() 方法获得目录下的全部文件名, listFiles() 方法获得目录下的全部文件,以 File 对象的形式存在。

        File file = new File("/tmp/tony/a.txt");
String[] subfileNames = file.list();
File[] subFiles = file.listFiles();

FileInputStream 和 FileOutputStream

FileInputStream

FileInputStream 按照 stream 的方式,基于字节,读取文件的内容。FileInputStream 是 InputSteam 的子类。

            InputStream is = new FileInputStream("/tmp/tony/a.txt");
int data = is.read();
while(data != -1){
System.out.print((char)data);
data = is.read();
}
is.close();

FileInputStream 的构造器有:

a. 接收一个 String 类型

            String filePath = "/tmp/tony/a.txt";
InputStream is = new FileInputStream(filePath);

b. 接收一个 File 对象为参数

            File file = new File("/tmp/tony/a.txt");
InputStream is = new FileInputStream(file);

read() 方法,一次读取一个字节,并返回该字节对应的 int 值

read(byte[]) 一次读取一个字节数组

close() 关闭 stream

FileOutputStream

写出数据到文件

            OutputStream os = new FileOutputStream("/tmp/tony/b.txt");
os.write("abcd\n".getBytes());

FileOutputStream 构造器

a. 接收一个参数, String 类型

            OutputStream os = new FileOutputStream("/tmp/tony/a.txt");

b. 接收一个参数,File 类型

            File file = new File("/tmp/tony/b.txt");
OutputStream os1 = new FileOutputStream(file);

c. 接收两个参数。第一个参数用于定位文件,String 或 File 类型;第二个参数表示,在写出数据到文件时,追加还是覆盖 File 文件原有的内容。

            OutputStream os1 = new FileOutputStream("/tmp/tony/a.txt", true);    // append content

            OutputStream os2 = new FileOutputStream("/tmp/tony/a.txt", false);    // overwrite content

wirte() 一次写出一个字节

write(byte[]) 一次写出一个字节数组

flush() 清刷写到 FileOutputStream 的缓冲区的数据到硬盘上。

RandomAccessFile

RandomAccessFile 可以跳到文件中的某个位置,开始读入和写出数据。写出数据时,会覆盖掉文件在该位置原有的内容,这是 FileInputStream 和 FileOutputStream 无法实现的。

FileReader 和 FileWriter

FileReader

FileReader 按照 stream 的方式,基于字符,读取文件的内容,和 FileInputStream 相似。区别在于 FileInputStream 基于 byte , 而 FileReader 基于字符。

            Reader reader = new FileReader("/tmp/tony/a.txt");
int data = reader.read();
while(data != -1){
System.out.print((char)data);
data = reader.read();
}
reader.close

字符集编码

FileReader 使用应用所在环境的编码集,对读入的数据进行解码。如果写出文件的编码集和读入文件时的编码集不一样,就会导致乱码。这时需要制定字符集,不是用 FileReader ,而是用基于 FileInputStream 的 InputStreamReader 。

            InputStream is = new FileInputStream("/tmp/tony/b.txt");
Reader reader = new InputStreamReader(is, "UTF-8");
int data = reader.read();
while(data != -1){
System.out.print((char)data);
data = reader.read();
}
reader.close();

FileWriter

FileWriter 按照 stream 的方式,基于字符,把数据写出到文件中,和 FileOutputStream 相似。区别在于 FileOutputSteam 基于 byte, 而 FileWriter 基于字符。

            Writer writer = new FileWriter("/tmp/tony/c.txt");
writer.write("aaabbb\n");
writer.close();

两个参数的构造器,第一个参数用于定位文件,第二参数表示在写出数据到文件时,是追加还是覆盖文件中原有的内容。

Writer writer1 = new FileWriter("/tmp/tony/a.txt", true);  //appends to file

Writer writer2 = new FileWriter("/tmp/tony/a.txt", false); //overwrites file

FileWriter 在写出数据时,无法指定特定的字符编码集。如果需要指定编码集,则不用用 FileWriter ,而是用基于 FileOutputStream 的 OutputSteamWriter。

            os = new FileOutputStream("/tmp/tony/d.txt");
Writer wt = new OutputStreamWriter(os, "UTF-8");
wt.write("aaa\n你好");
wt.close();

参考资料

Java IO Tutorial, jenkov

[Java] Java IO Files的更多相关文章

  1. Java文件IO操作应该抛弃File拥抱Paths和Files

    Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream;import java.nio.file.FileSystem; ...

  2. Java文件IO操作应该抛弃File拥抱Path和Files

    Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream;import java.nio.file.FileSystem; ...

  3. 二十一、Java基础--------IO流之综合案例分析

    前三篇文章详细介绍了IO流体系所涉及的重点内容,为了帮助理解与学习,本片博客主要是分析一个与IO操作相关的题目. 例1:在我们观看视频时经常要关注的就是视频的时间长度,在学习了IO操作之后,就可以自己 ...

  4. java之io之File类的list()方法过滤目录的使用

    java的io的知识中,File类必须掌握.File类是对文件或者文件夹的封装.它本身并不能对所封装的文件进行读写,它封装的只是文件或文件夹的周边知识,比如 大小啦,创建日期啦,路径啦等等. 如果Fi ...

  5. Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)

    1.操作基本数据类型的流     1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出 ...

  6. Java之IO流详解

    IO流 Input/Output 完成输入/输出 应用程序运行时——数据在内存中  ←→ 把数据写入硬盘(磁带)  内存中的数据不可持久保存的  输入:从外部存储器(硬盘.磁带.U盘)把数据读入内存. ...

  7. Java面向对象 IO (三)

     Java面向对象  IO  (三) 知识概要:                    (1)IO 流的操作规律                    (2)异常日志信息IO处理          ...

  8. java编程IO简单回顾和学习

    java编程IO操作必不可少的,很久不玩IO,回顾一下,写了几个小程序,记录一下,方便查阅和学习. 1.给出一个整数数组,将其写入一个文件,再从文件中读出,并按整数大小逆序打印. package co ...

  9. Java的IO文档

    1.     File类 1.1. File类说明 存储在变量,数组和对象中的数据是暂时的,当程序终止时他们就会丢失.为了能够永 久的保存程序中创建的数据,需要将他们存储到硬盘或光盘的文件中.这些文件 ...

  10. Java学习---IO操作

    基础知识 1.文件操作 Java语言统一将每个文件都视为一个顺序字节流.每个文件或者结束于一个文件结束标志,或者根据系统维护管理数据中所纪录的具体字节数来终止.当一个文件打开时,一个对象就被创建,同时 ...

随机推荐

  1. Oracle 检验身份证是否正确的存储过程

    ) ) ); ); ); ); ); ); ); ; , , , , , , , , , , , , , , , , , ); ;  , ) );  ..  loop )) ) ); , )), ), ...

  2. JS实时监听浏览器宽度的变化

    boot:function(){ //加载页面时执行一次 changeMargin(); //监听浏览器宽度的改变 window.onresize = function(){ changeMargin ...

  3. QTableWidget中添加按钮

    添加按钮 void QTableWidget::setCellWidget ( int row, int column, QWidget * widget ) widget可以是自己定义的按钮 cla ...

  4. who am i

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...

  5. 登录超时,给出提示跳到登录页面(ajax、导入、导出)

    一.一般页面登录超时验证,可以用过滤器filter,如下: package com.lg.filter; import java.io.IOException; import javax.servle ...

  6. 开启 htaccess 配置

    是在wamp中,apache2.2 开启 伪静态时,httpd.conf 配置如下: 查找 <Directory />Options FollowSymLinksAllowOverride ...

  7. 实现 winform 异步跨线程访问UI控件

    在开发winform时经常会用到多线程防止界面出现假死现象,比如当你单击某个按钮时,需要执行很多代码,但是在执行过程中想实时的将当前执行的情况报告给用户,类型进度条或文本什么的. 这个时候很显然,如果 ...

  8. [转] 小tip: 使用CSS将图片转换成黑白(灰色、置灰) ---张鑫旭

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=2547 //zxx: ...

  9. 超链接字体颜色设置(通过html/css的设置方法)

    超链接字体颜色设置是通过css来设置,a链接的颜色设置常用的有以下两种,1.超链接a的初始状态颜色,2.超链接字体的鼠标滑过颜色,还有两种病不常用:3.超链接字体的已访问颜色,4.超链接字体在按下鼠标 ...

  10. Java POI 导出EXCEL经典实现 Java导出Excel

    转自http://blog.csdn.net/evangel_z/article/details/7332535 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者 ...