十九 输入输出 I/0(一)

本文深入探讨Java中I/O流的基本概念与分类,详细讲解File类的使用方法,包括构造方法、获取路径、文件属性及操作等。同时,演示如何使用字节流实现文件的复制,是Java开发者理解文件操作与数据持久化的实用指南。

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

十九章 输入输出 I/0(一)

简单的回顾一下存储方式的演变临时存储数据

变量 – 数组–对象–对象的数组–集合(集合为程序内临时存储数据最常用的顶级存储方式)

一、掌握File类的常用API

文件的概念

相关记录或者放在一起的数据集合,它是需要存储在 长期存储 的设备上,有了它就能实现持久化存储。
java.io.File类: 可以实现对文件(File)/文件夹(directory 目录)的操作

构造方法:

1.File(String pathname) 直接根据一个字符串类型的地址获取对应的文件对象

2.File(String parent ,String child) 根据字符串类型的父路径和子路径获取对应的文件对象

3.File(File parent ,String child) 根据文件类型的父路径和子路径获取对应的文件对象


// 1.File(String pathname)
// File file = new File("d:/a.txt");
// File file = new File("d:\\a.txt");

// 2.File(String parent父路径,String child子路径)
// 通常应用于:你已经获取到了某个文件的父路径  然后只需要通过本构造即可实现路径自动拼接
// File file = new File("d:", "a.txt");

// 3.File(File parent,String child)
// 通常应用于:你已经获取到了某个文件的父路径(File对象型的)....
File parent = new File("d:");
File file = new File(parent , "a.txt");
// 获取文件的字节数
System.out.println(file.length());

获取相对路径: 相对于当前程序所在位置的一个文件路径地址
类似于…/demo1/TestConstructor.java
但是如果你的File对象的地址 本身填写的就是绝对路径 那么就没有相对路径而已

System.out.println(“相对路径:”+file.getPath());

获取绝对路径: 一个固定的地址 可以根据这个地址找到文件

类似于:d:/a.txt http://www.baidu.com

System.out.println(“绝对径:”+file.getAbsolutePath());

普通方法:

1.获取文件的字节数: long length();

2.判断文件/目录是否存在: boolean exists();

3.判断是否是文件:boolean isFile();

4.判断是否是为文件夹:boolean isDirectory();

5.获取相对路径: String getPath();

6.获取绝对路径:String getAbsolutePath();

7.获取文件/文件夹的名称: String getName();

8.删除文件/空文件夹(删除内容不会进入回收站):boolean delete();

9.获取文件夹下的所有 子目录 file[] listFiles();

10.创建文件(创建之前判断文件是否存在):boolean createNewFile();

11.创建文件夹:boolean mkdir();

二、掌握流的概念和分类

I/O流的概念

输入/输出流

方向性:相对于程序为参照物,流是有读取和写入操作 是有方向的。

按照处理单元:

字节流: 可以用来传输一切内容 音频 视频文本…根据美国ASCII码进行通信传输的

字节输入流 InputStream
字节输出流 OutputStream

字符流: 可以用来传输文本内容 根据不同国家进行了相应的文字转换(基于字节流产生的)

字符输入流 Reader
字符输出流 Writer

基类无法创建对象 所以需要创建子类

FileInputStream

FileOutputStream

三、掌握使用字节流实现文件复制

字节输入流FileInputStream

构造:

FileInputStream(File file);

FileInputStream(String pathname);

常用方法

1.读取一个字节数据:int read();

2.读取一个字节数组长度的字节数组 返回实际读取到的字节数量:int read(byte[] b);

3.读取输入流中从指定索引开始,指定长度的字节数据到字节数组中:int read(byte b,int offs, int len);

4.关流: void colse();


字节输出流FileOutputStream

构造

FileOutputStream(File file);

FileOutputStream( String path);

FileOutputStream( File/String file ,boolean append);如果为true表示可以追加数据 而不是覆盖

常用方法:

1.void write(int b);输出一个字节

2.void write(byte[] b);输出一个字节数组的内容

3.void write(byte[] b,int offs,int len);输出一个字节数组中的指定范围的内容

4.void close();关流

// 文件的复制
/**
 * 实现文件复制 将d:/a.txt 复制到 c:/a.txt
 */
public class Test {
	public static void main(String[] args) throws IOException {
		FileInputStream fis = null;		
		FileOutputStream fos = null;
		try {
		
			// 1.指定数据源和输出目的地
			fis = new FileInputStream("d:/a.txt");
			fos = new FileOutputStream("c:/a.txt");	
			
			// 2.读取数据
			// 临时存储读取到的数据
			byte[] buffer = new byte[1024];
			int len = 0;
			while((len = fis.read(buffer)) != -1) {
			
				// 3.写入数据  读取到多少写出去多少
				fos.write(buffer,0,len);
			}		
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
		
			// 4.关流
			// 先开的后关
			if(fos != null) {
				fos.close();
			}
			if(fis != null) {
				fis.close();
			}
		}
	}
}
<think>好的,用户想用C语言实现输入十个数然后输出最大值。我需要先理解这个问题,然后步步思考解决方案。 首先,用户需要的是输入十个数,然后找出其中的最大值。这在C语言中是个常见的数组应用问题。我应该考虑如何存储这十个数,然后遍历它们找出最大的那个。 接下来,我需要确定使用哪种数据结构。数组应该是最合适的,因为要处理多个相同类型的数据。定义个大小为10的数组,比如int numbers[10];,这样就可以存储十个整数了。不过用户没有明确说明是整数还是浮点数,但根据常见情况,先假设是整数,如果有需要可以稍作修改。 然后是输入部分。需要使用循环来读取十个数字。比如用for循环,从0到9,每次循环中使用scanf函数读取用户输入,并存储到数组的相应位置。这里要注意输入的格式是否正确,以及处理可能的输入错误,不过用户可能只需要基础实现,暂时不考虑异常处理。 接下来是找出最大值。通常的做法是初始化个变量max,假设数组的第个元素为最大值,然后从第二个元素开始遍历,依次比较每个元素和当前max的大小,如果当前元素更大,就更新max的值。这样循环结束后,max就是数组中的最大值了。 不过,需要考虑初始值的问题。如果数组可能包含负数,那么直接将max初始化为第个元素更安全,否则如果初始化为0的话,负数的情况就会出错。因此,正确的做法是将max初始化为数组的第个元素。 然后,把这些步骤整合到代码中。先包含头文件stdio.h,然后在main函数里定义数组和变量。使用循环读取输入,再另个循环比较找出最大值。最后打印结果。 测试下可能的边界情况,比如所有数都是负数,或者最大值在第个位置,或者在中间位置,确保代码都能正确处理。例如,输入的顺序不影响结果,因为每个元素都会被比较次。 有没有可能优化代码呢?比如在输入的同时进行比较,这样就不需要存储所有数字,节省内存空间。例如,先输入个数,赋值给max,然后循环输入剩下的九个数,每输入个就立刻和max比较,更新max的值。这样就不需要数组,适用于不需要保留所有输入的情况。这可能也是个更高效的解决方案,尤其是当数据量大的时候。不过用户的问题描述中没有明确是否需要存储所有数,所以两种方法都可以,但后者更节省内存。 但用户的要求是“输入十个数输出最大值”,并没有要求存储所有数,所以第二种方法更合适。这样代码会更简洁,也不需要数组。不过用户可能在学习数组的应用,所以可能需要数组的版本。不过作为回答,可以给出两种方法,或者选择更优的方案。 现在需要决定展示哪种方法。考虑到用户可能刚开始学习,可能更倾向于使用数组的方法,因为它展示了如何存储和处理多个数据。但也可以提到更高效的无需数组的方法,作为优化方案。 然后,编写代码。先写数组版本的代码: #include <stdio.h> int main() { int numbers[10]; int i, max; printf("请输入10个整数:\n"); for (i = 0; i < 10; i++) { scanf("%d", &numbers[i]); } max = numbers[0]; for (i = 1; i < 10; i++) { if (numbers[i] > max) { max = numbers[i]; } } printf("最大值是:%d\n", max); return 0; } 另种无需数组的版本: #include <stdio.h> int main() { int num, max, i; printf("请输入10个整数:\n"); scanf("%d", &max); // 输入个数作为初始max for (i = 1; i < 10; i++) { scanf("%d", &num); if (num > max) { max = num; } } printf("最大值是:%d\n", max); return 0; } 两种方法都有效,但第二种更节省内存。不过第种可能更容易理解,尤其是当需要后续处理所有数据时。需要根据用户的需求来决定。 可能用户是刚开始学习,所以详细解释数组版本会更合适。但也可以简要说明第二种方法作为补充。 在解释时,需要分步骤说明:输入、存储、比较、输出。确保用户理解每个步骤的作用。 最后检查代码是否有语法错误,比如变量声明、循环条件、scanf的地址符等。例如,数组的索引是否正确,循环次数是否正确(10输入),比较是否从第二个元素开始等。</think>以下是使用C语言实现“输入十个数输出最大值”的详细步骤和代码: --- ### **方法:使用数组存储数据** **步骤分析:** 1. **定义数组和变量**:用数组存储输入的10个数,用变量 `max` 记录最大值。 2. **输入数据**:通过循环读取用户输入的10个数。 3. **查找最大值**:遍历数组,逐个比较元素大小,更新 `max`。 4. **输出结果**:打印最大值。 ```c #include <stdio.h> int main() { int numbers[10]; // 存储10个数的数组 int max; // 记录最大值 int i; // 1. 输入数据 printf("请输入10个整数:\n"); for (i = 0; i < 10; i++) { scanf("%d", &numbers[i]); } // 2. 初始化max为第个元素 max = numbers[0]; // 3. 遍历比较,更新max for (i = 1; i < 10; i++) { if (numbers[i] > max) { max = numbers[i]; } } // 4. 输出结果 printf("最大值是:%d\n", max); return 0; } ``` --- ### **方法二:无需数组(节省内存)** **优化思路**:在输入时直接比较,无需存储所有数据。 ```c #include <stdio.h> int main() { int num; // 临时存储当前输入的数 int max; // 记录最大值 int i; // 1. 输入个数并初始化max printf("请输入10个整数:\n"); scanf("%d", &max); // 2. 输入剩余9个数,边输入边比较 for (i = 1; i < 10; i++) { scanf("%d", &num); if (num > max) { max = num; } } // 3. 输出结果 printf("最大值是:%d\n", max); return 0; } ``` --- ### **关键点解释** 1. **数组方法**: - 适合需要后续处理全部数据的场景(如排序、二次计算)。 - 明确存储所有输入值,逻辑直观。 2. **无数组方法**: - 内存占用更少,直接通过单次遍历完成比较。 - 适用于仅需最大值且无需保留数据的场景。 --- ### **测试示例** 输入: ``` 10 23 5 98 3 0 42 77 61 55 ``` 输出: ``` 最大值是:98 ``` --- 两种方法均能正确解决问题,选择取决于具体需求。建议初学者从**数组方法**入手,逐步理解循环和比较逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值