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. 前端--json数据的处理及相关兼容问题

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...

  2. 4.SQL语言基础

    4.1语言分类和用户模式 4.1.1语言分类 1)数据查询语言 用语检索数据库中的数据,主要是select语句,是操作数据库时最为频繁使用. 2)数据操纵语言 用语改变数据库中的数据,主要包括inse ...

  3. Swift开源了,有什么好处?

    昨天swift开源了,喜大泪奔的好消息! swift的官方网站https://swift.org swift在github的开源地址https://github.com/apple/swift 今天早 ...

  4. angularJS广播

    控制器之间共享数据(向父级/子级控制器传递event,data),类似于service在不同的控制器中通信 html: <div ng-controller="ParentCtrl&q ...

  5. QuickSort 递归 分治

    QuickSort 参考<算法导论>,<C程序设计语言> #include<stdio.h> void swap(int v[], int i, int j); v ...

  6. AS3.0声明静态属性和静态方法

    静态属性的变量声明要加static,static var 名称:属性类型=值 静态属性的常量声明要加static或者const,并在声明时就要赋值.static||const var 名称:属性类型= ...

  7. 2016022607 - redis配置文件

    在Redis有配置文件(redis.conf)可在Redis的根目录下找到.可以通过Redis的CONFIG命令设置所有Redis的配置. Redis的CONFIG命令的基本语法如下所示: redis ...

  8. 修改虚拟机linux硬盘的大小

    一.概述 Ubuntu用了一段时间,系统已从原来的4G增长到8G,导致虚拟磁盘不够用,需要修改虚拟硬盘的大小. 但是,修改虚拟机硬盘的大小不像修改内存那么简单,操作一个滑动条就轻松搞定.要知道虚拟硬盘 ...

  9. JSP 结构

    网络服务器需要一个JSP引擎,也就是一个容器来处理JSP页面. 容器负责截获对JSP页面的请求.本教程使用内嵌JSP容器的Apache来支持JSP开发. JSP容器与Web服务器协同合作,为JSP的正 ...

  10. 用wpf实现了多个excel文件的合并

    最近公司做了一个微信红包的项目,其中一个主要的工作内容是 将238万张券导入到微信平台里面,用于微信卡券的领取和核销.但是提供给我的券都是以一个个的excel文件给到的.然后通过excel文件的导入功 ...