关于JAVA中流的flush问题

目前在学习Socket,因为和IO关系紧密,于是顺便也学了下IO

发现有这样一句话:

The flush method is valid on any output stream,but has no effect unless the stream is buffered

这句话意思是所有的输出流都有flush方法,但是仅对缓冲流有效

看到这里,笔者想到了自己写的serversocket类,部分代码如下,没有用buffered流也调用了flush方法啊?于是进行了一番探讨

private OutputStream ous;
ous = socket.getOutputStream();
public void sendMsg(String msg){
		PrintWriter out = new PrintWriter(ous);
		out.println("消息:"+msg);
		out.flush();
}

看到这里用PrintWriter包装了OutputStream流,OutputStream肯定为非缓冲流,所以问题一定出在PrintWriter上

让我们来看一下PrintWriter的底层代码,部分相关代码如下

public class PrintWriter extends Writer {
    protected Writer out;
    private final boolean autoFlush;

     /**
     * Creates a new PrintWriter, without automatic line flushing.
     *
     * @param  out        A character-output stream
     */
    public PrintWriter (Writer out) {
        this(out, false);
    }
     /**
     * Creates a new PrintWriter.
     *
     * @param  out        A character-output stream
     * @param  autoFlush  A boolean; if true, the <tt>println</tt>,
     *                    <tt>printf</tt>, or <tt>format</tt> methods will
     *                    flush the output buffer
     */
    public PrintWriter(Writer out,
                       boolean autoFlush) {
        super(out);
        this.out = out;
        this.autoFlush = autoFlush;
        lineSeparator = java.security.AccessController.doPrivileged(
            new sun.security.action.GetPropertyAction("line.separator"));
    }
    public PrintWriter(OutputStream out) {
        this(out, false);
    }
}

如上所示,这样我们就很清楚了,当调用包装OutputStream的构造方法时,autoFlush参数是falus

时间: 2024-08-03 07:11:36

关于JAVA中流的flush问题的相关文章

java中流的注意事项

缓冲流 缓冲流继承自过滤流,使用缓冲流时一些要注意的知识点: 1.如果在缓冲流对象创建时使用了其他流,最后关闭时只需关闭缓冲流就可以了,其他流会跟着自动关闭. 2.缓冲字符输入流(BufferedReader)可以直接 readLine() 一次读取一行,BufferedInputStream没有此方法. 3.用BufferedInputStream读取文件结束时返回的是-1,这和File流相同,不过如果使用BufferedReader的ReadLine()方法,读取到最后,返回的是null.

关于java中流的使用--文件以及socket

个人感觉,流是java中不同设备之间交换数据的媒介,例如socket中数据的传输,以及文件的读写操作等,都是通过流来实现的. 流的种类 从处理的数据类型上来看,流主要分为字符流(InputStream, OutputStream)和字节流(Reader, Writer),而从功能上来看,主要分为输入流以及输出流. 文件的读写 File file =newFile(".\\test.txt"); //参数true:表示在文件后边追加内容 FileOutputStream fileOutp

Java中流的概念和递归算法

文件类: java.io.File 基本方法; geName: 获取文件名称 getPath: 获取文件路径 length: 获取文件大小 isDirectory: 判断这个东西是不是一个目录 isFile: 判断这个东西是不是一个文件 listFiles: 获取当前这个路径下面所有的文件和文件夹 IO流 什么是流 流, 可以看成是一根管道, 用来读取文件的数据 原始的数据都是用过二进制的形式来进行数据的传输, 文件---10111010-->程序 文件<--10111010---程序 流的分

Java中流-----个人总结心得

流 数据流---用于传输数据.IO流---Input/Output流.数据从外部流向程序---输入流:数据从程序流向外部的时候--输出流.读取一个文件---数据从文件流向程序---输入流:向一个文件中写入数据---数据从程序流向文件---输出流 根据数据流动的方向:输入流/输出流 根据数据传输的形式:字节流/字符流 输入流 输出流 字节流 InputStream OutputSteam 字符流 Reader Writer 这四个类是Java中四个流的基本类,但是这四个类都是抽象类,都不能用于直接

关于java中输出流flush()方法

在java开发中,有时我们会进行流的操作,所以可能会经常遇到这样一段代码 out.flush(); out.close(); 有时我们只是大概看懂这些,却不知道其中的原理性东西,下面就来理解一下: flush()这个函数是清空的意思,用于清空缓冲区的数据流,进行流的操作时,数据先被读到内存中,然后再用数据写到文件中,那么当你数据读完时,我们如果这时调用close()方法关闭读写流,这时就可能造成数据丢失,为什么呢,因为,读入数据完成时不代表写入数据完成,一部分数据可能会留在缓存区中,为了理解这个

Java中流的概念

http://wapwenku.baidu.com/view/04714847b307e87101f69656.html?ssid=0&from=1086k&uid=0&[email protected],[email protected]_2002,[email protected]_1_8.4_2_6.4&bd_page_type=1&baiduid=56F05653706D3FCEAB383E0A95BFD8DF&tj=wenkuala_2_0_10_

Java BufferedWriter的flush()方法简介

1.BufferedWriter简介 BufferedWriter是缓冲输入流,意思是调用BufferedWriter的write方法时候.数据是先写入到缓冲区里,并没有直接写入到目的文件里. 2.flush()方法简介 调用BufferedWriter的flush()方法时,会刷新一下该缓冲流,也就是把数据写入到目标文件里.或者可以调用BufferedWriter的close()方法,该方法会在关闭该输入流之前先刷新一下该缓冲流.也会把数据写入到目标文件里. 3.坑 如果在未flush或者cl

Java之IO类的体系结构

Java中IO操作主要是指使用Java进行输入,输出操作,Java中所有的操作类都存放在Java.io包中,在使用时需要导入此包. 在整个Java.io包中最重要的就是5个类和一个接口.5个类指的是File.OutputStream.InputStream.Writer.Reader:一个接口指的是Serializable.掌握了这些IO的核心操作那么对于Java中的IO体系也就有了一个初步的认识了. 一.java.io包中流的分类 Java.io包中定义了多个流类型类实现输入输出的功能,从不同

java基础篇---I/O技术

对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输入流:数据源到程序(inputStream,Reader读进来) 输出流:程序到目的地(OutPutStream,Writer写出去) 处理数据单元: 字节流:按照字节读取数据(InputStream,OutputStream) 字符流:按照字符读取数据(Reader,Writer) 功能不同 节点流:直接从数据源或目的地读写数据 处