IO 两大主流 16位和8位
16位对应writer和reader
fileWriter /fileReader 对文件进行读写
示例代码:
FileWriter out=new FileWriter("test.txt");
out.write("张三");
out.close();
char[] buf=new char[1024];
FileReader in=new FileReader("test.txt");
int len=in.read(buf);
System.out.println(new String(buf,0,len));
StringWriter/StringReader 对内存里的位置进行读写
示例代码如下:
try {
throw new Exception("test");
} catch (Exception e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
System.out.println(e.getMessage());
// System.out.println(sw.toString());
}
PipedWriter/PipedReader 两个线程间进行通讯
8位对应InputStream和OutputStream
fileInputStream/FileOutputStream 对文件进行读写
示例代码:
public static void main(String[] args) throws Exception
{
FileOutputStream out=new FileOutputStream("test.txt");
out.write("张三".getBytes());
byte[] buf=new byte[1024];
File f=new File("test.txt");
FileInputStream in=new FileInputStream(f);
int len=in.read(buf);
System.out.println(new String(buf,0,len));
in.close();
}
ByteArrayInputStream/ByteArrayOutputStream 对字节数组进行读写
示例代码:
public static void main(String[] args)
{
String tmp="abc";
byte[] src=tmp.getBytes();
ByteArrayInputStream input=new ByteArrayInputStream(src);
ByteArrayOutputStream output=new ByteArrayOutputStream();
transform(input,output);
byte[] result=output.toByteArray();
System.out.println(new String(result));
transform(System.in,System.out);
}
public static void transform(InputStream in,OutputStream out)
{
int ch=0;
try
{
while((ch=in.read())!=-1)
{
int upperCh=(int)(Character.toUpperCase((char)ch));
out.write(upperCh);
}
}catch(Exception e)
{
e.printStackTrace();
}
}
PipedInputStream/PipOutputStream 线程间通讯使用
示例代码:
class Sender extends Thread {
private PipedOutputStream out = new PipedOutputStream();
public PipedOutputStream getOutputStream() {
return out;
}
public void run() {
String strInfo = new String("hello,receiver!");
try {
out.write(strInfo.getBytes());
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Receiver extends Thread {
private PipedInputStream in = new PipedInputStream();
public PipedInputStream getInputStream() {
return in;
}
public void run() {
String strInfo = new String("hello,receiver!");
byte[] buf = new byte[1024];
try {
int len = in.read(buf);
System.out.println("the following message comes from sender:\n" + new String(buf, 0, len));
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class PipedStreamTest {
public static void main(String[] args) throws Exception {
Sender t1 = new Sender();
Receiver t2 = new Receiver();
PipedOutputStream out = t1.getOutputStream();
PipedInputStream in = t2.getInputStream();
out.connect(in);
t1.start();
t2.start();
}
}
注:数据流中不存在字符串的IO操作,那样要用reader和writer
二者的桥梁在inputStreamReader/outputStreamWriter
bufferedWriter/bufferedReader
bufferedInputStream/bufferedOutputStream
示例代码:
public static void main(String[] args) throws Exception
{
FileOutputStream fos=new FileOutputStream("count.txt");
BufferedOutputStream bos=new BufferedOutputStream(fos);
DataOutputStream dos=new DataOutputStream(bos);
dos.writeUTF("ab中国");
dos.writeBytes("ab中国");
dos.writeChars("ab中国");
dos.close();
FileInputStream fis=new FileInputStream("count.txt");
BufferedInputStream bis=new BufferedInputStream(fis);
DataInputStream dis=new DataInputStream(bis);
System.out.println(dis.readUTF());
byte[] buf=new byte[1024];
int len=dis.read(buf);
System.out.println(new String(buf,0,len));
fis.close();
}
来提高IO访问速度的
高级IO操作
信道IO java.nio.channels
java流的处理上分为
字符流 处理单元为2个字节的unicode字符,操作字符\字符数组\字符串
Reader
CharArrayReader()
StringArrayReader()
FileReader()
Writer
CharArrayWriter()
StringWriter()
FileWriter()
PipedWriter()
字节流 处理一个字节,操作字节和字节数组
inputStream
ByteArrayInputStream() 创建一个字节数组输入流
StringBufferInputStream() 把一个String 作为一个inputStream
FileInputStream() 把一个文件作为一个inputStream,实现文件读取
PipInputStream() 创建一个输入流管道
SequenceInputStream() 序列输入流,把多个inputStream合并
outputStream
ByteArrayOutputStream() 把信息存入内存中的一个缓冲区
FileOutputStream ()
PipedOutputStream() 通讯管道的发送端
两种不同导向的stream之间的转换
把一个字节为导向的stream转换为一个以字符为导向的stream
java IO的一般使用原则
1 按数据来源(去向)分类
是文件: fileInputStream, fileOutputStream, fileReader, fileWriter
是byte[]: byteArrayInputStream/byteArrayOutputStream
是char[]: charArrayReader/charArrayWriter
是String stringBufferInputStream/StringBufferOutputStream
StringReader/StringWriter
网络数据流: inputStream/outputStream reader writer
2 按是否格式化输出分:
printStream /printWriter
3 按是否要缓冲分:
bufferedInputStream/bufferedOutputStream
bufferedReader/burreredWriter
4 按数据格式分