Java 流Stream、文件File和I/O
Java.io包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。输入流InputStream表示从一个源读取数据,输出流OutputStream表示向一个目标写数据。
读取控制台输入
Java输入控制台由System.in读取完成。为了获得一个连接到控制台基于字符的数据流,包装System.in在一个BufferedReader对象,创建一个字符流。
基本语法:
BufferedReader br = new BufferedReader(new) InputStreamReader(System.in));
BufferedReader对象创建后,就可以使用read()方法从控制台读取一个字符,或者用readLine()方法读取一个字符串。
从控制台读取字符:
读取一个字符用BufferedReader的read()方法:
int read( ) throws IOException
每次调用read()方法,它从输入流读取一个字符并把该字符作为整数值返回。 当流结束的时候返回-1。方法抛出IOException。
例子:循环读取一个字符并输出,当字符为q退出。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test {
public static void main(String args[]) throws IOException{
char c;
System.out.print("输入一个字符串以q结束:");
// 使用 System.in 创建 BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 读取字符
do{
c = (char) br.read();
System.out.print(c);
}while(c != 'q');
}
}
程序运行结果:
输入一个字符串以q结束:javareadq
j
a
v
a
r
e
a
d
q
读取一个字符串用BufferedReader的readLine()方法。
String readLine( ) throws IOException
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test {
public static void main(String args[]) throws IOException{
// 使用 System.in 创建 BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str;
System.out.print("输入字符串,以quit结束:");
do {
str = br.readLine();
System.out.println(str);
} while(!str.equals("quit"));
}
}
程序运行结果:
输入字符串,以quit结束:java read quit
java read quit
控制台输出
控制台的输出由 print( ) 和println( )完成。这些方法都由类PrintStream 定义,System.out是该类对象的一个引用。 PrintStream 继承了OutputStream类,并且实现了方法write()。也就是说,write()也可以用来往控制台写操作。
PrintStream 定义write()的最简单格式:
void write()
例子:
public class Test {
public static void main(String args[]){
int str;
str = 'A';
System.out.write(str);
System.out.write('\n');
}
}
程序运行结果:
A
读写文件
FileInputStream:
用一个文件名作为一个字符串创建一个输入流对象来读取文件:
InputStream f = new FileInputStream(“C:/java/HelloWork.txt”);
public void close() throws IOException{}
关闭文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。protected void finalize()throws IOException {}
清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。- public int read(int r)throws IOException{}
此方法从InputStream对象读取指定字节的数据。返回int。返回下一字节数据,如果已经到结尾则返回-1。 - public int read(int r) throws IOException{}
这个方法从输入流读取r.length长度的字节。返回读取的字节数。如果是文件结尾则返回-1。 - public int available() throws IOException{}
可以从该文件输入流中读取的字节数。返回int。
FileOutputStream
文件输出流是用于创建一个文件并写入数据。如果文件不存在,流会创建一个文件。
OutputStream f = new FileOutputStream(“C:/java/HelloWork.txt”);
- public void close() throws IOException{}
关闭此文件输入流并释放与此流有关的所有系统资源。抛出一个IOException - protected void finalize()throws IOException {}
清除连接到该文件。确保此文件输出流的close方法被调用时此流不再被引用。抛出IOException异常。 - public void write(int w)throws IOException{}
此方法将指定字节写入到输出流。 - public void write(byte[] w)
把指定数组中w.length长度的字节写到OutputStream中。
文件写入读取例子:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Test{
public static void main(String[] args) throws IOException {
File file = new File("java.txt");
// 构建FileOutputStream对象,文件不存在会自动新建
FileOutputStream fop = new FileOutputStream(file);
// 构建OutputStreamWriter对象,参数可以指定编码.
OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
// 写入到缓冲区
writer.append("中文输入");
writer.append("\n");
// 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入
writer.append("Java File");
//关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉
writer.close();
// 关闭输出流,释放系统资源
fop.close();
// 构建FileInputStream对象
FileInputStream fip = new FileInputStream(file);
// 构建InputStreamReader对象,编码与OutputStreamWriter相同
InputStreamReader reader = new InputStreamReader(fip, "UTF-8");
StringBuffer sb = new StringBuffer();
while (reader.ready()) {
// 转成char类型添加到StringBuffer对象中
sb.append((char) reader.read());
}
System.out.println(sb.toString());
// 关闭读取流
reader.close();
// 关闭输入流,释放系统资源
fip.close();
}
}
文件和I/O
创建目录
- mkdir( )方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。
- mkdirs()方法创建一个文件夹和它的所有父文件夹。
创建目录,执行代码,创建C:/Users/win8/Desktop/HelloWork文件。例子:
import java.io.File;
public class Test {
public static void main(String args[]) {
String fileName = "C:/Users/win8/Desktop/HelloWork";
File newFile = new File(fileName);
newFile.mkdirs();
}
}
读取目录:
一个目录其实就是一个File对象,它包含其他文件和文件夹。当创建一个文件对象,并且它是一个目录,那么调用isdirectory()方法将返回true。可以通过调用该对象上的list()方法,来提取它包含的文件和文件夹的列表。
使用 list( )来检查一个目录的内容的例子:
import java.io.File;
public class FileDemo {
public static void main(String[] arg){
//定义文件路径
String dir = "C:/Users/win8/Desktop/HelloWork";
//根据给定路径名字符串,创建File实例
File file = new File(dir);
//判断file实例是否是文件夹
if(!file.exists()){
file.mkdirs();
}
if(file.isDirectory()) {
//将文件夹下的文件名转成字符串数组
String[] filePaths = file.list();
//遍历文件夹下文件名
for (String path : filePaths) {
//拼接文件夹路径和文件路径
String fileDir = dir.concat("/").concat(path);
//创建新的实例
File file2 = new File(fileDir);
//判断是否为文件夹
if(file2.isDirectory()) {
System.out.println(file2+" :是一个文件夹");
} else {
System.out.println(file2 + ":是一个文件");
}
}
} else {
System.out.println(file.getAbsolutePath()+":不是文件夹");
}
}
}
程序运行结果:
C:\Users\win8\Desktop\HelloWork\file1 :是一个文件夹
C:\Users\win8\Desktop\HelloWork\file2 :是一个文件夹
C:\Users\win8\Desktop\HelloWork\test1.txt:是一个文件
C:\Users\win8\Desktop\HelloWork\test2.docx:是一个文件