要求:找出html文件(grassland.htm)中的所有标签名并显示出来。可以重复显示标签名,可以显示取错的标签名,也不用管标签出现的地方,例如,会取到注释中的标签。要求使用str.charAt(index)依次取出字符(char类型)进行判断。char类型采用“==”进行比较,例如:ch==' <'。 (不要使用正则表达式)
基本实现思路:
利用文件输入流读取每个字节,判断是否存在"<",如果存在,则把包括'<'的后面的字符串都append到一个stringBuilder中,直到遇到'>'为止。
这里利用的几个特点:
FileInputStream(Output)是Inputstream(Outputstream)的子类,只提供了对字节或字节数组的读取方法。由于汉子是2字节编码,如果使用字节流,读取不好可能会出现乱码现象。
Java中的字符都是Unicode编码,双字节。InputStream是处理字节的,处理字符文本不是很方便。Java提供了专门一套单独的类Reader,处理字符串时简化了编程,层次结构如下:
所以我们在操作的时候,如下:
FileInputStream f1= new FileInputStream(fileName); InputStreamReader in = new InputStreamReader(f1, "UTF-8"); 用InputStreamReader转换为utf-8编码
频繁操作字符串应该使用StringBuilder。StringBulider用于单线程环境。 StringBuffer对方法有同步机制, 可以用于多线程环境。 对于单线程编程, StringBulider比StringBuffer更有效率。 (如今这里是单线程编程)
所用代码如下:
import java.io.*; class ShowTags{ public static void main(String[] args)throws IOException{ String content = readFile(".\\grassland.htm"); System.out.println(content); } static String readFile(String fileName) throws IOException{ StringBuilder sb = new StringBuilder(""); int c1; FileInputStream f1= new FileInputStream(fileName); InputStreamReader in = new InputStreamReader(f1, "UTF-8"); //why UTF-8 int flag = 0; while ((c1 = in.read()) != -1) { //read() reads next byte, String out; char temp = (char) c1; if(flag == 1 && (temp == '>' || temp == ' ')) { flag = 0; sb.append('\n'); } if(flag == 1) { sb.append(temp); } if(temp == '<' ) { flag = 1; } } return sb.toString(); } }