I/O
I/O(输入/输出)。每一个设备都会有一个专用的I/O地址,用来处理自己的输入输出信息。Java中的I/O操作指的是运用Java虚拟机进行输入/出操作。Java对I/O的操作主要是数据流的方式有字符流和字节流。何为流呢就是可以理解为数据和目的地建立的传输通道,是有序的数据序列,所以在流里面是不能进行进行前后移动的,如果要进行操作就要加载到缓冲区里面进行操作。Java中的I/O流的数据单位主要分为两类: 字节流(8位) 和 字符流(16位)
流也分为节点流和处理流
节点流: 从一个特定的数据源读写数据。即节点流是直接操作文件,网络等的流,例如FileInputStream和FileOutputStream,他们直接从文件中读取或往文件中写入字节流。
处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。
Java I/O
io主要解决的就是 数据传输的问题,从传输方式上分,可以分为 磁盘 I/O 和 网络 I/O, 从传输格式上分,可以分为 基于字节的 I/O 和 基于字符的 I/O。
- 基于字节操作的 I/O 接口:InputStream 和 OutputStream
- 基于字符操作的 I/O 接口:Writer 和 Reader
- 基于磁盘操作的 I/O 接口:File
- 基于网络操作的 I/O 接口:Socket
Java I/O主要包括三个层次:
- 流式部分——I/O的主要部分如:OutputStream、InputStream、Writer、Reader等。
- 非流式部分——如:File类、RandomAccessFile(随机文件访问)类和FileDescriptor等类。
- 其他——文件读取部分的与安全相关的类,如:SerializablePermission类,以及与本地操作系统相关的文件系统的类,如:FileSystem类和Win32FileSystem类和WinNTFileSystem类。
java.io包里有4个基本类:InputStream、OutputStream及Reader、Writer类,它们分别处理字节流和字符流。其衍生的其他操作类都是基于这个类衍生出的。
文件流File
基于磁盘的I/O接口,文件和目录路径名的抽象表示。该实例File类是不可变的; 也就是说,一旦创建,由File对象表示的抽象路径名永远不会改变,路径名为/或者\。
构造函数
函数 | 描述 |
---|---|
File(File parent, String child) | 从父抽象路径名和子路径名字符串创建新的 File实例。 |
File(String pathname) | 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 |
File(String parent, String child) | 从父路径名字符串和子路径名字符串创建新的 File实例。 |
File(URI uri) | 通过将给定的 file: URI转换为抽象路径名来创建新的 File实例。 |
所有方法
方法 | 描述 |
---|---|
boolean canExecute() | 测试应用程序是否可以执行此抽象路径名表示的文件。 |
boolean canRead() | 测试应用程序是否可以读取由此抽象路径名表示的文件。 |
boolean canWrite() | 测试应用程序是否可以修改由此抽象路径名表示的文件。 |
int compareTo(File pathname) | 比较两个抽象的路径名字典。 |
boolean createNewFile() | 当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。 |
static File createTempFile(String prefix, String suffix) | 在默认临时文件目录中创建一个空文件,使用给定的前缀和后缀生成其名称。 |
static File createTempFile(String prefix, String suffix, File directory) | 在指定的目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。 |
boolean delete() | 删除由此抽象路径名表示的文件或目录。 |
void deleteOnExit() | 请求在虚拟机终止时删除由此抽象路径名表示的文件或目录。 |
boolean equals(Object obj) | 测试此抽象路径名与给定对象的相等性。 |
boolean exists() | 测试此抽象路径名表示的文件或目录是否存在。 |
File getAbsoluteFile() | 返回此抽象路径名的绝对形式。 |
String getAbsolutePath() | 返回此抽象路径名的绝对路径名字符串。 |
File getCanonicalFile() | 返回此抽象路径名的规范形式。 |
String getCanonicalPath() | 返回此抽象路径名的规范路径名字符串。 |
long getFreeSpace() | 返回分区未分配的字节数 named此抽象路径名。 |
String getName() | 返回由此抽象路径名表示的文件或目录的名称。 |
String getParent() | 返回此抽象路径名的父 null的路径名字符串,如果此路径名未命名为父目录,则返回null。 |
File getParentFile() | 返回此抽象路径名的父,或抽象路径名 null如果此路径名没有指定父目录。 |
String getPath() | 将此抽象路径名转换为路径名字符串。 |
long getTotalSpace() | 通过此抽象路径名返回分区 named的大小。 |
long getUsableSpace() | 返回上的分区提供给该虚拟机的字节数 named此抽象路径名。 |
int hashCode() | 计算此抽象路径名的哈希码。 |
boolean isAbsolute() | 测试这个抽象路径名是否是绝对的。 |
boolean isDirectory() | 测试此抽象路径名表示的文件是否为目录。 |
boolean isFile() | 测试此抽象路径名表示的文件是否为普通文件。 |
boolean isHidden() | 测试此抽象路径名命名的文件是否为隐藏文件。 |
long lastModified() | 返回此抽象路径名表示的文件上次修改的时间。 |
long length() | 返回由此抽象路径名表示的文件的长度。 |
String[] list() | 返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。 |
String[] list(FilenameFilter filter) | 返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录。 |
File[] listFiles() | 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。 |
File[] listFiles(FileFilter filter) | 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 |
File[] listFiles(FilenameFilter filter) | 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 |
static File[] listRoots() | 列出可用的文件系统根。 |
boolean mkdir() | 创建由此抽象路径名命名的目录。 |
boolean mkdirs() | 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。 |
boolean renameTo(File dest) | 重命名由此抽象路径名表示的文件。 |
boolean setExecutable(boolean executable) | 为此抽象路径名设置所有者的执行权限的便利方法。 |
boolean setExecutable(boolean executable, boolean ownerOnly) | 设置该抽象路径名的所有者或每个人的执行权限。 |
boolean setLastModified(long time) | 设置由此抽象路径名命名的文件或目录的最后修改时间。 |
boolean setReadable(boolean readable) | 一种方便的方法来设置所有者对此抽象路径名的读取权限。 |
boolean setReadable(boolean readable, boolean ownerOnly) | 设置此抽象路径名的所有者或每个人的读取权限。 |
boolean setReadOnly() | 标记由此抽象路径名命名的文件或目录,以便只允许读取操作。 |
boolean setWritable(boolean writable) | 一种方便的方法来设置所有者对此抽象路径名的写入权限。 |
boolean setWritable(boolean writable, boolean ownerOnly) | 设置此抽象路径名的所有者或每个人的写入权限。 |
Path toPath() | 返回从此抽象路径构造的java.nio.file.Path对象。 |
String toString() | 返回此抽象路径名的路径名字符串。 |
URI toURI() | 构造一个表示此抽象路径名的 file: URI。 |
URL toURL() | 已弃用 此方法不会自动转义URL中非法的字符。 建议在新的代码转换的抽象路径到URL通过先转换成URI,经由toURI方法,然后经由转换URI为URL URI.toURL方法。 |
事例
//打印目录下所有的文件信息包括子目录
static void printFile(Integer nums,String fileName) {
File fi=new File(fileName);
for(int i=0;i<nums;++i) {System.out.print(" -");}
System.out.println(">: "+fi.getName());
if(fi.isDirectory()) {
for(String i:fi.list()) {
printFile(nums+1,fileName+"/"+i);
}
}
return ;
}
//创建文件
static void createFile(String fileName) {
File fi=new File(fileName);
if(fi.exists()) {
System.out.println("file is exists");
}
else {
try {
fi.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//删除文件
static void deleteFile(String fileName) {
File fi=new File(fileName);
if(fi.exists()) {
System.out.println(fi.getName()+" has been deleted");
fi.delete();
}
else {
System.out.println("file is't extis");
}
}
//文件重命名
static void renameFile(String fileName,String newName) {
if(fileName.equals(newName)) {
System.out.println("Same file name");
return ;
}
File oldF=new File(fileName);
File newF=new File(newName);
if(oldF.exists()) {
System.out.println("this file is exists");
return ;
}
newF.renameTo(oldF);
return ;
}
//读取文件属性
static void printFileAttribute(String fileName) {
File fi=new File(fileName);
if(fi.exists()) {
System.out.println(fi.getName()+":");
System.out.println("文件是否为文件夹: "+fi.isDirectory());
System.out.println("文件大小: "+fi.length()+"byte");
System.out.println("文件是否隐藏: "+fi.isHidden());
System.out.println("文件是否可读: "+fi.canRead());
System.out.println("文件是否可写: "+fi.canWrite());
}
else {
System.out.println("file is't exits");
}
return ;
}
文件的读/写操作
文件读取有字节流和字符流。
字节流读
字节流读取的是(8 bit)的字节数据。字节流读取的常用类FileStream
其构造方法:
方法 | 说明 |
---|---|
FileInputStream(File file) | 通过打开与实际文件的连接创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。 |
FileInputStream(FileDescriptor fdObj) | 创建 FileInputStream通过使用文件描述符 fdObj ,其表示在文件系统中的现有连接到一个实际的文件。 |
FileInputStream(String name) | 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。 |
实例:
static void printFileContentByByte(String fileName) {
File file=new File(fileName);
if(!file.exists()||file.isDirectory()) {
System.out.println("file is error");
return ;
}
byte[] b=new byte[(int) file.length()];
try {
FileInputStream in=new FileInputStream(file);//=FileInputStream(fileName)
while(in.read(b)!=-1) {
System.out.println(new String(b));
}
in.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ;
}
字节流写
字节流的常用类都继承于OutputStream这个父类其功能呢也都是从这里延森出去的。读取常用的类是FileOutputStream其构造方法如下:
方法 | 说明 |
---|---|
FileOutputStream(File file) | 创建文件输出流以写入由指定的 File对象表示的文件。 |
FileOutputStream(File file, boolean append) | 创建文件输出流以写入由指定的 File对象表示的文件。 |
FileOutputStream(FileDescriptor fdObj) | 创建文件输出流以写入指定的文件描述符,表示与文件系统中实际文件的现有连接。 |
FileOutputStream(String name) | 创建文件输出流以指定的名称写入文件。 |
FileOutputStream(String name, boolean append) | 创建文件输出流以指定的名称写入文件。 |
实例:
static void writeFileByByte(String fileName,String data) {
File fout = new File(fileName);
FileOutputStream fos;
try {
fos = new FileOutputStream(fout,true);
OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
osw.write(data);
osw.flush();
osw.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
字符流读
从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。
可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途。 通常,由读取器做出的每个读取请求将引起对底层字符或字节流的相应读取请求。
常用类BufferedReader:
方法 | 描述 |
---|---|
BufferedReader(Reader in) | 创建使用默认大小的输入缓冲区的缓冲字符输入流。 |
BufferedReader(Reader in, int sz) | 创建使用指定大小的输入缓冲区的缓冲字符输入流。 |
实例:
static void printFileContentByBuf(String fileName) {
File file=new File(fileName);
if(!file.exists()||file.isDirectory()) {
System.out.println("file is error");
return ;
}
StringBuilder tStr=new StringBuilder();
try {
BufferedReader br=new BufferedReader(new FileReader(file));
String s=null;
while((s=br.readLine())!=null) {//没次读取一行
tStr.append(s+"\n");
}
br.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(tStr.toString());
return ;
}
字符流写
BufferedWrite建立缓冲区对数据缓冲在写入,从而实现字符,数组和行的高效阅读与写入。
其构造方法:
方法 | 描述 |
---|---|
BufferedWriter(Writer out) | 创建使用默认大小的输出缓冲区的缓冲字符输出流。 |
BufferedWriter(Writer out, int sz) | 创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区。 |
实例:
static void writeFileByBuf(String fileName,String data) {
File file=new File(fileName);
if(!file.exists()||file.isDirectory()) {
System.out.println("file is error");
return ;
}
try {
FileOutputStream os=new FileOutputStream(file,true);
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os,"UTF-8"));
bw.write(data);
bw.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
RandomAccessFile
该类的实例支持读取和写入随机访问文件。 随机访问文件的行为类似于存储在文件系统中的大量字节。 有一种游标,或索引到隐含的数组,称为文件指针 ; 输入操作读取从文件指针开始的字节,并使文件指针超过读取的字节。 如果在读/写模式下创建随机访问文件,则输出操作也可用; 输出操作从文件指针开始写入字节,并将文件指针提前到写入的字节。 写入隐式数组的当前端的输出操作会导致扩展数组。 文件指针可以通过读取getFilePointer方法和由设置seek方法。
在这个类中的所有读取例程通常都是如果在读取所需的字节数之前到达文件结尾,则抛出一个EOFException (这是一种IOException )。 如果任何字节由于除文件末尾之外的任何原因而无法读取,则抛出IOException以外的EOFException 。 特别地,如果流已经被关闭,则可以抛出IOException 。
构造方法:
方法 | 描述 |
---|---|
RandomAccessFile(File file, String mode) | 创建一个随机访问文件流从File参数指定的文件中读取,并可选地写入文件。 |
RandomAccessFile(String name, String mode) | 创建随机访问文件流,以从中指定名称的文件读取,并可选择写入文件。 |
实例:
static void RandomAccessTest(String fileName) {
File file = new File(fileName);
try {
RandomAccessFile str=new RandomAccessFile(file,"rw");
String data="hello world";
str.write(data.getBytes());
System.out.println("写入完成");
str.seek(0);//将文件偏移量指向头
while((data=str.readLine())!=null) {
System.out.println(data);
}
str.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ;
}
实力有限加在网上借阅其他大佬的想法暂时就理解这么多