内存流:
内存输入流:内存--->程序 ByteArrayInputputStream、CharArrayReader
内存输出流:程序--->内存 ByteArrayOutputStream、CharArrayWriter
内存流可以不用关闭,其读取操作同前面的文件流
打印流:
PrintStream PrintWriter
import java.io.FileNotFoundException;
import java.io.PrintStream;
public class PrintDemo {
public static void main(String[] args) throws FileNotFoundException {
PrintStream ps = new PrintStream("d:/Test/well.txt");
ps.write('a');
ps.print(true);
ps.print("hello,world");
}
}
利用print() 可以输出任何类型的数据到文件中。
格式化输出:printf ,同C语言
public class PrintfDemo {
public static void main(String[] args) {
String name = "well";
int age = 21;
char score = 'A';
System.out.printf("%s,%d,%c",name,age,score);//well,21,A
}
}
管道流:
又称线程通讯流,主要用于两个线程间的通信。
PipedOutputStream
PipedInputStream
标准输入输出:
System.in和System.out,默认情况下分别表示键盘和屏幕
可以对其进行重定向,分别利用setIn 和 setOut
package io;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintStream;
public class SystemDemo {
public static void main(String[] args) throws IOException {
/**
* 标准流:
* 标准输入流: System.in 默认表示的是键盘录入
* 标准输出流: System.out 默认表示的是屏幕输出
*
*
* 若现在我输出不想打印在屏幕上,怎么办?
* 若现在我不想通过键盘来录入数据,有怎么办?
*
*
* 流的重定向:
* static void setOut(PrintStream out) 重新分配“标准”输出流。
* static void setIn(InputStream in) 重新分配“标准”输入流。
*/
System.out.println("12123");
System.out.println("----end-----");
System.err.println("12123");
//把屏幕输出重定向到setOut.txt,以后的打印就不会打印在屏幕上了,而是打印在setOut.txt文件里面
System.setOut(new PrintStream("setOut.txt"));
System.out.println("AAAA");
System.out.println("BBBB");
//===================================
int i = System.in.read();//接受从键盘输入的数据
System.out.println("键盘录入数据是= "+(char)i);
System.out.println("---------------------------");
/**
* 重新分配 输入的源,原本是键盘,现在改成 day21复习.txt文件
*/
System.setIn(new FileInputStream("day21复习.txt"));
byte[] buff = new byte[1024];
int len = 0;
while((len = System.in.read(buff)) != -1){
System.out.println(new String(buff,0,len));
}
}
}
扫描流:
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) throws IOException {
/**
* 文本扫描器
*/
Scanner sc = new Scanner(System.in);//扫描键盘录入的数据
/**
* Scanner useDelimiter(String pattern) 将此扫描器的分隔模式设置为从指定 String 构造的模式。
*/
//sc.useDelimiter("\\d");
/**
* Scanner(File source) 构造一个新的 Scanner,它生成的值是从指定文件扫描的。
*/
System.setOut(new PrintStream("line.txt"));
sc = new Scanner(new File("day21复习.txt"));
int line = 1;
while(sc.hasNextLine()){//是否有下一行
System.out.println(line +" " + sc.nextLine());//读取下一行
line++;
}
}