java (Stream)流、(File)文件和IO
注:以下所述作为笔记以供复阅
或有谬误,需自察
文中有很多引用自:http://www.runoob.com/java/java-files-io.html
https://www.w3cschool.cn/java/java-files-io.html
输入流与输出流的类层次图
常见方法
int read() throws IOException
从BufferedReader对象读取一个字符可使用read()方法。该方法从输入流读取一个字符并把该字符作为整数值返回。 当流结束的时候返回-1。该方法抛出IOException。
String readLine() throws IOException
从标准输入读取一个字符串可以使用BufferedReader的readLine()方法。
int available() throws IOException
属于InputStream对象的方法,返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取的字节数。返回一个整数值。
从控制台读取多字符输入
Java 的控制台输入由 System.in 完成。
为了获得一个绑定到控制台的字符流,可以把 System.in 包装在一个 BufferedReader 对象中来创建一个字符流。
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
下面的程序示范了用 read() 方法从控制台不断读取字符直到用户输入 “q”。
//使用 BufferedReader 在控制台读取字符
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("输入字符, 按下 'q' 键退出。");
// 调用read()方法读取字符
do {
c = (char) br.read();
System.out.println(c);
} while (c != 'q');
}
}
从控制台读取字符串
下面的程序读取和显示字符行直到输入了单词"end"。
//使用 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("输入字符串:");
System.out.println("输入 end 退出");
do {
//从标准输入读取一个字符串需要使用 BufferedReader 的 readLine() 方法
str = br.readLine();
System.out.println(str);
} while (!str.equals("end"));
}
}
使用FileInputStream从文件读取数据
有多种构造方法可用来创建inputStream对象。
方法一:使用字符串类型的文件名来创建一个输入流对象来读取文件
InputStream inputf = new FileInputStream("C:/appWorkspace/eclipseWorkSpace/LeetCode/src/tools/test.txt");
方法二:首先使用 File() 方法来创建一个文件对象,然后使用该文件对象来创建一个输入流对象来读取文件。
File f = new File("C:/appWorkspace/eclipseWorkSpace/LeetCode/src/tools/test.txt");
InputStream inputf1 = new FileInputStream(f);
以下程序从test.txt按字符读取文本数据
public static void main(String[] args) throws IOException{
File f = new File("C:/appWorkspace/eclipseWorkSpace/LeetCode/src/tools/test.txt");
InputStream inputf1 = new FileInputStream(f);
//available()返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取的字节数。返回一个整数值。
int size = inputf.available();
for (int i = 0; i < size; i++) {
//read()从 InputStream 对象读取指定字节的数据。返回为整数值。返回下一字节数据,如果已经到结尾则返回-1。
System.out.print((char) inputf.read() + " ");
}
//使用close()关闭次文件输入流并释放与此流有关的所有系统资源
inputf.close();
}
使用FileOutputStream创建一个文件并向文件中写入数据
有多种构造方法可用来创建outputStream对象。
方法一:使用字符串类型的文件名来创建一个输出流对象来创建文件和或读取文件
FileOutputStream outputf = new FileOutputStream("C:/appWorkspace/eclipseWorkSpace/LeetCode/src/tools/test1.txt");
方法二:首先使用 File() 方法来创建一个文件对象,然后使用该文件对象来创建一个输出流对象来创建文件和或读取文件
File f = new File("C:/appWorkspace/eclipseWorkSpace/LeetCode/src/tools/test2.txt");
FileOutputStream outputf1 = new FileOutputStream(f);
以下程序在当前目录下创建一个test2.txt文件并向其中写入“中文输入”这个字符串
File f = new File("C:/appWorkspace/eclipseWorkSpace/LeetCode/src/tools/test2.txt");
FileOutputStream outputf1 = new FileOutputStream(f);
OutputStreamWriter writer = new OutputStreamWriter(outputf1,"UTF-8");
writer.append("中文输入");
writer.close();
outputf1.close();
以下程序使用FileOutputStream对象创建文件,用OutputStreamWriter对象向文件中写入数据,用InputStreamReader对象读取文件数据
import java.io.*;
public class fileStreamTest2 {
public static void main(String[] args) throws IOException {
File f = new File("a.txt");
FileOutputStream fop = new FileOutputStream(f);
// 构建FileOutputStream对象,文件不存在会自动新建
OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
// 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk
writer.append("中文输入");
// 写入到缓冲区
writer.append("\r\n");
// 换行
writer.append("English");
// 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入
writer.close();
// 关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉
fop.close();
// 关闭输出流,释放系统资源
FileInputStream fip = new FileInputStream(f);
// 构建FileInputStream对象
InputStreamReader reader = new InputStreamReader(fip, "UTF-8");
// 构建InputStreamReader对象,编码与写入相同
StringBuffer sb = new StringBuffer();
while (reader.ready()) {
sb.append((char) reader.read());
// 转成char加到StringBuffer对象中
}
System.out.println(sb.toString());
reader.close();
// 关闭读取流
fip.close();
// 关闭输入流,释放系统资源
}
}