Java从入门到实战之(9)File文件类

File类说明

存储在变量,数组和对象中的数据是暂时的,当程序终止时他们就会丢失.为了能够永

久的保存程序中创建的数据,需要将他们存储到硬盘或光盘的文件中.这些文件可以移动,传送,亦可以被其他程序使用.由于数据存储在文件中,所以我们需要学习一个和文件有密切关系的类,叫做File类,将要掌握获取文件的属性以及删除和重命名文件.最终如何向文件中写入数据和从文件中读取数据.

那么File类关心的是在磁盘上文件的存储.

File类描述的是一个文件或文件夹。(文件夹也可以称为目录)

该类的出现是对文件系统的中的文件以及文件夹进行对象的封装。可以通过对象的思想来操作文件以及文件夹。

可以用面向对象的处理问题,通过该对象的方法,可以得到文件或文件夹的信息方便了对文件与文件夹的属性信息进行操作。

文件包含很多的信息:如文件名、创建修改时间、大小、可读可写属性等。

    1. File类中常用的方法:

创建:

createNewFile() 在指定位置创建一个空文件,成功就返回true,如果已存在就不创建然后返回false

mkdir() 在指定位置创建目录,这只会创建最后一级目录,如果上级目录不存在就抛异常。

mkdirs() 在指定位置创建目录,这会创建路径中所有不存在的目录。

renameTo(File dest) 重命名文件或文件夹,也可以操作非空的文件夹,文件不同时相当于文件的剪切,剪切时候不能操作非空的文件夹。移动/重命名成功则返回true,失败则返回false。

删除:

delete() 删除文件或一个空文件夹,如果是文件夹且不为空,则不能删除,成功返回true,失败返回false。

deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录,保证程序异常时创建的临时文件也可以被删除

判断:

exists() 文件或文件夹是否存在。

isFile() 是否是一个文件,如果不存在,则始终为false。

isDirectory() 是否是一个目录,如果不存在,则始终为false。

isHidden() 是否是一个隐藏的文件或是否是隐藏的目录。

isAbsolute() 测试此抽象路径名是否为绝对路径名。

获取:

getName() 获取文件或文件夹的名称,不包含上级路径。

getPath()       返回绝对路径,可以是相对路径,但是目录要指定

getAbsolutePath() 获取文件的绝对路径,与文件是否存在没关系

length() 获取文件的大小(字节数),如果文件不存在则返回0L,如果是文件夹也返回0L。

getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回null。

lastModified() 获取最后一次被修改的时间。

文件夹相关:

staic File[] listRoots() 列出所有的根目录(Window中就是所有系统的盘符)

list() 返回目录下的文件或者目录名,包含隐藏文件。对于文件这样操作会返回null。

list(FilenameFilter filter) 返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。

listFiles() 返回目录下的文件或者目录对象(File类实例),包含隐藏文件。对于文件这样操作会返回null。

listFiles(FilenameFilter filter) 返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null。

IO流体验与简介

File对象可以表示存在的文件或文件夹,也可以表示不存在的。

我们想要得到文件的内容怎么办,File只是操作文件,文件的内容如何处理就需要使用io流技术了。

例如在C盘下有一个名称为a.txt的文本文件.想要通过Java程序读出来文件中的内容,需要使用IO流技术.同样想要将程序中的数据,保存到硬盘的文件中,也需要IO流技术.

IO流简介:(Input/Output)

I/O类库中使用“流”这个抽象概念。Java对设备中数据的操作是通过流的方式。

表示任何有能力产出数据的数据源对象,或者是有能力接受数据的接收端对象。“流”屏蔽了实际的I/O设备中处理数据的细节。IO流用来处理设备之间的数据传输。设备是指硬盘、内存、键盘录入、网络等。

Java用于操作流的对象都在IO包中。IO流技术主要用来处理设备之间的数据传输。

由于Java用于操作流的对象都在IO包中。所以使用IO流需要导包如:import java.io.*;

IO流的分类

流按操作数据类型的不同分为两种:字节流与字符流。

流按流向分为:输入流,输出流(以程序为参照物,输入到程序,或是从程序输出)

  1. 字节流

什么是字节流

    计算机中都是二进制数据,一个字节是8个2进制位.字节可以表示所有的数据,比如文本,音频,视频.图片,都是作为字节存在的.也就是说字节流处理的数据非常多。

在文本文件中存储的数据是以我们能读懂的方式表示的。而在二进制文件中存储的数据是用二进制形式表示的。我们是读不懂二进制文件的,因为二进制文件是为了让程序来读取而设计的。例如,Java的源程序(.java源文件)存储在文本文件中,可以使用文本编辑器阅读,但是Java的类(字节码文件)存储在二进制文件中,可以被Java虚拟机阅读。二进制文件的优势在于它的处理效率比文本文件高。

我们已经知道File对象封装的是文件或者路径属性,但是不包含向(从)文件读(写)数据的方法。为了实现对文件的读和写操作需要学会正确的使用Java的IO创建对象。

字节流的抽象基类:

输入流:java.io.InputStream

输出流:java.io.OutputStream

特点:

字节流的抽象基类派生出来的子类名称都是以其父类名作为子类名的后缀。

如:FileInputStream, ByteArrayInputStream等。

说明:

字节流处理的单元是一个字节,用于操作二进制文件(计算机中所有文件都是二进制文件)

流按操作数据类型的不同分为两种:字节流与字符流。

流按流向分为:输入流,输出流(以程序为参照物,输入到程序,或是从程序输出)

  1. 字符流

计算机并不区分二进制文件与文本文件。所有的文件都是以二进制形式来存储的,因此,从本质上说,所有的文件都是二进制文件。所以字符流是建立在字节流之上的,它能够提供字符层次的编码和解码。例如,在写入一个字符时,Java虚拟机会将字符转为文件指定的编码(默认是系统默认编码),在读取字符时,再将文件指定的编码转化为字符。

 

常见的码表如下:

ASCII: 美国标准信息交换码。用一个字节的7位可以表示。

ISO8859-1: 拉丁码表。欧洲码表,用一个字节的8位表示。又称Latin-1(拉丁编码)或“西欧语言”。ASCII码是包含的仅仅是英文字母,并且没有完全占满256个编码位置,所以它以ASCII为基础,在空置的0xA0-0xFF的范围内,加入192个字母及符号,

藉以供使用变音符号的拉丁字母语言使用。从而支持德文,法文等。因而它依然是一个单字节编码,只是比ASCII更全面。

GB2312:  英文占一个字节,中文占两个字节.中国的中文编码表。

GBK: 中国的中文编码表升级,融合了更多的中文文字符号。

Unicode:  国际标准码规范,融合了多种文字。所有文字都用两个字节来表示,Java语言使用的就是unicode。

UTF-8: 最多用三个字节来表示一个字符。

(我们以后接触最多的是iso8859-1、gbk、utf-8)

    1. 编码:

字符串---》字节数组

String类的getBytes() 方法进行编码,将字符串,转为对映的二进制,并且这个方法可以指定编码表。如果没有指定码表,该方法会使用操作系统默认码表。

注意:中国大陆的Windows系统上默认的编码一般为GBK。在Java程序中可以使用System.getProperty("file.encoding")方式得到当前的默认编码。

    1. 解码:

字节数组---》字符串

String类的构造函数完成。

String(byte[] bytes)  使用系统默认码表

String(byte[],charset)指定码表

注意:我们使用什么字符集(码表)进行编码,就应该使用什么字符集进行解码,否则很有可能出现乱码(兼容字符集不会)。

/ 编码操作与解码操作。

public static void main(String[] args) throws Exception {

String value = System.getProperty("file.encoding");

System.out.println("系统默认的编码为 " + value);

 

String str = "中";

 

// 编码操作

byte[] bytes = str.getBytes();

byte[] bytes2 = str.getBytes("gbk");// d6d0

byte[] bytes3 = str.getBytes("utf-8");// e4b8ad

 

System.out.println(Arrays.toString(bytes)); // [-42, -48]

System.out.println(Arrays.toString(bytes2));// [-42, -48]

System.out.println(Arrays.toString(bytes3));// [-28, -72, -83]

 

// 解码操作

// 编码gbk,解码utf-8乱码。

String str2 = new String(bytes2, "utf-8");

System.out.println(str2);

 

// 编码utf-8 解码gbk,乱码

str2 = new String(bytes3, "gbk");

System.out.println(str2);

// gbk兼容gb2312所以,没有问题。

str = new String("中国".getBytes("gb2312"), "gbk");

System.out.println(str);

}

 

  1. 递归

递归做为一种算法在程序设计语言中广泛应用。是指函数/过程/子程序在运行过程中直接或间接调用自身而产生的重入现象。

(自己调用自己,有结束条件)

注意:递归时一定要明确结束条件。

数学中递归运算.

对于任何正整数N ,N! (读作N的阶乘)的值定义为1-N(包括N)的所有的整数的成绩.因此3! 就是 3!=3*2*1 =6;

5! 定义为5!=5*4*3*2*1=120

那么整数N 的阶乘 N! 可以表示为

1!=1

N!=N*(N-1)! for N>1

若果N 等于1 那么1的继承就是1,其他所有N! =N*(N-1)!,例如:50!=50*49!

49!=49*48! 48!=48*47! 一直持续到1出现.

 
原文地址:https://www.cnblogs.com/huanghanyu/p/13802690.html