1.1 File类

    存储在程序中的数据是暂时的,当程序终止时它们就会丢失,为了能永久的报讯程序中创建的数据,需要将它们存储到磁盘或其他永久存储设备的文件中,File类就是程序与文件互通的工具。

    在文件系统中,每个文件都存放在一个目录下。绝对文件名是从驱动器(D/E/F盘)开始的路径名,依赖于机器(UNEX平台上,绝对文件名可能会是/home/liang/welcome.java),相对文件名是相对于当前工作目录的例如:Welcome.java是一个相对路径名,它的绝对路径就是当前工作空间路径:d/java/+相对路径Welcome.java

    File类的一些的方法和说明如下所示:

java 文件名长度 java文件名的叙述_读取数据

     

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();//最后关闭写入文件流,正确的调用此方法,文件才能被保存
	}
}

运行结果:

java 文件名长度 java文件名的叙述_读取数据_02

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);
			}
	}

结果:

java 文件名长度 java文件名的叙述_读取数据_03

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();
		}
	}

}

运行结果:

java 文件名长度 java文件名的叙述_java_04

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中;
        }
    }
}