资源描述
Java
Java流(Stream)、文件(File)和IO
java.io几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入和输出的目标
支持很多格式,比如:比如基本类型,对象,本地化字符等
一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示想爱你给一个目标写数据。
读取控制台输入:
1.控制台的输入由System.in完成、为了获得一个绑定到控制台的字符流,可以把System.in包装在一个BUfferedReader的对象中来创建一个字符流
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
BufferedReader对象创建后,我们便可以使用read()方法从控制台读取一个字符,或者用readLine()方法读取一个字符串。
2.从控制台读取多字符输入:
从BufferedReader对象读取一个字符要使用read()方法,它的语法如下:
从BufferedReader对象读取一个字符要使用read()方法,它的语法如下:
每次调用read()方法,它从输入流读取一个字符并把该字符作为整数值返回。 当流结束的时候返回-1。该方法抛出IOException。
import java.io.*;
public class BRRead {
public static void main(String args[]) throws IOException
{
char c;
// 使用 System.in 创建 BufferedReader
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
System.out.println("Enter characters, 'q' to quit.");
// 读取字符
do {
c = (char) br.read();
System.out.println(c);
} while(c != 'q');
}}
Enter characters, 'q' to quit.123abcq123
a
b
c
q
从控制台读取字符串
从标准输入读取一个字符串需要使用BufferedReader的readLine()方法。
它的一般格式是:
String readLine( ) throws IOException
例:
// 使用 BufferedReader 在控制台读取字符import java.io.*;public class BRReadLines {
public static void main(String args[]) throws IOException
{
// 使用 System.in 创建 BufferedReader
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
String str;
System.out.println("Enter lines of text.");
System.out.println("Enter 'end' to quit.");
do {
str = br.readLine();
System.out.println(str);
} while(!str.equals("end"));
}}
结果:
Enter lines of text.Enter 'end' to quit.
This is line one
This is line one
This is line two
This is line two
End
End
控制台的输出:
由print(),和println()完成,这些方法都由PrintStream定义,System.out是该类对象的一个引用
PrintStream继承了OutputStream类,并且实现了方法write().这样,write()也可以用控制台写操作
PrintStream 定义write()的最简单格式如下所示:
void write(int byteval)
该方法将byteval的低八位字节写到流中。
FileInputStream
该流用于从文件读取数据,它的对象可以用关键字new来创建。
有多种构造方法可用来创建对象。
可以使用字符串类型的文件名来创建一个输入流对象来读取文件:
InputStream f = new FileInputStream("C:/java/hello");
也可以使用一个文件对象来创建一个输入流对象来读取文件。我们首先得使用File()方法来创建一个文件对象:
File f = new File("C:/java/hello");
InputStream f = new FileInputStream(f);
FileOutputStream
该类用来创建一个文件并向文件中写数据。
如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。
有两个构造方法可以用来创建FileOutputStream 对象。
使用字符串类型的文件名来创建一个输出流对象:
OutputStream f = new FileOutputStream("C:/java/hello")
也可以使用一个文件对象来创建一个输出流来写文件。我们首先得使用File()方法来创建一个文件对象:
File f = new File("C:/java/hello");OutputStream f = new FileOutputStream(f);
文件和I/O
还有一些关于文件和I/O的类,我们也需要知道:
File Class(类)
FileReader Class(类)
FileWriter Class(类)
Java中的目录
创建目录:
File类中有两个方法可以用来创建文件夹:
mkdir( )方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。
mkdirs()方法创建一个文件夹和它的所有父文件夹。
下面的例子创建 "/tmp/user/java/bin"文件夹:
import java.io.File;
public class CreateDir {
public static void main(String args[]) {
String dirname = "/tmp/user/java/bin";
File d = new File(dirname);
// 现在创建目录
d.mkdirs();
}}
编译并执行上面代码来创建目录"/tmp/user/java/bin"。
注意:Java在UNIX和Windows自动按约定分辨文件路径分隔符。如果你在Windows版本的Java中使用分隔符(/) ,路径依然能够被正确解析。
读取目录
一个目录其实就是一个File对象,它包含其他文件和文件夹。
如果创建一个File对象并且它是一个目录,那么调用isDirectory( )方法会返回true。
可以通过调用该对象上的list()方法,来提取它包含的文件和文件夹的列表。
下面展示的例子说明如何使用list()方法来检查一个文件夹中包含的内容:
import java.io.File;
public class DirList {
public static void main(String args[]) {
String dirname = "/tmp";
File f1 = new File(dirname);
if (f1.isDirectory()) {
System.out.println( "Directory of " + dirname);
String s[] = f1.list();
for (int i=0; i < s.length; i++) {
File f = new File(dirname + "/" + s[i]);
if (f.isDirectory()) {
System.out.println(s[i] + " is a directory");
} else {
System.out.println(s[i] + " is a file");
}
}
} else {
System.out.println(dirname + " is not a directory");
}
}}
以上实例编译运行结果如下:
Directory of /tmp
bin is a directory
lib is a directory
demo is a directory
test.txt is a file
README is a file
index.html is a file
include is a directory
java方法
System.out.println();
Println()是一个方法(Method)
System使系统类(class)
out是标准输出对象(Object)
方法的定义:
方法是解决一类问题的步骤的有序组合,包含于类和对象之中,在程序中被创建,在其他方面被引用
优点:
使程序变得简短而又清晰,有利于程序的维护。可以提高程序开发的重要性
命名规则:
必须以字母,下划线或$开头,可以包括数字,但不能以数字开头
方法的定义
修饰符 返回值类型 方法名 (参数类型 参数名){
方法体
return 返回值;
}
· 修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
· 返回值类型 :方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType是关键字void。
· 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
· 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
· 方法体:方法体包含具体的语句,定义该方法的功能。
public static int age(int birthday){...}
static float interest(float principal, int year){...}
方法调用
Java支持两种调用方法的方式,根据方法是否返回值来选择。
当程序调用一个方法时,程序的控制权交给了被调用的方法。当被调用方法的返回语句执行或者到达方法体闭括号时候交还控制权给程序。当方法返回一个值的时候,方法调用通常被当做一个值。例如:
int larger = max(30, 40);
如果方法返回值是void,方法调用一定是一条语句。例如,方法println返回void。下面的调用是个语句:
System.out.println("Welcome to Java!");
void 关键字
本节说明如何声明和调用一个void方法。
下面的例子声明了一个名为printGrade的方法,并且调用它来打印给定的分数。
示例
Public class TestVoidMEthod(){
Public static void main(String[] args){
printGrade(78.5);
}
Public static void printScore(double score){
If(score>=90.0){
System.out.println(A);
}else if(score>=80){
System.out.println(B);
}
}
}
通过值传递参数
调用一个方法时候需要提供参数,你必须按照参数列表指定的顺序提供。
Public static void nprintln(String message, int n){
For(int i=0;i<n;i++){
System.out.println(message);
}
}
示例
下面的例子演示按值传递的效果。
该程序创建一个方法,该方法用于交换两个变量。
Public class TeatPassByValue{
Public static void main(String[] args){
Int num1;
Int num2;
//调用方法
Swap(num1,num2);
Sytem.out.println();
}
Public static void swap(int i,int j){
Int a=0;
I=num1;
Num1=num2;
Num2=i;
}
Pubilc static double swap(double i,double j){
double a=0;
I=num1;
Num1=num2;
Num2=i;
}
}
方法的重载:(上述的红色标记的两个方法)一个类的两个方法拥有相同的名字,但有不同的参数列表;编译器根据方法判断哪个方法应该被调用;
变量的作用域:(程序中可以被引用的部分)
局部变量:方法内定义的变量,其作用范围从声明开始到包含它的块结束;
必须声明才可以使用,例如:for循环的初始化部分声明的变量,其作用范围在整个循环。
命令行参数的使用:运行程序时在传递命令参数给main()函数实现
构造方法:当一个对象被创建的时候,构造方法来初始化该对象。方法和它所在的类的名字相同,但构造方法没有返回值。通常会使用构造方法给一个类的实例变量赋值,或执行它必要的步骤来创建一个完整的对象。
可变参数:将同类型的可变参数传给一个方法
声明:typeName... parameterName
在声明中只能定义一个可变参数,它必须是方法的最后一个参数
public static void printMax( double... numbers) {
if (numbers.length == 0) {
System.out.println("No argument passed");
return;
}
Java Scanner
Scanner的基本语法:
Scanner s = new Scanner(System.in);
并通过 Scanner 类的 next() 与 nextLine() 方法获取输入的字符串
在读取前我们一般需要 使用 hasNext 与 haxNextLine 判断是否还有输入的数据:
next()与nextLine()区别
next():
1、一定要读取到有效字符后才可以结束输入。
2、对输入有效字符之前遇到的空白,next()方法会自动将其去掉。
3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
next()不能得到带有空格的字符串。
nextLine():
1、以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符。
2、可以获得空白。
Java 异常处理
常见的一异常原因:
1 用户输入了非法的数据
2 要打开的文件不存在
3 网络通信连接中断,或者JVM内存溢出
由用户引起的错误:
1 检查性异常:最具代表的检查性异常是用户错误或问题引起的,这是程序员无法预见的
2 运行时异常:运行异常是可以被程序员避免的错误
3 错误:错误不是异常,而是脱离程序员控制的问题
捕获异常:使用try和catch代码中
Exception类的层次:
Exception类是Throwable类的子类;还有error,用来表示运行时环境发生的错误
Java内置异常类:
异常方法:Throwable
捕获异常:使用try和catch关键字捕获异常,使用的语法:
try
{
// 程序代码
}catch(ExceptionName e1)
{
//Catch 块
}
多重捕获块:
一个try代码块后面跟随多个catch代码块的情况就叫多重捕获。
多重捕获块的语法如下所示:
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}
上面的代码段包含了3个catch块。
可以在try语句后面添加任意数量的catch块。
如果保护代码中发生异常,异常被抛给第一个catch块。
如果抛出异常的数据类型与ExceptionType1匹配,它在这里就会被捕获。
如果不匹配,它会被传递给第二个catch块。
如此,直到异常被捕获或者通过所有的catch块。
Throws/throw关键字
如果一个方法没有捕获一个检查性异常,那么该方法必须使用throws 关键字来声明。throws关键字放在方法签名的尾部。
也可以使用throw关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。
Finally关键字:
finally关键字用来创建在try代码块后面执行的代码块。
无论是否发生异常,finally代码块中的代码总会被执行。
在finally代码块中,可以运行清理类型等收尾善后性质的语句。
finally代码块出现在catch代码块最后,语法如下:
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}finally{
// 程序代码
}
注意下面事项:
catch不能独立于try存在。
在try/catch后面添加finally块并非强制性要求的。
try代码后不能既没catch块也没finally块。
try, catch, finally块之间不能添加任何代码。
声明自定义异常:
在Java中你可以自定义异常。编写自己的异常类时需要记住下面的几点。
所有异常都必须是Throwable的子类。
如果希望写一个检查性异常类,则需要继承Exception类。
如果你想写一个运行时异常类,那么需要继承RuntimeException 类。
展开阅读全文