java的IO流种类繁多,并不是所有的IO类都非常重要,因此我在这里总结了几个常用的IO流使用方法
输入输出流
字符型输入输出流
下面这个例子使用了五种流,分别为BufferedReader,StringReader,PrintWriter,BufferedWriter,FileWriter
作用分别是
流 | 作用 |
---|---|
StringReader | 接收一个字符串作为构造参数,提供读取该字符串的方法 |
BufferedReader | 将要读取的数据缓存在内存中 |
FileWriter | 向文件中写入字符型数据 |
BufferedWriter | 将数据缓存在缓冲区中,缓冲区满后一次性将缓冲区数据写入到文件 |
PrintWriter | 装饰Writer,提供更多的输出方法 |
public void test() throws IOException {
try (BufferedReader in = new BufferedReader(new StringReader(STRING));
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("F:\\reference\\temp\\doc5.txt")))) {
String line = null;
int count = 0;
while ((line = in.readLine()) != null) {
out.println(++count + ":" + line );
}
}
}
Steram型输入输出流
Stream与上述reader型输入输出流类似
读出数据的顺序必须与写入数据的顺序一致
try (DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("F:\\reference\\temp\\doc6.txt")));
DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream("F:\\reference\\temp\\doc6.txt")))) {
out.writeDouble(3.14);
out.writeUTF("Hello World");
out.writeInt(2017);
out.writeUTF("Hello world");
out.close();
System.out.println(in.readDouble());
System.out.println(in.readUTF());
System.out.println(in.readInt());
System.out.println(in.readUTF());
} catch (IOException e) {
e.printStackTrace();
}
stream与byte[]相互转化
Stream转化为byte[]
public static byte[] readStream(InputStream in) throws IOException {
try (ByteArrayOutputStream out = new ByteArrayOutputStream();) {
byte[] buffer = new byte[8192];
int len = -1;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
return out.toByteArray();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
byte[]转化为stream
byte[] buff = ...
ByteArrayInputStream in = new ByteArrayInputStream(buff);
缓存流
reader形式的缓存流
缓存流的目的是加快读取速度,下面这个例子是从命令行中读取文件路径,然后利用缓存流输出文件
public static String getString(String filename) {
try (BufferedReader in = new BufferedReader(new FileReader(filename));) {
String s;
StringBuilder sb = new StringBuilder();
while ((s = in.readLine()) != null) {
sb.append(s + "\n");
}
System.out.println(sb.toString());
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
读取命令行
System.out.println("请输入文件路径");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String filename = br.readLine();
getString(filename);
stream形式的缓存流
public void streamBuffer2() throws IOException {
BufferedInputStream in = new BufferedInputStream(new FileInputStream("F:\\idea_java\\myjava\\src\\main\\java\\com\\java\\basics\\bit\\Main.java"));
byte[]buff=new byte[8192];
int count=-1;
while((count=in.read(buff))>0){
String string=new String(buff,0,count, Charset.forName("UTF-8"));
System.out.println(string);
}
}