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个构造函数:
File(String pathname):通过指定文件名,比如File file = new File("d:/1.txt");File(String parent, String child):通过父路径和子路径创建,比如File f = new File("D:/bamn", "21.txt");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)