博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IO流
阅读量:3960 次
发布时间:2019-05-24

本文共 8428 字,大约阅读时间需要 28 分钟。

目录

IO流

(1)File类

File类声明在java.io包下,File类的一个对象代表一个文件或者一个文件目录;

FIle类涉及到文件或者文件目录的创建、删除、重命名、修改时间、文件大小等方法,并且不涉及写入或者读取文件内容的操作,如果需要读取或写入文件内容,必须用IO流完成;

File类对象常作为参数传递到流的构造器中,指明读取和写入的终点;

File类实例

//构造器一:根据一个路径得到File对象//创建一个对象代表给定路径的文件或者文件目录File file1=new File("hello.txt");//传入的参数为相对路径File file2=new File("G:\\Java\\ThreadDemo\\02-CommonClass\\src\\org\\hac\\iotest\\hello.txt");//传入的参数为绝对路径//IDEA中,main方法进程下相对路径为项目目录;@Test的方法下相对路径为模块目录
//构造器二:根据一个目录和一个子文件/目录得到File对象public File(String parent, String child) {
//构造器参数中传入文件的父路径和子文件文件或者目录 }eg:File File=new File("D:\\Java","hello.txt");
//构造器三:根据一个父File对象和一个子文件/目录得到File对象public File(File parent, String child) {
}eg:File fileParent=new File("G:\\Java\\ThreadDemo\\02-CommonClass\\src\\org\\hac\\iotest");File file=new File(fileParent,"hello.txt");

文件路径

相对路径:相较于某个路径下指明的路径;

绝对路径:包括盘符在内的文件或者文件目录的路径;

分隔符:windows和Dos使用双" \ “;UNIX和URL使用” / ";

public static final String separator = "" + separatorChar;//File类中提供了一个常量,可以根据当前操作系统动态提供分隔符;eg:File file3=new File("D:"+File.separator+"hello.txt");

File类常用方法

序号 方法描述
1 public String getName() 返回由此抽象路径名表示的文件或目录的名称。
2 **public String getParent()**返回此抽象路径名的父路径名的路径名字符串,如果此路径名没有指定父目录,则返回 null
3 public File getParentFile() 返回此抽象路径名的父路径名的抽象路径名,如果此路径名没有指定父目录,则返回 null
4 public String getPath() 将此抽象路径名转换为一个路径名字符串。
5 public boolean isAbsolute() 测试此抽象路径名是否为绝对路径名。
6 public String getAbsolutePath() 返回抽象路径名的绝对路径名字符串。
7 public boolean canRead() 测试应用程序是否可以读取此抽象路径名表示的文件。
8 public boolean canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。
9 public boolean exists() 测试此抽象路径名表示的文件或目录是否存在。
10 public boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。
11 public boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。
12 public long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。
13 public long length() 返回由此抽象路径名表示的文件的长度。
14 public boolean createNewFile() throws IOException 当且仅当不存在具有此抽象路径名指定的名称的文件时,原子地创建由此抽象路径名指定的一个新的空文件。
15 public boolean delete() 删除此抽象路径名表示的文件或目录。
16 public void deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
17 public String[] list() 返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。
18 public String[] list(FilenameFilter filter) 返回由包含在目录中的文件和目录的名称所组成的字符串数组,这一目录是通过满足指定过滤器的抽象路径名来表示的。
19 public File[] listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件。
20 public File[] listFiles(FileFilter filter) 返回表示此抽象路径名所表示目录中的文件和目录的抽象路径名数组,这些路径名满足特定过滤器。
21 public boolean mkdir() 创建此抽象路径名指定的目录。
22 public boolean mkdirs() 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。
23 public boolean renameTo(File dest) 重新命名此抽象路径名表示的文件。
24 public boolean setLastModified(long time) 设置由此抽象路径名所指定的文件或目录的最后一次修改时间。
25 public boolean setReadOnly() 标记此抽象路径名指定的文件或目录,以便只可对其进行读操作。
26 public static File createTempFile(String prefix, String suffix, File directory) throws IOException 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。
27 public static File createTempFile(String prefix, String suffix) throws IOException 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
28 public int compareTo(File pathname) 按字母顺序比较两个抽象路径名。
29 public int compareTo(Object o) 按字母顺序比较抽象路径名与给定对象。
30 public boolean equals(Object obj) 测试此抽象路径名与给定对象是否相等。
31 public String toString() 返回此抽象路径名的路径名字符串。

(2)IO流

Java对数据的输入/输出操作以流的方式进行;

java.io包下提供了各种流的类和接口,用以获得不同种类的数据,并通过标准的方法输入或输出数据;

一个流可以理解为一个数据的序列。相对于Java开发工具,输入流表示从一个源读取数据,输出流表示向一个目标写数据;

输入:读取外部数据(从磁盘、光盘)到程序中;

输出:将程序数据输出到存储设备中;

流的分类

根据数据单位

  • 字节流:操作图片、视频
  • 字符流:操作文本数据

根据流动方向

  • 输入流
  • 输出流

根据角色不同

  • 字节流
  • 处理流
抽象基类 字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer

节点流(文件流):FileInputStream、FileOutputStream、FileReader、FileWriter

处理流(缓冲流):BufferedInputStream、BufferOutputStream、BufferReader、BufferWriter

img

IO流异常处理:try-catch-finally,读入的文件一定要存在,否则会报FileNotFoundException

节点流

文本文件

步骤

1.创建File类对象,指明要读入或者写出的文件;

2.创建FileReader或者FileWriter对象;

3.对象调用read()或write()方法;

4.输入输出流关闭close();

read()方法

序号 文件描述
1 public int read() throws IOException 读取单个字符,返回一个int型变量代表读取到的字符
2 public int read(char [] c, int offset, int len) 读取字符到c数组,返回读取到字符的个数
3 **public int read(char [] c)**读取字符到c数组,返回读取到字符的个数,若无字符读取返回-1
@Test    public void test1() throws IOException {
File file=new File("hello.txt"); FileReader fr=new FileReader(file); char[] cbuf=new char[50]; while((fr.read(cbuf))!=-1){
//将文件中的字符写入到数组中 String str=new String(cbuf); System.out.println(str); } fr.close();

write()方法

序号 方法描述
1 public void write(int c) throws IOException 写入单个字符c。
2 public void write(char [] c, int offset, int len) 写入字符数组中开始为offset长度为len的某一部分。
3 public void write(String s, int offset, int len) 写入字符串中开始为offset长度为len的某一部分。
4 **public void write(char [] c)**将字符数组写入到文件中
@Testpublic void test2() throws IOException {
File file=new File("hi.txt"); FileWriter fw=new FileWriter(file); String str="hi"; char[] cbuf=str.toCharArray(); fw.write(cbuf);//将字符数组中的字符输出到文件 fw.close();}

缓冲流

缓冲流是处理流之一,套在已有的节点流上使用,可以提升读写的速度;

步骤

1.创建File对象;

2.创建FileInputStream或者FileOutputStream对象;

3.创建BufferedInputStream或者BufferedOutoutStream对象,将FileInputStream或者FileOutputStream对象作为构造器参数;

4.调用read()或者write()方法;

5.关闭流:先关闭外层(缓冲流)再关闭内层;

@Testpublic void test3() throws IOException {
File file=new File("hello.txt"); FileInputStream fis=new FileInputStream(file); BufferedInputStream bis=new BufferedInputStream(fis); byte[] cbuf=new byte[50]; while((bis.read(cbuf)!=-1)){
//将文件中的字节读入到字节数组 String str=new String(cbuf); System.out.println(str); }}

转换流

转换流是处理流之一,提供了在字节流与字符流之间的转换;

Java提供了两个转换流

  • InputStreamReader:将InputStream转换为Reader
  • OutputStreamWriter:将Writer转换为OutputStream
public InputStreamReader(InputStream in)//构造器一public InputStreamReader(InputStream in, String charsetName)//构造器二,charsetName指明字符集,否则使用系统默认;

转换流常用于文本的编码和解码

解码:字节——》字符 InputStreamReader

编码:字符——》字节 OutputStreamWriter

@Test    public void test4() throws IOException {
File file=new File("hello.txt"); FileOutputStream fos=new FileOutputStream(file); OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8"); String str1="你好"; osw.write(str1.toCharArray()); osw.close(); fos.close(); FileInputStream is=new FileInputStream(file); InputStreamReader isr=new InputStreamReader(is,"UTF-8"); char[] cbuf=new char[50]; while ((isr.read(cbuf)!=-1)){
String str2=new String(cbuf); System.out.println(str2); } isr.close(); is.close(); }

标准输入输出流

标准输入流:System.in

标准输出流:System.out

in、out是System类中的两个属性

public final static InputStream in = null;public final static PrintStream out = null;

System类中的setIn()方法和setOut()方法可以重新指定标准输入输出流;

打印流

只有输出流,提供一系列重载的print()和println()方法;

  • PrintWriter
  • PrintOutputStream

对象流

用于存储和读取基本数据类型或对象,可以把Java中的对象写入到数据源中,也能把对象从数据源中还原;

  • ObjectInputStream
  • ObjectOutputStream

序列化:用ObjectOutputStream保存;

反序列化:用ObjectInputStream读取;

为了是类的对象能够进行序列化和反序列化,需要实现接口Serializable、Extemalizable之一;

对象序列化机制:允许把内存中的Java对象转换成与平台无关的二进制流,从而可以把这种二进制流持久地保存在磁盘上,或者通过网络将这种二进制流传输到另外的网络节点,当程序获得了这种二进制流,就可以恢复成原来的Java对象;

自定义类实现可序列化的步骤

1.实现接口Serializable、Extemalizable之一;

2.提供一个全局常量:serialVersionUID;(必须)

public static final long serialVersionUID=123456789L;//serialVersionUID用来表明类的不同版本间的兼容性,目的是对序列化对象进行版本控制,有关个版本反序列化时是否兼容//如果没有显示定义,则会自动生成,当实例变量修改的时候,自动生成的UID可能发生改变,无法还原;

3.除了类需要实现接口,还要保证类中的属性可序列化

数据流

处理流之一,用于读取和写入基本数据类型;

DataInputStream

DataOutputStream

@Testpublic void test6() throws IOException {
File file=new File("hello.txt"); FileOutputStream fos=new FileOutputStream(file); DataOutputStream dos=new DataOutputStream(fos); dos.writeInt(666); dos.close(); fos.close(); FileInputStream fis=new FileInputStream(file); DataInputStream dis=new DataInputStream(fis); int a=dis.readInt(); System.out.println(a); dis.close(); fis.close();}//数据流写入的对象要用数据流来读取,读取时顺序与写入要一致;

RandomAccessFile

实现DataInput、DataOutput接口,可以作为输入输出流;

构造器

public RandomAccessFile(String name, String mode)public RandomAccessFile(File file, String mode)//mode:指定访问模式r:以只读方式打开rw:打开以便读取和写入(不存在文件则创建)rwd:打开以便读取和写入,同步文件内容更新rws:打开以便读取和写入,同步文件内容和元数据的更新

RandomAccessFile作为输出流时会对原有文件进行覆盖;

RandomAccessFile类支持随机访问方式,程序可以直接调皮到文件的任意地方读写,可以访问文件的部分内容,可以向已有文件后追加内容;

RandomAccessFile对象包含一个记录指针,用来标示当前读写的位置;

RandomAccessFile对象可以自由移动记录指针;

  • long getFilePointer():获得文件记录指针的当前位置;
  • void seek(long pos):将文件记录指针定位到pos位置;

Path、Paths、Files

NIO是一套全新的IO API,支持面向缓冲区(IO面向流)

NIO以更高效的方式进行文件的读写操作;

API中提供两套NIO(JDK7中为NIO2)

  • 针对标准输入输出NIO
  • 网络编程NIO

Path:接口,可看作File类的升级;

Paths:工具类,里面定义了两个返回Path对象的静态方法

public static Path get(String first, String... more)//用于将多个字符串连成路径public static Path get(URI uri) //返回指定url对应的path路径

Files:工具类,定义了大量静态方法来操作文件或目录;

转载地址:http://trqzi.baihongyu.com/

你可能感兴趣的文章
杭电ACM——天上掉馅饼(DP)
查看>>
杭电ACM——1086,You can Solve a Geometry Problem too(思维)
查看>>
杭电ACM——2057,A + B Again(思维)
查看>>
codeforces——1097B,Petr and a Combination Lock(搜索)
查看>>
杭电ACM——2069,Coin Change(DP)
查看>>
杭电ACM——2110,Crisis of HDU(母函数)
查看>>
杭电AM——2152,Fruit(母函数)
查看>>
杭电ACM——2566,统计硬币(DP)
查看>>
堆栈(数据结构)
查看>>
队列(数据结构)
查看>>
Mule ESB-Basic Studio Tutorial
查看>>
Mule ESB-Content-Based Routing Tutorial(1)
查看>>
Mule ESB-Content-Based Routing Tutorial(2)
查看>>
Mule ESB-Content-Based Routing Tutorial(3)
查看>>
年末项目经验总结
查看>>
做事情要放下面子,拿起责任
查看>>
敏捷开发实践(1)-故事工作量估算导致的问题
查看>>
记一次解决jenkins持续构建,自动部署的问题
查看>>
敏捷开发实践(2)-要不要文档?
查看>>
敏捷开发实践(3)-我们为什么需要持续集成?
查看>>