字符输入、输出流(字符缓冲数组)

本文详细解析了字符流和字节流的概念,包括它们的读写原理、应用场景及如何选择使用。通过实例展示了FileReader、FileWriter、BufferedReader等类的使用方法,以及在拷贝文件时两者的区别。

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

字节流: 字节流读取的是文件中的二进制数据,读到的数据并不会帮你转换成你看得懂的字符。

字符流: 字符流会把读到的二进制的数据进行对应的编码与解码工作。 字符流=字节流+编码解码
输入字符流:
----------】Reader 输入字符流的基类 抽象类
-------------------】FileReader 读取文件的输入字符流。
-------------------】 BufferedReader 缓冲输入字符流,缓冲输入字符流出现的目的是为了提高读取文件字符的效率和拓展了FileReader的功能。该类内部也是维护了一个字符数组

FileReader的用法:
1.找到目标文件
2.建立数据的输入通道

 public static void readTest() throws IOException {
	  File file=new File("D:\\ecplise\\cxjt\\src\\Input\\Demo1.java");
	  //建立数据的输入通道
	  FileReader f=new FileReader(file);
	  int content=0;
	  while((content=f.read())!=-1) {//每次只读取一个字符,效率低,使用缓冲字符数组
		  System.out.print((char)content);
	  }
	  f.close();
  }

每次只读取一个字符,效率低,使用缓冲字符数组

public static void readTest2() throws IOException {
	File file=new File("D:\\ecplise\\cxjt\\src\\Input\\Demo1.java");
	  //建立数据的输入通道
	  FileReader f=new FileReader(file);
	  char[] buf=new char[1024];
	  int length=0;
	  while((length=f.read(buf))!=-1) {
		  System.out.println(new String(buf,0,length));
	  }
	  f.close();
}

BufferedReader的使用步骤:
1.找到目标文件
2.建立通道
3.建立缓冲输入字符流


输出字符流:
------】 Writer 输出字符流的基类。抽象类
---------】 FileWriter 向文件输出数据的输出字符流
FileWriter的使用步骤:
1.找到目标文件
2.建立数据输出通道
3.写出数据
4.关闭资源

      File file=new File("D:\\src\\a.txt");
	  //建立通道
	  FileReader f=new FileReader(file);
	  //建立缓冲输入字符流
	  BufferedReader buff=new BufferedReader(f);
	  int content =0;
	  //读到了一个字符,读取的字符肯定也是从BufferedReader内部的字符数组中获取得,所以效率高
       while((content= buff.read())!=-1) {
	  System.out.print((char)content);
	 }
	  buff.close();

使用BufferedReader拓展的功能,readLine() 一次读取一行文本,如果读到了文件的末尾返回

File file=new File("D:\\src\\a.txt");
	  //建立通道
	  FileReader f=new FileReader(file);
	  //建立缓冲输入字符流
	  BufferedReader buff=new BufferedReader(f);
	  String line=null;
	  while((line=buff.readLine())!=null) { //虽然readLine每次读取一行数据,但是返回的line是不包含\r\n的
		  System.out.println(line);
	  }  
 buff.close();

FileWriter要注意的事项:

  1. 使用FileWriter写数据的时候,FileWriter内部是维护了一个1024个字符数组的,写数据的时候会先写入到它内部维护的字符数组中,如果需要把数据真正写到硬盘上,需要调用flush或者close方法或者是填满了内部的字符数组。
  2. 使用FileWriter的时候,如果目标文件不存在,那么会自动创建目标文件
  3. 使用FileWriter的时候,如果目标文件已经存在了,那么默认情况会先清空文件中的数据,然后再写入数据,如果需要在原来的基础上追加数据,需要使用new FileWriter(File,boolean)的构造方法,第二参数为true。
    File file=new File("d:\\src\\a.txt");
	FileWriter f=new FileWriter(file,true);
	String data="今天天气很好!!!";
	f.write(data);
	f.flush();//刷新字符流
	f.close();//关闭资源

字符流拷贝文件(图片)

	使用字符流拷贝文件
	    File file=new File("D:\\src\\图片\\a.txt");
		File file2=new File("D:\\src\\a.txt");
		FileReader filereader=new FileReader(file);
		FileWriter filewriter=new FileWriter(file2);
		char[] ca=new char[1024];
		int content=0;
		while((content=filereader.read(ca))!=-1) {
			filewriter.write(ca,0,content);
			filewriter.flush();
		}
		filewriter.close();
		filereader.close();
	   使用字符流拷贝图片 
	    File file=new File("D:\\src\\图片\\1.jpg");
		File file2=new File("D:\\src\\12345.jpg");
		FileReader filereader=new FileReader(file);
		FileWriter filewriter=new FileWriter(file2);
		char[] ca=new char[1024];
		int content=0;
		while((content=filereader.read(ca))!=-1) {
			filewriter.write(ca,0,content);
			filewriter.flush();
		}
		filewriter.close();
		filereader.close();

为什么使用字符流拷贝图片,图片内存变小,且无法打开?
在这里插入图片描述
标准的占俩个字节,返回的未知字符占一个字节,所以会出现丢失文件的情况

何时使用字符流,何时使用字节流?依据是什么?
使用字符流的应用场景:如果是读写字符数据的时候则使用字符流。
使用字节流的应用场景:如果读写的数据都不需要转换成字符的时候,则使用字节流。

### 字符数组输入输出 在 C 语言中,字符数组是一种常见的数据结构,用于存储字符串或其他字符序列。以下是关于字符数组输入和输出的一些重要概念以及示例代码。 #### 使用 `scanf` 和 `printf` 最简单的字符数组输入方法是通过 `scanf` 函数实现。然而,需要注意的是,`scanf` 默认会在遇到空白字符(如空格、制表符或换行符)时停止读取[^1]。因此,在某些情况下可能无法满足需求。 下面是一个基本的例子: ```c #include <stdio.h> int main() { char str[50]; printf("请输入一个字符串: "); scanf("%s", str); // 只能读取不带空格的字符串 printf("您输入字符串是: %s\n", str); return 0; } ``` 此代码仅适用于无空格的简单字符输入。 --- #### 使用 `fgets` 和 `puts/fputs` 为了能够处理带有空格的多词字符串,推荐使用 `fgets` 来代替 `scanf`。`fgets` 能够读取整行输入,直到达到指定的最大长度或者遇到换行符为止[^2]。 以下是一段完整的示例代码展示如何利用 `fgets` 进行更灵活的字符数组输入,并通过 `fputs` 或者 `puts` 将其输出: ```c #include <stdio.h> int main() { int n; printf("请输入输入字符串数量:"); scanf("%d", &n); getchar(); // 清除缓冲中的 '\n' for (int i = 0; i < n; ++i) { char str[51]; // 定义大小为51以防止溢出 printf("请输入第%d个字符串:\n", i + 1); fgets(str, sizeof(str), stdin); // 读取一行包括空格在内的字符串 // 输出字符串,去掉可能存在的多余换行符 if (str[strlen(str) - 1] == '\n') { str[strlen(str) - 1] = '\0'; // 替换掉最后一个换行符 } printf("您输入的第%d个字符串是:%s\n", i + 1, str); } return 0; } ``` 上述程序允许用户输入多个包含空格的字符串,并逐一显示它们的内容。 注意:如果输入超过预定义的字符数组容量,则可能导致未定义行为,例如内存覆盖等问题[^3]。所以在实际应用中应始终确保分配足够的空间来容纳预期的数据量。 --- #### 总结注意事项 - **边界条件**:务必考虑极端情况下的输入,例如非常短或极长的字符串。 - **安全措施**:采用适当的方法防范潜在的安全隐患,像缓冲区溢出等风险。 - **清理缓存**:当混合使用不同类型的 I/O 操作时,记得清除标准输入中的残留字符以防干扰后续操作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值