IO

105-理解流和输入输出流

流是一组有序的数据序列,分为输入流和输出流。I/O即Input和Output。流类似提供一条管道,可以把字节序列送到目的地。IO流可以传输文件到磁盘、内存、鼠标、显示器窗体等,不仅仅是磁盘。

流类似水管用来传输水,这里的流传输的是字节。水的一端是自来水厂的水池,一端是我们的水桶。现在IO的一端是介质,一端就是我们的程序。

  • 如果从介质中读取数据到程序,则叫输入流
  • 如果从程序到介质,则是输出流

所谓输入输出是以程序做主角的。

输入输出流封装在java.io中。所有的输入流都是从InputStream(字节输入流)抽象类或者Reader(字符输入流)抽象类继承的;所有输出流都是OutputStream(字节输出流)或Writer(字符输出流)的子类。


106-输入流InputStream

InputStream是字节输入流,是所有字节输入类的父类。该类以及它的子类如果发生异常则会抛出IOException异常。


107-字符输入流Reader

Java中的字符是unicode编码,是双字节的。InputStream是用来处理字节的,在处理字符文本的时候不是很方便。Java为字符文本提供了一个专门的单独类Reader,它并不是InputStream的替换者,是为了更方便地处理字符串输入而已。Reader是抽象类。


108-字节输出流OutputStream

OutputStream用来输出字节,是所有字节输出流的基类抽象类。

字节是byte,字符是char。


109-字符输出流Writer

Writer是字符输出流的抽象类。


110-File类

File类是IO包中唯一代表磁盘文件本身的对象。它定义了一些与平台无关的方法来抽象文件,可以通过调用它的方法来实现创建文件、删除文件、重命名文件等。File类的对象主要用来获取文件本身的一些信息,比如所在目录、文件长度、文件读写权限。通常用在上传和下载的功能中。

文件的创建和删除

可以使用File类创建一个文件对象,有3个构造函数:

  1. File(String pathname):通过指定文件名,比如 File file = new File("d:/1.txt");
  2. File(String parent, String child):通过父路径和子路径创建,比如 File f = new File("D:/bamn", "21.txt");
  3. File(File f, String child):通过父路径对象和子路径字符串
File f = new File("G:\\JAVA\\01.txt");
File f1 = new File("G:\\JAVA\\", "01.txt");
//f1.deleteOnExit();
if (!f1.exists()) {
	f1.createNewFile(); //创建文件
} else {
	f1.delete(); //删除文件
}Code language: JavaScript (javascript)

111-File类获取文件信息

File类提供很多方法来获取文件本身的信息。

public static void main(String[] args) throws IOException {
	File f = new File("G:\\JAVA\\01.txt");
	File f1 = new File("G:\\JAVA\\", "01.txt");
	if (!f1.exists()) {
		f1.createNewFile();
	} else {
		f1.delete();
	}
	Print(f1.getAbsolutePath());
	Print(f1.getName());
	Print(f1.getParent());
	Print(f1.getPath());
	Print(f1.isDirectory());
	Print(f1.isFile());
	Print(f1.lastModified());
}

public static void Print(Object x) {
	System.out.println(x);
}Code language: PHP (php)

112-练习-重命名文件

使用renameTo把文件重命名。

public static void main(String[] args) throws IOException {
	File f = new File("G:\\JAVA\\02.txt");
	f.delete(); //退出程序的时候 删除

	File f1 = new File("G:\\JAVA\\", "01.txt");
	if (!f1.exists()) {
		f1.createNewFile();
		Print("创建文件01.txt");
	}
	f1.renameTo(f); //把01改成了02
}

public static void Print(Object x) {
	System.out.println(x);
}Code language: JavaScript (javascript)

113-练一练-移动文件

使用renameTo还可以移动文件,如果不同文件夹则表示移动,如果同一个文件夹则是改名。

public static void main(String[] args) throws IOException {
	File f = new File("G:\\JAVA\\bamn\\01.txt");
	f.delete();

	File f1 = new File("G:\\JAVA\\", "01.txt");
	if (!f1.exists()) {
		f1.createNewFile();
		Print("创建文件01.txt");
	}
	f1.renameTo(f); //如果不同文件夹 则表示移动 如果同一个文件夹则是改名
}

public static void Print(Object x) {
	System.out.println(x);
}Code language: JavaScript (javascript)

114-输入输出流的实现类FileInputStream和FileOutputStream

FileInputStream是用来进行操作磁盘文件的。它的构造函数:

  • FileInputStream(String name)
  • FileInputStream(File file)
//读取文件里面的文本内容到程序中
File f = new File("G:\\JAVA\\bamn\\01.txt");
FileInputStream fs = new FileInputStream(f);
byte bt[] = new byte[1024]; //每次读1kb
int len = fs.read(bt);
//读取的时候如果一次全读 可能会消耗很大的内存 导致操作系统卡顿
Print(new String(bt));

FileOutputStream fo = new FileOutputStream("G:\\JAVA\\bamn\\02.txt");
fo.write("www.FoxDevelop.com  FoxDevelop.com网校".getBytes());
//关闭管道
fs.close();
fo.close();Code language: JavaScript (javascript)

115-FileReader类和FileWriter类

这两个是字符输入输出流的实现类。FileReader流按顺序读取文件,只要不关闭它,每次调用read()方法就可以按顺序地读取源中其余内容,直到源的末尾或流被关闭。

FileReader fr = new FileReader("G:\\JAVA\\bamn\\02.txt");
while (fr.ready()) {
	int res = fr.read();
	if (res != -1) {
		Print((char) res);
	}
}Code language: PHP (php)
FileWriter fw = new FileWriter("G:\\JAVA\\bamn\\02.txt");
fw.write("www.baidu.com");
fw.write("\r\n");
fw.write("www.google.com");
fw.flush(); //调用flush的时候才会把数据写入
fw.close();Code language: JavaScript (javascript)

116-带缓存的输入输出流

缓存可以说是IO的一种性能优化,缓存流为IO流增加内存缓存区。有了缓存区,使得在流上执行skip、mark、reset方法成为可能。

BufferedInputStream和BufferedOutputStream类:

BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in, int size)

第一个默认使用32个字节长度作为缓存,第二个是指定大小。

File f = new File("G:\\JAVA\\bamn\\01.txt");
FileInputStream fs = new FileInputStream(f);
BufferedInputStream bs = new BufferedInputStream(fs);
byte bt[] = new byte[1024];
int len = bs.read(bt);
Print(new String(bt));Code language: JavaScript (javascript)

BufferedOutputStream输出缓存流带有一个flush方法,可以把缓存区中的数据强制输出完。当调用close方法时也会把缓冲区的信息写入到文件中。

FileOutputStream fo = new FileOutputStream("G:\\JAVA\\bamn\\02.txt");
BufferedOutputStream bo = new BufferedOutputStream(fo);
bo.write("www.FoxDevelop.com  FoxDevelop.com网校".getBytes());
bo.close();
fo.close();Code language: JavaScript (javascript)

117-BufferedReader类和BufferedWriter类

带有缓存的Reader和Writer。BufferedReader提供的常用方法可以一行一行地读文本。

FileReader fr = new FileReader("G:\\JAVA\\bamn\\02.txt");
BufferedReader br = new BufferedReader(fr);
while (br.ready()) {
	Print(br.readLine());
}Code language: PHP (php)
FileWriter fw = new FileWriter("G:\\JAVA\\bamn\\02.txt");
BufferedWriter bw = new BufferedWriter(fw);
bw.write("www.baidu.com1111111");
bw.write("\r\n");
bw.write("www.google.com1111");
bw.flush();
bw.close();
fw.close();Code language: JavaScript (javascript)
Previous:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注