打印流、管道流、编码转换(No.5)

1、打印流PrintStream是从类java.io.FilterOutputStream继承的字段。

其实我们在以前的时候就在用了,就是我们经常用的Sytem.out.println(),System.out所对应的类型就是PrintStream。

它的构造函数函数可以接收三种数据类型的值。

1,字符串路径。

2,File对象。

3,OutputStream。

2、PrintWriter是一个字符打印流。构造函数可以接收四种类型的值。

1,字符串路径。

2,File对象。

对于1,2类型的数据,还可以指定编码表。也就是字符集。

3,OutputStream

4,Writer

对于3,4类型的数据,可以指定自动刷新。

注意:该自动刷新值为true时,只有三个方法可以用:

println, , printf , format.

//如果想要既有自动刷新,又可执行编码。如何完成流对象的包装?

PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),"utf-8"),true);

//如果想要提高效率。还要使用打印方法。

PrintWriter pw = new PrintWriter(new BufferdWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),"utf-8")),true);

//把3.1415926和北京输入到pst2.txt文件中

PrintStream ps = new PrintStream(new FileOutputStream(new File("res/pst2.txt")));

ps.print(3.1415926);

ps.print("北京");

/////////////////////////////////////////

FileInputStream fis =new FileInputStream("res/pst2.txt");

int len = fis.available();

、//把文件中的数据读取出来,并进行字节的转换

byte[] buf = new byte[len];

while(fis.read(buf) != -1){

//而输出语句输出的是字符型的,但是却与上面的语句发成冲突,所以此时输出的是乱码

System.out.println(new String(buf));

/////////////////////////////////

BufferedReader br = new BufferedReader( new FileReader("res/pst2.txt"));

//建立一个字符串型的对象

String content = null;

///while语句

while((content = br.readLine()) != null){

//此时的输出语句输出的为正确的

System.out.println(content);

3、管道流,PipedInputStream和PipedOutputStream

比方说有两个人互相传递东西,东西的传递路线就是数据的传输路线,其中双方必须是同时工作,否则的话就是行不通。这就是管道流。同时这两个流使用的时候,需要加入多线程技术,比如说qq的聊天窗口。

4.编码转换

String s = "你好";

// 编码。转换成了字节

byte[] b = s.getBytes("GBK");

//此打印语句输出的是字符串,也就是“你好”

System.out.println(new String(b, "GBK"));

// 解码。

String s1 = new String(b, "iso8859-1");

//此输出语句输出的是错误的,因为上一句是错误的,上一句String类的构造函数是想把字节转换成字符,但内部却成为了转换成为阿拉码,矛盾。输出的为乱码

System.out.println(s1);// ????

// 想要还原。

l 对s1先进行一次解码码表的编码。获取原字节数据。 然后在对原字节数据进行指定编码表的解码。

l //转换成为字节流,然后转换成string字符串并输出

byte[] b1 = s1.getBytes("iso8859-1");

System.out.println(new String(b1, "GBK"));

}

}

你可能感兴趣的:(编码转换)