十文件I/O

Posted hasz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十文件I/O相关的知识,希望对你有一定的参考价值。

1、流概述

流是一组有序的数据序列,可分为输入流和输出流两种。I/O流提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地。不仅可以使用在文件上,也可以用于键盘、鼠标、显示器等。

输入流
文件--->数据流--->目的地

输出流
源-->数据流--->文件

2、流概述

Java定义了许多类专门复杂各种方式的输入/输出。这些类都放在java.io包中。其中,输入流类都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类;而所有输出流都是OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类。

2.1 输入流

InputStream类是字节输入流的抽象类,是所有字节输入流的父类。InputStream类的具体层次结构。

  • InputStream
    • AudioInputStream
    • ByteArrayInputStream
    • StringBufferInputStream
    • FileInputStream
    • FilterInputStream
      • BufferedInputStream
      • DataInputStream
      • PushbackInputStream
    • InputStream
    • ObjectInputStream
    • SequenceInputStream
    • PipedInputStream

该类中所有方法遇到错误时都会触发IOException异常。

  • [x] read()方法:从输入流中读取数据的下一个字节。返回0~255范围内的int字节值。如果流已经到达末尾,而没有可用字节,则返回-1
  • [x] read(byte[] b):从输入流中读入一定长度的字节,并以整数的形式返回字节数。
  • [x] close():关闭此输入流并释放与该流关联的所有系统资源。

Java中的字符时Unicode编码,是双字节的。InputStream是用来处理字节的,并不适合处理字符文本。Java为字符文本的输入提供了一套单独的类Reader。

  • Reader
    • CharArrayReader
    • BufferedReader
      • LineNumberReader
    • FilterReader
      • PushBackReader
    • InputStreamReader
      • FileReader
    • PipedReader
    • StringReader

2.2 输出流

OutputStream类是字节输出流的抽象类。

  • OutputStream
    • ByteArrayOutputStream
    • FileOutputStream
    • FilterOutputStream
      • BufferedOutputStream
      • DataOutputStream
      • PushbackOutputStream
    • OutputStream
    • ObjectOutputStream
    • SequenceOutputStream
    • PipedOutputStream

OutputStream类中的所有方法均返回void,遇到错误时都会触发IOException异常。

  • [x] write(int b) 将指定的字节写入此输出流
  • [x] write(byte[] b):将b个字节从指定的byte数组写入此输出流
  • [x] write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入此输出流
  • [x] flush():彻底完成输出并清空缓存区
  • [x] close():关闭输出流

Writer类是字符输出流的抽象类,所有字符输出类的实现都是它的子类。

  • Writer
    • CharArrayWriter
    • BufferedWriter
      • LineNumberWriter
    • FilterWriter
      • PushBackWriter
    • OutputStreamWriter
      • FileWriter
    • PipedWriter
    • PrintWriter
    • StringWriter

3、File类

File类是java.io包中唯一代表磁盘文件本身的对象。File类定义了一些与平台物馆的方法来操作文件,可以实现创建、删除、重命名文件等操作。File类的对象主要用来获取文件本身的一些信息,如所在目录,文件的长度,以及文件读写权限等。

3.1 文件的创建与删除

使用File类创建一个文件对象,通常使用以下3种构造方法来创建文件对象。

// 1.File(String pathName)
New File(String pathName)
File file = new File("D:\a.txt");

// 2.File(String parent, String child)
// 该构造方法根据定义的父路径和子路径字符串创建一个新的File对象。
new File(String parent, String child);
String parent = "D:/doc";
String child = "letter.txt";
// 3.File(File f,String child)
// 该构造方法根据parent抽象路径名和子路径字符串创建一个新的File实例
String f = "D:/doc/";
String child = "letter.txt";
public static class {
	public static void main(String[] args) {
		File file = new File("test.txt");
		if(file.exits()) {
			file.delete();
		}else{
			try{
				file.createNewFile();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}
}

4、 文件输出/输出流

4.1 FileInputStream与FileOutputStream类

两个类都是用来操作磁盘文件的,该类继承自InputStream,提供了基本的文件写入能力。

FileInputStream类常用构造方法

  1. FileInputStream(String name);
  2. FileInputStream(File file); 该方法允许把文件连接输入流之前对文件做进一步操作。
public static class {
	public static void main(String[] args) {
		File file = new File("test.txt");
		try{
			// 创建FileOutputStream对象
			FileOutputStream out = new FileOutputStream(File);
			byte byt[] = "两个类都是用来操作磁盘文件的,该类继承自InputStream,提供了基本的文件写入能力。".getBytes();
			out.write(byt);
			out.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		try{
			FileInputStream in = new FileInputStream(file);
			byte byt[] = new byte[1024];
			int len = in.read(byt);
			// 将文件信息输出,但是这个输出new String有问题
			System.out.println(new String(byt,0,len));
			in.close()
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

4.2 FileReader和FileWriter类

汉字采取上面的字节流读入会产生乱码的问题,所以使用字符流的FileReader和FileWriter类,即可避免该现象。

5.带缓存的输入/输出流

缓存是I/O的一种性能优化,缓存流为I/O流增加了内存缓冲区,有了缓存,使得在流上执行skip(),mark(),和reset()方法成为可能。

5.1 BufferedInputStream和BufferedOutputStream类

BufferedInputStream构造方法

  • [x] BufferedInputStream(InputStream in)
  • [x] BufferedInputStream(InputStream in, int size)

第一种形式的构造方法创建了一个带有32字节的缓存流;第二个按照指定的大小来创建最优的缓存区大小。

BufferedOutputStream构造方法

  • [x] BufferedOutputStream(OutputStream out)
  • [x] BufferedOutputStream(OutputStream out,int size)

5.2 BufferedReader和BufferedWriter

以上分别继承了Reader和Writer类
BufferedReader类的常用方法

方法 描述
read() 读取单个字符
readLine() 读取一个文本行,并将其返回为一个字符串。若无数据,则返回null。

BufferedWriter常用方法

方法 描述
write(String s,int off,int len) 写入字符串的某一部分
flush() 刷新该流的缓存
newLine() 写入一个行分割符

在使用BufferedWriter类的Write()方法时,数据并没有立刻被写入值输出流,而是首先进入缓存去中。如果想立刻将缓存区中的数据写入输出流,一定要调用flush()方法。

字符数据--> BufferedWriter--> OutputStreamWriter-->OutputStream --> 文件

package simple.java;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import sun.net.www.content.text.plain;

public class FileTest {
	public static void main(String[] args) throws IOException {
		String[] array = {"取等","学家尽快","断努力"};
		File f = new File("C:\pox.txt");
		try{
			FileWriter fileWriter = new FileWriter(f);
			BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
			for (int i=0;i<array.length;i++){
				bufferedWriter.write(array[i]);
				bufferedWriter.newLine();
			}
			bufferedWriter.close();
			fileWriter.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		try{
			FileReader fileReader = new FileReader(f);
			BufferedReader bufferedReader = new BufferedReader(fileReader);
			String s = null;
			int i = 0;
			// s=bufferedReader.readLine()很重要,否则会显示不全,还不知道为啥。
			while((s=bufferedReader.readLine())!= null) {
				i++;
				System.out.println("第"+i+"行:"+s);
			}
			bufferedReader.close();
			fileReader.close();
		}






以上是关于十文件I/O的主要内容,如果未能解决你的问题,请参考以下文章

2017-2018-1 20155331 《信息安全系统设计基础》第十四周学习总结

20155304 《信息安全系统设计基础》第十三周学习总结

2017-2018-1 20155201 《信息安全系统设计基础》第十四周学习总结

20155317 《信息安全系统设计基础》第十三周周学习总结

APUE---标准I/O库

十MapReduce--调优