ACDBBB 2024-07-21 22:58 采纳率: 0%
浏览 2

BufferWrite的write方法为什么一定要换行才能写入

用BufferWrite实现让数据在客户端和服务器端进行传输。发现只有在使用write方法时加上换行符,数据才能在服务器端输出,否则就输出不了。这是为什么啊?BufferWrite必须有换行符才能写入数据吗?
以下是代码:

// 客户端
public class ProducerStarter_V3 {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("localhost", 9090);
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter br = new BufferedWriter(new OutputStreamWriter(outputStream));

        Properties properties = new Properties();
        properties.load(new FileReader(".\\conf\\producer.properties"));

        String datasourceClassname = properties.getProperty("datasource_classname");
        String datasourceConstructorParam = properties.getProperty("datasource_constructor_param");

        Class<?> aClass = Class.forName(datasourceClassname);
        Constructor<?> constructor = aClass.getConstructor(String.class);
        Iterator<String> dataSourceIter = (Iterator<String>) constructor.newInstance(datasourceConstructorParam);

        while (dataSourceIter.hasNext()) {
            String next = dataSourceIter.next();

            // 不太明白的位置
            br.write(next + "\n");
            br.flush();
        }
    }
}

// 服务器端
public class EngineStarter {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9090);
        Socket accept = serverSocket.accept();
        // 接收数据
        InputStream inputStream = accept.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));

        while (true) {
            String s = br.readLine();
            System.out.println(s);
        }
    }
}

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-07-21 22:58
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    你的理解是正确的。BufferedWriter 是 Java I/O 库中的一个类,它提供了一个字符缓冲区,可以提高写入操作的效率。但是,BufferedWriter 并不会自动将缓冲区中的数据发送到底层的 OutputStream。数据会存储在缓冲区中,直到缓冲区满了或者遇到换行符 \n,或者显式调用了 flush() 方法。

    这里是几个关键点,解释为什么在写入时需要使用换行符或调用 flush()

    1. 缓冲机制BufferedWriter 使用内部缓冲区来存储待写入的数据。这可以减少对底层输出流的写入次数,因为多个小的写入操作可以合并成一次较大的操作。

    2. 换行符的作用:当 BufferedWriter 遇到换行符 \n 时,它通常会将缓冲区中的数据发送出去。这是因为换行符通常表示一行文本的结束,发送整行数据是一个逻辑上的分界点。

    3. 显式刷新:如果你不想依赖换行符来触发数据的发送,你可以在写入后调用 flush() 方法。这会强制 BufferedWriter 将缓冲区中的数据发送到底层的 OutputStream,即使缓冲区没有满。

    4. 服务器端读取:在服务器端,BufferedReader 通过 readLine() 方法读取数据。这个方法会等待直到遇到换行符,然后将从上一个换行符到当前换行符(或文件末尾)之间的数据作为一行返回。如果没有换行符,readLine() 将不会返回任何数据。

    你的代码示例中,客户端在每次写入数据后都调用了 flush(),这是一个很好的实践,确保了数据能够及时发送到服务器端。然而,如果你希望减少 flush() 的调用次数以提高效率,你可以只在必要时(例如,发送完所有数据或在特定的逻辑分界点)调用 flush()

    此外,你的服务器端代码中存在一个潜在的无限循环问题。while (true) 循环会无限运行,除非程序被外部中断。在实际应用中,你可能需要添加适当的逻辑来处理连接的关闭和异常情况。

    最后,确保在客户端和服务器端都正确地关闭了资源,例如套接字和流,以避免资源泄露。这通常是通过使用 try-with-resources 语句或在 finally 块中关闭资源来实现的。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月21日

悬赏问题

  • ¥100 matlab2009 32位一直初始化
  • ¥15 Expected type 'str | PathLike[str]…… bytes' instead
  • ¥15 为什么在iis上部署网站,服务器可以访问,但是本地电脑访问不了
  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数
  • ¥15 ADS时域 连续相位观察方法
  • ¥15 Opencv配置出错
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像