目录
一、I/O的基础知识
1.流
Java程序通过流执行I/O,流是一种抽象,要么产生信息,要么使用信息。流通过Java的I/O系统链接到物理设备。所有流的行为方式都是相同的,尽管与它们链段的物理设备是不同的。因此,可以为任意类型的设备应用相同的I/O流和方法。这意味着可以将许多不同类型的输入-磁盘文件、键盘或网络socket抽象为输入流。与之对应,输出流可以引用控制台、磁盘文件或网络连接。
2.字节流和字符流
字节流为处理字节的输入和输出提供了方法。
字符流为处理字符的输入和输出提供了方法。
在最底层,所有I/O仍然是面向字节的。在某些情况下,字符流比字节流更高效。
(1)字节类流
顶级是两个抽象类InputSream和OutputStream。
其中最重要的两个方法是read()和write()
(2)字符类流
顶级是两个抽象类Reader和Writer。
其中最重要的两个方法是read()和write()
3.预定义流
System.out引用标准的输出流,默认情况下是控制台。
System.in引用标准的输入流,默认情况下是键盘。
System.err引用标准的错误流,默认情况下也是控制台。
System.in是InputStream类型的对象;System.out和System.err是PrintStream类型的对象
二、读取控制台输入
为了获得与控制台关联的基于字符的流,可以在BufferedReader对象中封装System.in。
BufferedReader(Reader inputReader)
Reader是抽象类,InputStreamReader是它的个具体子类,该类将字节转换为字符。
InputStreamReader(InputStream inputStream)
1.读取字符
read();
2.读取字符串
readLine();
代码演示:
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("please input...");
//读取字符
/* char ch;
do {
ch = (char) br.read();
System.out.println(ch);
} while (ch != 'q');*/
//读取字符串
String s;
do {
s = br.readLine();
System.out.println(s);
} while (!s.equals("end"));
}
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("please input...(Enter 'end' is to quit");
String[] str=new String[100];
for(int i=0;i<100;i++){
str[i]=br.readLine();
if(str[i].equals("end")){
break;
}
}
for(int i=0;i<100;i++){
if(str[i].equals("end")){
break;
}
System.out.println(str[i]);
}
}
三、向控制台写输出
1.PrintWriter类
对于实际的程序,使用Java向控制台输出的推荐方法是通过PrintWriter流。可以使程序国际化更容易。
构造方法:
PrintWriter(OutputStream ops,boolean flushingOn)
flushingOn控制Java是否在每次调用println()方法时刷新输出流。True为自动刷新。
printWriter支持print()和println()方法。
public static void main(String[] args) {
PrintStream ps=new PrintStream(System.out,true);
ps.println("hello");
int i=1;
ps.println(i);
ps.println(true);
}
四、读/写文件
对于读/写文件,两个最常用的流是FileInputStream和FileOutputStream,这两个类创建与文件链接的字节流。
FileInputStream(String fileName)
当创建输入流时,如果文件不存在,就会抛出FileNotFoundException异常。对于输出流,如果不能打开文件或不能创建文件,也会抛出FileNotFoundException异常。
文件使用完之后必须关闭,使用close()方法完成的。
public static void main(String[] args) {
FileInputStream fis= null;
try {
fis = new FileInputStream(new File("F:/黑马程序员/资源/阅读记录.txt"));
int len=0;
byte[] bys=new byte[1024];
while((len=fis.read(bys))!=-1){
System.out.println(new String(bys,0,len));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(fis!=null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
五、自动关闭流
JDK7增加了一个新特性,该特性提供了另外一种管理资源(例如文件流)的方式,这种方式能自动关闭文件。
一般形式为:
try(resource-specification){
//use the resource
}
resource-specification是用来声明和初始化资源的文件。该语句包含一个变量声明,在该声明中使用将被
管理的对象引用初始化变量。当try代码块结束时,自动释放资源。
只有对于实现了AutoCloseable接口的资源,才能使用带资源的try语句。java.io包中的所有流都实现了此接口。
注意:
1.try语句中声明的资源被隐式声明为final;
2.如果要在try语句中管理多个资源,在每个资源之间使用分号分割即可。
public static void main(String[] args) {
try (FileInputStream fs = new FileInputStream("F:/黑马程序员/资源/阅读记录.txt");
FileOutputStream fo = new FileOutputStream("F:/黑马程序员/资源/阅读记录copy版本.txt")) {
byte[] bys = new byte[1024];
int len = 0;
while ((len = fs.read(bys)) != -1) {
fo.write(bys, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
}