输入输出流
想要了解更详细的输入输出流知识点可以看往期博客
Java File类/文件字节流/图形和图像(20.5.12)
Java文件字符流/缓冲流/使用文件对话/动画和视频20.5.13
等等…
下面只是作简单的复习带过
相关知识点
FileReader类
是Read
的子类,该类创建的对象称为文件字符输入流
。文件字符输入流按字符读取文件中的数据。FileReadr流顺序地读取文件,只要不关闭流,每次调用读取方法时就顺序地读取文件中其余的内容,直到文件的未尾或流被关闭。
FileWriter类
是Witer
的子类,该类创建的对象称为文件字符输出流
。字符输出流接字符将数据写入文件中。FileWriter流顺序地写文件,只要不关闭流,每次调用写入方法就顺序地向文件写入内容,直到流被关闭。
BufferedReader类
创建的对象称为缓冲输入流
,该输入流的指向必须是一个Reader流,称为BuferedReader流的底层流
,底层流负责将数据读入缓冲区,BufferedReader流的源就是这个缓冲区,缓冲输入流再从缓冲区中读取数据。
Buffered Writer类创建的对象称为缓冲输出流,可将BufferedWriter流和FileWriter流连接在一起,然后使用BufferedWriter流将数据写到目的地,FileWriter流称为Buffered Writer的底层流,BufferedWriter流将数据写入缓冲区,底层流负责将数据写到最
终的目的地。
BufferedReader对象调用readLine()
方法可读取文件的一行。BufferedWriter对象调用newLine()方法
可向文件写入回行。
小例子
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.StringTokenizer;
public class Example_1 {
public static void main(String[] args) {
File file = new File("C:\\Users\\Administrator\\Desktop", "成绩单.txt");
try {
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String string = null;
StringBuffer stringBuffer = null;
while ((string = bufferedReader.readLine()) != null) {
String score = fenxi(string);
System.out.println(string + "总成绩为:" + score);
}
fileReader.close();
bufferedReader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static String fenxi(String string) {
String regex = "[^1234567890.]";
String s = string.replaceAll(regex, "#");
StringTokenizer stringTokenizer = new StringTokenizer(s, "#");
int score = 0;
while (stringTokenizer.hasMoreTokens()) {
int i = Integer.parseInt(stringTokenizer.nextToken());
score += i;
}
return String.valueOf(score);
}
}
相关知识点2
可以使用Scanner类
和正则表达式
来解析文件,例如,要解析出文件中的特殊单词、数字等信息。使用Scanner类和正则表达式来解析文件的特点是以时间换取空间
,即解析的速度相对较慢,但节省内存。例如,解析hello.txt文件的步骤如下:
1.创建文件。File file s new File(“hello.java”);
2.创建指向文件的Scanner对象。Scanner sc = new Scanner(file);
3.Scanner对象设置分隔标记。sc.useDelimiter(正则表达式);
Scanner对象将正则表达式
作为分隔标记来解析文件。
java.util包中的Vector类负责创建一个向量对象。如果你已经学会使用数组,那企可以很容易学会使用向量。当创建一个向量时不用像数组那样必须给出数组的大小。向量创建后,例如“Vetora-new Vector();”,a可以使用add(String o)把String对象添加到向量的末尾,向量的大小会自动增加。向量a可以使用elementAt(int index)
获取指定索引处的向量的元素(索引初始位置是0);a可以使用方法size()
获取向量所含有的元素的个数。如果Scanner对象不使用useDelimiter
设置使用怎样的正则表达式
做分隔标记,那么Scanner对象使用空格作为分隔标记。
相关知识点3
Console流可以读取用户在命令行输入的密码,而且用户在命令行输人的密码不会显示在命令行中。首先使用System类调用console()
方法返回一个Console流:Console cons = System.console();然后,Console流调用readPassword()
方法读取用户从键盘输入的密码,并将密码以一个char数组返回:char[ ] passwd = cons.readPassword()
;.
编译程序基本原理
编译程序的功能就是用某种高级语言书写的源程序翻译成与之等价的低级语言的目标程序
编译程序一般可划分为前后衔接的六个阶段 词法分析
/语法分析
/语义分析
/中间代码生成
/代码优化
和目标代码生成
词法分析阶段的主要任务
词法分析阶段是编译过程的第一个阶段
。词法分析的任务是:从左到右一个字符一个字符地输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词符号(简称单词或符号)。单词是程序设计语言的基本语法符号,例如,保留字(begin、end、if、for和while等)、标识符、常数、算符及界符(标点符号和左右括号等)。在词法分析这一阶段的工作中,所依循的是语言的构词规则。
语法分析阶段的主要任务
语法分析的任务是:在词法分析的基础上,根据语言的语法规则(文法规则)
,把单词符号串分解成各类语法单位,例如,“短语”“子句”“句子”(“语句”)“程序段”和“程序”。通过语法分解,确定整个输入串是否构成一个语法上正确的“程序”。在语法分析这一阶段的工作中,所依循的是语言的语法规则。
语义分析阶段的主要任务
语义分析阶段主要检查源程序是否包含语义错误
,并收集类型信息供后面的代码生成阶段使用,只有语法和语义都正确的源程序才能被翻译成正确的目标代码。语义分析的一个主要工作是进行类型分析和检查。程序语言中的一个数据类型一般包含两个方面的内容类型的载体及其上的运算
。
中间代码生成阶段的主要任务
中间代码产生的任务是根据语义分析的输出生成中间代码。中间代码是一种简单且含义明确的记号系统:中间代码设计原则有调点:一是容易生成:二是容易将它翻译成目标代码。
代码优化阶段的主要任务
代码优化的任务是:对前阶段产生的中间代码进行加工变换
,以期在最后阶段能产生出更为高效(常时间和省空间)的目标码
:优化的主要方面有:公共子表达式的提取、循环优化和算符归约等。在代码优化这一阶段的工作中,所依循的原则是程序的等价变换规则。
目标代码生成阶段的主要任务
目标代码生成的任务是:把中间代码(或者经优化处理之后)变换成特定机器上的绝对指令代码、可重新定位的指令代码或者汇编指令代码。这一阶段实现了最后的翻译,它的工作有赖于硬件系统结构和机器指令含义。这一阶段的工作也是最复杂的
,涉及计算机硬件系统功能部件的运用,机器指令的选择,各种数据类型变量的存储空间分配,以及寄存器和后缓寄存器的调度等。
在编译过程中,汇编源程序的各种信息被保留在各种不同的表格里,编译各阶段的工作都涉及构造、查找,或者更新有关的表格。因此,编译程序中必须含有一组管理各种表格的程序。
如果汇编源程序有错误,编译程序应该设法发现错误,把有关信息报告给用户。这部分工作是由专门的一组出错处理程序完成的,它与编译各阶段都有联系。因此,编译程序中必须含有一组出错处理程序。
CET4P217
- commute
- petty
- skyscraper
- brochure
- dew
- wallet
- splash
- mainstream
- garment
- warehouse
- lily
- affluent
- batch