不带缓冲的IO的标准输入到标准输出

本文详细介绍了如何在Linux/Unix系统中使用POSIX标准的read和write函数实现标准输入复制到标准输出的操作,通过代码示例解释了头文件、文件描述符、read和write函数的使用,以及与标准I/O实现的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在POSIX标准中提供了函数open, read, write, lseek以及close提供不带缓冲的IO,这些函数都是使用文件描述符;


在Linux/Unix系统中将标准输入复制到标准输出简单实现如下:

#include <unistd.h>

#define BUFFSIZE 4096

int 
main(int argc, char **argv)
{
    int n;
    char buf[BUFFSIZE];
    
    while((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0) {
        if(write(STDOUT_FILENO, buf, n) != n)
            err_sys("write error");
    }
    if(n < 0)
        err_sys("read error");
    
    exit(0);
}

解析:

头文件#include <unistd.h>和两个常量STDIN_FILENO, STDOUT_FILENO是POSIX标准的一部分,头文件#include <unistd.h>中包含了很多Unix系统服务的函数原型(如本例中的read和write);

两个常量STDIN_FILENO和STDOUT_FILENO定义在该头文件中,他们指定了标准输入和标准输出的文件描述符,在POSIX标准中他们的值分别是0和1.

read函数返回读取的字节数,此值用作要写的字节数。当到达输入文件的尾端时,read返回0,程序停止执行。如果发生了错误,read返回-1;


相比之下,标准I/O实现相同的功能,代码:

#include <unistd.h>

int 
main(int argc, char **argv)
{
    char c;
    
    while((c = getc(stdin)) != EOF) {
        if(putc(c, stdout) == EOF)
            err_sys("output error");
    }
    if(ferror(stdin))
        err_sys("input error");
    
    exit(0);
}

解析:

函数getc一次读取一个字符,然后函数putc将此字符写到标准输出。读到输入的最后一个字节时,getc返回常量EOF(该常量在头文件#include <stdio.h>中定义)。标准I/O也在改头文件中定义,他们分别表示标准输入和标准输出;

### Java 标准输入输出概述 Java标准输入输出机制提供了多种方式让程序能够与外部环境进行交互。以下是关于 Java 标准输入输出的核心知识点以及具体示例。 #### 1. **标准输入流 (System.in)** `System.in` 是一个字节流,默认情况下它连接到控制台,允许用户通过键盘输入数据。为了更方便地处理输入,通常会结合 `Scanner` 类一起使用[^1]。 ```java import java.util.Scanner; public class InputExample { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入您的名字: "); String name = scanner.nextLine(); // 使用 nextLine() 方法读取一行字符串 System.out.println("你好, " + name); System.out.print("请输入一个整数: "); int number = scanner.nextInt(); // 使用 nextInt() 方法读取一个整数 System.out.println("您输入的整数是: " + number); scanner.close(); } } ``` 以上代码展示了如何利用 `Scanner` 类从标准输入流中获取用户的姓名和年龄,并将它们打印出来[^1]。 --- #### 2. **标准输出流 (System.out)** `System.out` 同样是一个字节流,默认指向控制台,用于向用户显示信息。常用的输出方法有 `println()` 和 `print()`,分别用于换行符和换行符的输出。 ```java public class OutputExample { public static void main(String[] args) { System.out.println("这是一个有换行符的标准输出示例."); // 换行符 System.out.print("这是一个"); // 换行符 System.out.print("连续输出的例子."); } } ``` 运行此代码时,可以看到两部分输出被连在一起展示,因为第二个语句未调用换行功能。 --- #### 3. **File 类的应用** 除了标准输入输出外,Java 还支持基于文件的操作。`File` 类主要用于管理文件或目录的相关元信息,比如创建新文件、删除现有文件或者查询其属性等。 ```java import java.io.File; import java.io.IOException; public class FileExample { public static void main(String[] args) { File file = new File("example.txt"); try { if (!file.exists()) { // 如果文件存在,则尝试创建 boolean created = file.createNewFile(); if (created) { System.out.println("文件已成功创建!"); } else { System.out.println("无法创建文件."); } } System.out.println("文件名: " + file.getName()); System.out.println("绝对路径: " + file.getAbsolutePath()); System.out.println("是否可读: " + file.canRead()); System.out.println("是否可写: " + file.canWrite()); } catch (IOException e) { e.printStackTrace(); } } } ``` 这段代码演示了如何检测并创建一个新的文本文件,同时还包含了有关该文件的一些基本信息检索逻辑。 --- #### 4. **其他高级特性** 对于更加复杂的场景,还可以考虑引入缓冲区 (`BufferedReader`, `BufferedWriter`) 来提高性能;或者是采用 NIO 新型 IO 库实现非阻塞式的异步通信模式。这些技术超出了基础范围,在实际开发过程中可以根据需求逐步学习掌握。 --- ### 总结 本文介绍了 Java 中基本的标准输入输出操作及其简单应用实例,包括但限于 `System.in/out` 配合 `Scanner` 实现的人机对话界面设计思路,还有借助于 `File` API 完成本地存储资源访问的方法论探讨等内容[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值