1.1 File类
存储在程序中的数据是暂时的,当程序终止时它们就会丢失,为了能永久的报讯程序中创建的数据,需要将它们存储到磁盘或其他永久存储设备的文件中,File类就是程序与文件互通的工具。
在文件系统中,每个文件都存放在一个目录下。绝对文件名是从驱动器(D/E/F盘)开始的路径名,依赖于机器(UNEX平台上,绝对文件名可能会是/home/liang/welcome.java),相对文件名是相对于当前工作目录的例如:Welcome.java是一个相对路径名,它的绝对路径就是当前工作空间路径:d/java/+相对路径Welcome.java
File类的一些的方法和说明如下所示:
File类是文件名(字符串)及其目录路径的一个包装类,例如在windows中new File("c:\\book") 和语句
new File("c:\\book\\test.dat")都表示为对应目录创建一个File对象,具体是File还是只是一个目录,用File(如上)中的方法判断即可
注意:构建一个File实例并不会在机器上创建一个文件(可以用exist来判断该文件是否存在)。再程序中使用绝对文件名,例如盘符表示,则该程序只能运行在windows环境下,因为UNEX环境下的路径不是这样表示的。单斜杠‘/’是Java的目录分隔符,使用相对路径+Java分隔符,则此种目录在各种平台上都能使用。
1.2 文件的输入和输出——字符串
要点:使用Scanner类从文件中读取文件数据,使用PrintWriter类向文本文件中写入数据
File对象封装了文件或路径的属性,但它既不包括创建文件的方法,也不包括文件的I/O操作,所以需要使用恰当的JavaI/O类创建对象,这些对象有对应的读写文件的方法。
1.2.1 使用PrintWriter写数据
public class WriteData {
public static void main(String[] args) throws FileNotFoundException {//抛出文件没有找到的异常
File file = new File("d:/data/try.txt"); //创建文件对象
PrintWriter output = new PrintWriter(file); //创建写入对象再与文件关联
output.print("1000");//进行输出
output.println("爱");
output.println("你");
output.close();//最后关闭写入文件流,正确的调用此方法,文件才能被保存
}
}
运行结果:
1.2.2 使用try-with-resources自动关闭资源
程序员经常会忘记关闭文件,可以使用
try(生命和创建资源){使用资源来处理文件;}
资源必须是AutoCloseable子类型比如PrintWriter
public class WriteData {
public static void main(String[] args) throws FileNotFoundException {
File file = new File("d:/data/try.txt"); //创建文件对象
try (
PrintWriter output = new PrintWriter(file); //创建写入对象再与文件关联
){
output.print("1000");//进行输出
output.println("爱");
output.println("你");
}
}
}
1.2.3 使用Scanner读取数据
Scanner类用来从控制台读取字符串和基本类型值
public static void main(String[] args) throws FileNotFoundException {
File file = new File("d:/data/try.txt"); //创建文件对象
Scanner input = new Scanner(file); //创建写入对象再与文件关联
while(input.hasNext()) {
String number = input.next();
System.out.println(number);
}
}
结果:
input.next();是以空格键作为区分的。
1.2 Web爬虫(File升级)
要点:如同从电脑中的文件读取数据一样,也可以从Web上的文件中读取数据。
1.2.1 从Web上读取数据
要点:如同从电脑中的文件中读取数据一样,也可以从Web上的文件中读取数据
把Web的页面信息当做文件(Web上的文件信息),网页的URL当做目录(例如,www.google.com/index.html是位于谷歌Web服务器上的文件index.html的URL,浏览器会把该文件渲染成图形),那么也可以用程序来获得网页中的数据
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;
public class ReadFileFromURL {
public static void main(String[] args) {
System.out.println("请输入一个网址:");
String URLString = new Scanner(System.in).next();
try {
URL url = new URL(URLString);
int count = 0;
Scanner input = new Scanner(url.openStream());
while(input.hasNext()) {
String line = input.nextLine();
count = count + line.length();
}
System.out.println("此网页一共有"+count+"个字");
}catch(MalformedURLException ex) {
System.out.println("URL表示错误");
}catch (IOException e) {
System.out.println("没有此文件");
e.printStackTrace();
}
}
}
运行结果:
1.2.2 Web爬虫
概要:开发一个程序,可以沿着超链接来遍历Web
为简化起见,我们的程序沿着http://开始的超链接,为什么叫沿着呢,因为网页里面也含有URL,那么程序还会顺次遍历网页里面的网页,过程一直下去,对Web进行遍历。
程序沿着URL来遍历Web,为了保证每个URL只被遍历一次,程序包含两个网址列表,一个列表保存将被遍历的网址,另一个列表保存已经遍历的网址,程序的算法如下:(优化方法就是深度、广度等的算法改进)
将起始URL添加到名为ListOfPendingURL的列表中;
当ListOfPendingURL不为空并且listOfTraversedURLs的长度不大于100时{
从ListOfPendingURL移除一个URL;
如果该URL不在listOfTraversedURLs中{
将其添加到listOfTraversedURLs中;
显示该URL;
读取该URL的页面,并且对该页面中包含的每个URL进行如下操作{
如果不在listOfTraversedURLs中,则将其添加到listOfTraversedURLs中;
}
}
}