`
yangshen998
  • 浏览: 1249749 次
文章分类
社区版块
存档分类
最新评论

打印流PrintStream

 
阅读更多

打印流PrintStream

PrintStream:

是一个字节打印流,System.out对应的类型就是PrintStream

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

1,字符串路径。

2File对象。

3OutputStream

PrintWriter

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

1,字符串路径。

2File对象。

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

3OutputStream

4Writer

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

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

  1. //如果想要既有自动刷新,又可执行编码。如何完成流对象的包装?
  2. PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),"utf-8"),true);

  1. //如果想要提高效率。还要使用打印方法。
  2. PrintWriter pw = new PrintWriter(new BufferdWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),"utf-8")),true);


  1. import java.io.*;
  2. public class PrintStreamTest {
  3. public static void main(String[] args) throws IOException {
  4. System.out.println((byte)1);
  5. wirteFile1();
  6. wirteFile2();
  7. readFile2();
  8. readFile22();
  9. }
  10. public static void wirteFile1() throws IOException{
  11. DataOutputStream dos = new DataOutputStream(new FileOutputStream(new File("res/pst1.txt")));
  12. dos.writeDouble(3.1415926);
  13. dos.close();
  14. }
  15. public static void wirteFile2() throws IOException{
  16. PrintStream ps = new PrintStream(new FileOutputStream(new File("res/pst2.txt")));
  17. ps.print(3.1415926);
  18. ps.print("北京");
  19. ps.close();
  20. }
  21. public static void readFile2() throws IOException {
  22. FileInputStream fis =new FileInputStream("res/pst2.txt");
  23. int len = fis.available();
  24. byte[] buf = new byte[len];
  25. while(fis.read(buf) != -1){
  26. System.out.println(new String(buf));
  27. }
  28. fis.close();
  29. }
  30. public static void readFile22() throws IOException{
  31. BufferedReader br = new BufferedReader( new FileReader("res/pst2.txt"));
  32. String content = null;
  33. while((content = br.readLine()) != null){
  34. System.out.println(content);
  35. }
  36. br.close();
  37. }
  38. }


管道流

n PipedInputStream

n PipedOutputStream

特点:

读取管道流流和写入管道流可以进行连接。

连接方式:

1,通过两个流对象的构造函数。

2,通过两个对象的connect方法。

通常两个流在使用时,需要加入多线程技术,也就是让读写同时运行。

注意;对于read方法。该方法是阻塞式的,也就是没有数据的情况,该方法会等待。

  1. //sender.java
  2. import java.io.*;
  3. import java.util.*;
  4. public class Sender extends Thread {
  5. PipedOutputStream out = new PipedOutputStream();
  6. public PipedOutputStream getOut() {
  7. return out;
  8. }
  9. public void run() {
  10. String str = "Hello,receiver ! I`m sender\n ";
  11. try {
  12. for(int i=0; i<10; i++)
  13. out.write(str.getBytes());
  14. out.close();
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. }
  20. //Receiver.java
  21. import java.io.PipedInputStream;
  22. import java.util.*;
  23. public class Receiver extends Thread {
  24. PipedInputStream in = new PipedInputStream();
  25. public PipedInputStream getIn() {
  26. return in;
  27. }
  28. public void run() {
  29. byte[] buf = new byte[1024];
  30. try {
  31. int len = in.read(buf);
  32. System.out.println("the following is from sender:\n "
  33. + new String(buf, 0, len));
  34. in.close();
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. }
  40. //TestPiped
  41. import java.io.PipedInputStream;
  42. import java.io.PipedOutputStream;
  43. class TestPiped {
  44. public static void main(String[] args) {
  45. Sender s = new Sender();
  46. Receiver r = new Receiver();
  47. PipedOutputStream out = s.getOut();
  48. PipedInputStream in = r.getIn();
  49. try {
  50. in.connect(out);
  51. s.start();
  52. r.start();
  53. } catch (Exception e) {
  54. e.printStackTrace();
  55. }
  56. }
  57. }


序列流,也称为合并流——SequenceInputStream:

特点:可以将多个读取流合并成一个流。这样操作起来很方便。

原理:其实就是将每一个读取流对象存储到一个集合中。最后一个流对象结尾作为这个流的结尾。

两个构造函数:

1SequenceInputStream(InputStream in1,InputStream in2)

可以将两个读取流合并成一个流。

2SequenceInputStream(Enumeration<? extends InputStream> en)

可以将枚举中的多个流合并成一个流。

作用:可以用于多个数据的合并。

  1. //将两个文件拼接为一个流进行依次读取
  2. import java.io.*;
  3. public class DataIODemo1 {
  4. public static void main(String[] args) throws IOException {
  5. FileInputStream fis1 = new FileInputStream("res/a.txt");
  6. FileInputStream fis2 = new FileInputStream("res/number.txt");
  7. SequenceInputStream sis = new SequenceInputStream(fis1, fis2);
  8. int ch;
  9. while((ch = sis.read()) != -1){
  10. System.out.print((char)ch);
  11. }
  12. sis.close();
  13. fis1.close();
  14. fis2.close();
  15. }
  16. }


注意:因为EnumerationVector中特有的取出方式。而VectorArrayList取代。

所以要使用ArrayList集合效率更高一些。那么如何获取Enumeration呢?

  1. ArrayList<FileInputStream > al = new ArrayList<FileInputStream>();
  2. for(int x=1; x<4; x++)
  3. al.add(new FileInputStream(x+".txt"));
  4. //返回按适当顺序在列表的元素上进行迭代的迭代器。
  5. final Iterator<FileInputStream> it = al.iterator();
  6. Enumeration<FileInputStream> en = new Enumeration<FileInputStream>() {
  7. public boolean hasMoreElements() {
  8. return it.hasNext();
  9. }
  10. public FileInputStream nextElement() {
  11. return it.next();
  12. }
  13. };
  14. //多个流就变成了一个流,这就是数据源。
  15. SequenceInputStream sis = new SequenceInputStream(en);
  16. //创建数据目的。
  17. FileOutputStream fos = new FileOutputStream("4.txt");
  18. byte[] buf = new byte[1024*4];
  19. int len = 0;
  20. while((len=sis.read(buf))!=-1)
  21. {
  22. fos.write(buf,0,len);
  23. }
  24. fos.close();
  25. sis.close();
  26. //如果要一个对文件数据切割。
  27. 一个读取对应多了输出。
  28. FileInputStream fis = new FileInputStream("1.mp3");
  29. FileOutputStream fos = null;
  30. byte[] buf = new byte[1024*1024];//是一个1m的缓冲区。
  31. int len = 0;
  32. int count = 1;
  33. while((len=fis.read(buf))!=-1)
  34. {
  35. fos = new FileOutputStream((count++)+".part");
  36. fos.write(buf,0,len);
  37. fos.close();
  38. }
  39. fis.close();
  40. //这样就是将1.mp3文件切割成多个碎片文件。


想要合并使用SequenceInputStream即可。

对于切割后,合并是需要的一些源文件的信息。

可以通过配置文件进行存储。该配置可以通过键=值的形式存在。

然后通过Properties对象进行数据的加载和获取。

操作数组的流对象

1、操作字节数组

u ByteArrayInputStream

u ByteArrayOutputStream

toByteArray();

toString();

writeTo(OutputStream);

2、操作字符数组。

u CharArrayReader

u CharArrayWriter

3、操作字符串

u StringReader

u StringWriter

对于这些流,源是内存。目的也是内存。

而且这些流并未调用系统资源。使用的就是内存中的数组。

所以这些在使用的时候不需要close

操作数组的读取流在构造是,必须要明确一个数据源。所以要传入相对应的数组。

对于操作数组的写入流,在构造函数可以使用空参数。因为它内置了一个可变长度数组作为缓冲区。

这几个流的出现其实就是通过流的读写思想在操作数组。

复合类型数据(比如:姓名、年龄、籍贯、性别等等)

ByteArrayOutputStream bos = new ByteArrayOutputStream();

DataOutputStream dos = new DataOutputStream (bos);

dos.writeUTF(..);

dos.writeInt(..);

dos.writeBoolean(..);

...

byte[] result = bos.toByteArray();

编码转换

io中涉及到编码转换的流是转换流和打印流。

但是打印流只有输出。

在转换流中是可以指定编码表的。

默认情况下,都是本机默认的码表GBK. 这个编码表怎么来的?

System.out.println(System.getProperty("file.encoding"));

常见码表:

ascii:美国标准信息交换码。使用的是1个字节的7位来表示该表中的字符。

ISO8859-1:拉丁码表。使用1个字节来表示。

GB2312:简体中文码表。

GBK:简体中文码表,比GB2312融入更多的中文文件和符号。

unicode:国际标准码表。都用两个字节表示一个字符。

UTF-8:对unicode进行优化,每一个字节都加入了标识头。

编码转换:

字符串 -->字节数组 :编码。通过getBytes(charset);

字节数组-->字符串 : 解码。通过String类的构造函数完成。String(byte[],charset);

如果编对了,解错了,有可能还有救!

  1. import java.io.IOException;
  2. import java.io.UnsupportedEncodingException;
  3. public class CodeTest {
  4. public static void main(String[] args) throws IOException {
  5. String s = "你好";
  6. // 编码。
  7. byte[] b = s.getBytes("GBK");
  8. System.out.println(new String(b, "GBK"));
  9. // 解码。
  10. String s1 = new String(b, "iso8859-1");
  11. System.out.println(s1);// ????
  12. // 想要还原。
  13. /*
  14. * 对s1先进行一次解码码表的编码。获取原字节数据。 然后在对原字节数据进行指定编码表的解码。
  15. */
  16. byte[] b1 = s1.getBytes("iso8859-1");
  17. System.out.println(new String(b1, "GBK"));
  18. }
  19. }


这种情况在tomcat服务器会出现。

因为tomcat服务器默认是iso8859-1的编码表。

所以客户端通过浏览器向服务前通过get提交方式提交中文数据时,

服务端获取到会使用ISO8859-1进行中文数据的解码。会出现乱码。

这时就必须要对获取的数据进行iso8859-1编码。然后在按照页面指定的编码表进行解码。即可

而对于post提交,这种方法也通用。但是post有更好的解决方式。

request.setCharacterEncoding("utf-8");即可。

所以建立客户端提交使用post提交方式。

分享到:
评论

相关推荐

    JAVA_打印流例子

    一个详细讲解JAVA_打印流的例子 希望可以帮助到你。

    JavaSE_4_JavaIO操作_1

    File类,输入和输出流,字节-字符转换流,打印流PrintStream,对象序列化

    聊天系统计算机相关论文

    // 用打印流发送QUIT信息通知服务器断开此次通信 ps.println(Constants.QUIT_IDENTIFER); ps.flush(); soc.close(); //关闭套接字 listener.toStop(); soc = null; } catch ...

    PrintStream 介绍_动力节点Java学院整理

    PrintStream 是打印输出流,它继承于FilterOutputStream。 PrintStream 是用来装饰其它输出流。它能为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。 与其他输出流不同,PrintStream 永远不会抛出...

    PrintStream的用法2---马克-to-win java视频

    PrintStream的用法2---马克-to-win java视频

    打印软件(打印 datasource,dbgrid,stringgrid)

    (6) PrintStream() 打印流(流的数据库存取就不用多说了吧) (7) PreviewFile() 预览文件 (8) PreviewStream() 预览流 (9) OptionToStream() 报表的属性保存为流 (10) OptionFromStream() 从流中得到报表属性 ...

    RePrint表格打印控件(打印 datasource,dbgrid,stringgrid)

    (6) PrintStream() 打印流(流的数据库存取就不用多说了吧) (7) PreviewFile() 预览文件 (8) PreviewStream() 预览流 (9) OptionToStream() 报表的属性保存为流 (10) OptionFromStream() 从流中得到报表属性 ...

    reprint打印控件(打印 datasource,dbgrid,stringgrid)

    (6) PrintStream() 打印流(流的数据库存取就不用多说了吧) (7) PreviewFile() 预览文件 (8) PreviewStream() 预览流 (9) OptionToStream() 报表的属性保存为流 (10) OptionFromStream() 从流中得到报表属性 ...

    表格打印控件,轻松做报表(可打印datasource,dbgrid,string

    (6) PrintStream() 打印流(流的数据库存取就不用多说了吧) (7) PreviewFile() 预览文件 (8) PreviewStream() 预览流 (9) OptionToStream() 报表的属性保存为流 (10) OptionFromStream() 从流中得到报表属性 ...

    RePrint 表格打印轻松做报表 打印datasource,dbgrid,string

    (6) PrintStream() 打印流(流的数据库存取就不用多说了吧) (7) PreviewFile() 预览文件 (8) PreviewStream() 预览流 (9) OptionToStream() 报表的属性保存为流 (10) OptionFromStream() 从流中得到报表属性 ...

    Java 中的Printstream介绍_动力节点Java学院整理

    PrintStream 是打印输出流,它继承于FilterOutputStream。接下来通过本文给大家介绍Java 中的Printstream,需要的朋友参考下吧

    Java中的IO流(一)字节流的常用操作

    各种字节流的用法①节点流②处理流③流的使用一般步骤④流的关闭具体用法Ⅰ文件流Ⅱ字节数组流Ⅲ缓冲流Ⅳ转换流Ⅴ数据流Ⅵ对象流(序列化和反序列化)Ⅶ打印流(PrintStream)Ⅷ附加:随机访问流最后 前言 今天带来...

    PrintStream的用法1---马克-to-win java视频

    PrintStream的用法1---马克-to-win java视频的详细描述与介绍

    IO体系.java

    |--PrintStream/:为其他输出流添加了功能,方便打印各种数据值表示类型。PrintStream永远不会抛出IOException异常。 | 为了刷新可以创建一个新的PrintStream,调用println可以提供换行功能。使用了默认的字节编码...

    JDK_API_1_6

    PrintStream PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。 PrintWriter 向文本输出流打印对象的格式化表示形式。 PushbackInputStream PushbackInputStream 为另一个输入流添加...

    Arduino-PrintStream:一个简单的库,添加`std

    Arduino打印流一个简单的库,它为Arduino添加了std::cout的支持(使用&lt;&lt;符)。用法示例# include &lt; PrintStream&gt;void setup () { Serial. begin ( 115200 ); Serial &lt;&lt; " Hello, World! " &lt;&lt; endl...

    java-binary-block-parser:Java和Android中最舒适,最动态的方式来处理位数据

    添加了服务方法JBBPUtils.traceData以将输入流的转储打印到PrintStream中 改进的JBBPTokenizerException以显示标记的错误位置 2.0.2(2020年8月22日) 添加了JBBPOut#Bin变体,以覆盖书面对象中的@Bin注释字段。 ...

    java自学之道

    2.1.7 PrintStream(打印流) 2.2字符流 2.2.1 Reader类 2.2.2 Writer类 2.2.3 FileReader类 2.2.4 FileWriter类 2.2.5 CharArrayReader类 2.2.6 CharArrayWriter类 2.2.7 BufferedReader类 2.2.8 BufferedWriter类 ...

    chatRoom 聊天室

    /* 打印异常栈信息 */ e.printStackTrace(); } } while (ss == null); /* 创建HashSet,用来存放Socket对象 */ hs = new HashSet(); while (true) { try { /* 获得Socket,网络阻塞,等待客户端的连接 */...

    【09-异常处理】

     –printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定输出流。  –getStackTrace():返回该异常的跟踪栈信息。 异常处理 复制代码 try { 需要检测的代码; } catch(异常类 变量) { ...

Global site tag (gtag.js) - Google Analytics