[Java] Java IO Files

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

时间: 2024-10-13 05:14:19

[Java] Java IO Files的相关文章

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

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

黑马程序员——Java基础---IO(下)

黑马程序员——Java基础---IO(下) ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供了File类.properties类.打印流.序列流等和输入输出相关的类,它们能够帮助我们更好的处理信息.下面将对它们进行简单的介绍. 一.正

JAVA之IO技术-获取指定目录下的文件夹和文件的File对象或是字符串名称。

package ioTest.io3; /* * 获取指定目录下的文件夹和文件的File对象或是字符串名称. * 也可以通过filter获取指定的文件夹或者指定类型的文件 * 这里面需要做一个总结,如何利用jdk的源码去理解不熟悉的方法的应用. */ import java.io.File; import java.io.FileFilter; import java.io.FilenameFilter; public class FileDemo2 { public static void m

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

java的io的知识中,File类必须掌握.File类是对文件或者文件夹的封装.它本身并不能对所封装的文件进行读写,它封装的只是文件或文件夹的周边知识,比如 大小啦,创建日期啦,路径啦等等. 如果File封装的文件夹,File类的list()方法可以将此文件夹下的所有文件夹和文件已字符串数组的形式返回. list(FilenameFilter)可以对返回的字符串数组进行过滤,取自己想要的字符串. ?打印文件夹下的.java文件 实现1 package com.westward.io; impor

Java的IO系统

Java的IO操作 最近想用Java写一个爬虫,知乎了一下,很多人推荐如果业务逻辑不太复杂,都推荐使用国内大牛写的的一个框架webmagic,这个是java实现的,思路参照谷歌的Scrapy .但是实现爬虫需要用到很多关于IO操作和多线程,发现这两项一直都是我java比较模糊的地方,这次就顺便学习一下,我看的是<java编程思想>. 对于IO的存取,不仅存在与各种I/O源端和想与之通信的接收端(接收端包括文件.控制台.网络链接等等),而且可能还需要有多种不同的方式与它们通信(顺序.随机存取.缓

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

1.操作基本数据类型的流 1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出流写入稍后由数据输入流读取的数据. · DataOutputStream:数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中.然后,应用程序可以使用数据输入流将数据读入. package datastreamdemos; import java.io.*; /** * Created b

JAVA 21 IO File Properties

File:文件类,操作文件夹,文件的属性信息. 创建对象举例“ File f1=new File("c:\\abc\\a.txt"); 字符串可以为变量 File f2 = new File("c:\\abc","a.xtx");指定目录名和文件名称 File d = new File("c:\\abc") File f3 = new File(d,"a.txt"); 变量形式. 目录分隔符的跨平台形式 F

Java复习--IO(输入/输出){Java NIO}

http://my.oschina.net/u/2263278/blog/508770中介绍的BufferedReader时提到它的一个特征----当BufferedReader读取输入流中的数据时,如果没有读到有效数据,程序将在此处阻塞该线程的执行(使用InputStream的read()方法从流中读取数据时,如果数据源中没有数据,它也会阻塞该线程),也就是前面介绍的输入流.输出流都是阻塞式的输入.输出.传统的输入流.输出流都是通过字节的移动来处理的,即使我们不直接去处理字节流,但底层的实现还

Java之IO流详解

IO流 Input/Output 完成输入/输出 应用程序运行时——数据在内存中  ←→ 把数据写入硬盘(磁带)  内存中的数据不可持久保存的  输入:从外部存储器(硬盘.磁带.U盘)把数据读入内存. 输出:从内存中把数据写入外部存储区(硬盘.磁带.U盘)中,这样就可以保证:即使程序退出了,数据依然不会丢失. File — 代表磁盘上的文件或目录. ●  listRoots() :列出磁盘上所有的根目录 ● exists:判断是否存在 ● mkdir:创建目录 ● listFiles():列出当

java之IO实例

实例1:从键盘接收一个文件夹路径,把文件夹中的所有文件以及文件夹的名字按层级打印 分析:这里用到了file类的方法和递归 public  class  Test10{ public  static  void   main(String[ ]  args) { Scanner  sc=new Scanner(System.in); String  path=sc.nextLine( ); File   f=new  File(path); System.out.println(f.getName