Buffered-Input/Output

本文深入探讨了如何通过使用BufferedInputStream和BufferedOutputStream来提高文件读写效率。详细介绍了缓冲流的工作原理,以及如何通过减少硬件设备的读写次数来优化性能。同时,文章还提供了实际的代码示例,展示了如何实现数据的批量读写。

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

Buffered

BufferedOutputStream 在向硬件设备做写出操作时,增大写出次数无疑会降低写出效率,为此我们可以使用缓冲输出流来一次性批量写出若干数据减少写出次数来提高写出效率。BufferedOutputStream缓冲输出流内部维护着一个缓冲区,每当我们向该流写数据时,都会先将数据存入缓冲区,当缓冲区已满时,缓冲流会将数据一次性全部写出。

flush 方法 使用缓冲输出流可以提高写出效率,但是这也存在一个问题,就是写出数据缺乏即时性。有时需要在执行完某些写出操作后,就希望将这些数据确实写出,而不是在缓冲区中保存知道缓冲区满后才写出。这就需要flush方法了。

BufferedInputStream BIS是一个处理流,该流为我们提供了缓冲功能。在读取数据时若以字节为单位读取数据,会导致读取次数过于频繁从而大大降低读取效率。为此我们可以通过提高一次读取的字节数量减少读写次数来提高读取的效率。BufferedInputStream是缓冲字节输入流。其内部维护着一个缓冲区(字节数组),使用该流在读取一个字节时,该流会尽可能多的一次性读取若干字节并存入缓冲区,然后逐一的将字节返回,直到缓冲区中的数据被全部读取完毕,会再次读取若干字节从而反复,这样就减少了读取的次数,提高了读取效率。

	public static void main(String[] args) {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
		writeBuffer("D:\\b.txt","\r\nINFO Time:"+simpleDateFormat.format(new Date().getTime())+" hello world");
		readBuffer("D:\\b.txt");
	}
	
	
	public static void writeBuffer(String pathName , String str) {
		try (
			// true 表示 是否追加,true:追加 false:覆盖
			FileOutputStream output = new FileOutputStream(new File(pathName),true);
			// 所有的字节被存入缓冲区,等待一次性写出
			BufferedOutputStream bos = new BufferedOutputStream(output);
				){
			byte[] b = str.getBytes();
			bos.write(b);
			bos.flush();	 //强制将缓冲区已缓存数据一次性写出
			System.out.println("写出完毕");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	public static void readBuffer(String pathName) {
		 
	        try (
	        	BufferedInputStream bufferedInput  = 
	        		new BufferedInputStream(new FileInputStream(pathName));
	        		){
	            int len = 0;
	            byte[] buffer = new byte[1024];
	            //从文件中按字节读取内容,到文件尾部时read方法将返回-1
	            while ((len = bufferedInput.read(buffer)) != -1) {
	                //将读取的字节转为字符串对象
	            	String info = new String(buffer, 0, len);
	                System.out.print(info);
	            }

	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	}

[ 34%] Generating C++ code from carla_msgs/CarlaBoundingBox.msg Traceback (most recent call last): File "/opt/ros/noetic/share/gencpp/cmake/../../../lib/gencpp/gen_cpp.py", line 50, in <module> sys.argv, msg_template_map, srv_template_map) File "/opt/ros/noetic/lib/python3/dist-packages/genmsg/template_tools.py", line 213, in generate_from_command_line_options generate_from_file(argv[1], options.package, options.outdir, options.emdir, options.includepath, msg_template_dict, srv_template_dict) File "/opt/ros/noetic/lib/python3/dist-packages/genmsg/template_tools.py", line 154, in generate_from_file _generate_msg_from_file(input_file, output_dir, template_dir, search_path, package_name, msg_template_dict) File "/opt/ros/noetic/lib/python3/dist-packages/genmsg/template_tools.py", line 99, in _generate_msg_from_file search_path) File "/opt/ros/noetic/lib/python3/dist-packages/genmsg/template_tools.py", line 77, in _generate_from_spec interpreter = em.Interpreter(output=ofile, globals=g, options={em.RAW_OPT:True,em.BUFFERED_OPT:True}) AttributeError: module 'em' has no attribute 'RAW_OPT' make[2]: *** [ros-bridge/carla_msgs/CMakeFiles/carla_msgs_generate_messages_cpp.dir/build.make:84:/home/dwh/carla-ros-bridge/catkin_ws/devel/include/carla_msgs/CarlaBoundingBox.h] 错误 1 make[2]: *** 正在删除文件“/home/dwh/carla-ros-bridge/catkin_ws/devel/include/carla_msgs/CarlaBoundingBox.h” make[1]: *** [CMakeFiles/Makefile2:1497:ros-bridge/carla_msgs/CMakeFiles/carla_msgs_generate_messages_cpp.dir/all] 错误 2 make: *** [Makefile:141:all] 错误 2 Invoking "make -j1" failed
最新发布
03-16
<think>嗯,用户遇到了在生成C++代码时出现的错误,具体是跟`carla_msgs/CarlaBoundingBox.msg`有关的。错误信息显示`AttributeError: module 'em' has no attribute 'RAW_OPT'`,这看起来是Python模块的问题。 首先,我需要回忆一下ROS中的消息生成机制。`gencpp`是用于生成C++消息代码的工具,它依赖于`genmsg`和`empy`模块。错误发生在`gen_cpp.py`的第50行,调用模板工具时,`em`模块缺少`RAW_OPT`属性。这说明可能是`empy`模块的版本不兼容,或者安装有问题。 接下来,我应该检查`empy`模块。在较新的版本中,可能某些常量名称发生了变化。例如,`em.RAW_OPT`可能被重命名或移除了。查看ROS Noetic的文档,发现Noetic默认使用Python3,而`empy`的Python3版本可能需要不同的处理方式。用户是否安装了正确版本的`empy`?或者是否存在多个版本的冲突? 用户使用的ROS版本是Noetic,对应Ubuntu 20.04和Python3。而`empy`在Noetic中应该通过`python3-empy`包安装。如果用户通过apt安装的,可能需要确认是否安装正确。或者,是否通过pip安装了其他版本的`empy`,导致冲突? 另一个可能性是`genmsg`或`gencpp`的版本过旧,不支持当前的`empy`。可能需要更新这些包,或者回退到兼容的版本。但ROS的包通常有固定的版本依赖,所以更可能的是`empy`的问题。 用户看到的错误是在执行`make`时发生的,说明编译过程中触发了消息生成步骤。这时候,`gen_cpp.py`调用了`empy`模块,但找不到`RAW_OPT`属性。查阅`empy`的文档,发现`RAW_OPT`可能已经被弃用,或者需要特定的导入方式。例如,某些版本可能需要从`em`模块的子模块中导入这些选项。 或者,这个问题可能已经被ROS社区修复了。可以查看相关的ROS包问题追踪,比如`genmsg`或`gencpp`的GitHub仓库,是否有类似的issue。例如,搜索“AttributeError: module 'em' has no attribute 'RAW_OPT'”可能会找到相关的讨论,其中提到需要更新某个包或者应用补丁。 解决方案可能包括重新安装`empy`,确保使用正确的版本,比如通过apt安装`python3-empy`。或者,手动修改生成脚本,将`em.RAW_OPT`替换为新的常量名。例如,在某些版本中,`RAW_OPT`可能被改为小写或者其他命名方式。 此外,检查用户的Python环境是否有冲突。比如,是否在虚拟环境中使用了不同的`empy`版本,或者全局安装的版本不正确。用户可能无意中通过pip安装了最新版的`empy`,而ROS Noetic需要的是特定版本。 总结可能的解决步骤:1. 确认`empy`正确安装,使用`apt-get install python3-empy`;2. 检查是否有其他版本的`empy`被优先加载;3. 更新或修复相关的ROS包;4. 手动修改生成脚本中的常量名称(如果有补丁的话)。 最后,建议用户按照这些步骤尝试,并附上相关的命令和检查方法,确保环境配置正确。</think>该错误是由于ROS的代码生成工具`gencpp`在调用`empy`模板引擎时出现兼容性问题导致的。以下是分步解决方案: $$ \text{AttributeError: module 'em' has no attribute 'RAW\_OPT'} $$ **问题分析** 1. 核心错误:`empy`模块缺少`RAW_OPT`属性,表明安装的empy版本与ROS工具链不兼容 2. 环境依赖:ROS Noetic (Python3) 需要特定版本的`python3-empy` 3. 典型场景:常见于从源码编译ROS软件包时 **解决方法** 1. 安装正确依赖包 ```bash sudo apt-get update sudo apt-get install python3-empy ``` 2. 检查Python环境路径 ```bash # 确认empy安装路径 python3 -c "import em; print(em.__file__)" # 预期输出应为:/usr/lib/python3/dist-packages/em.py ``` 3. 清理并重新编译 ```bash cd ~/carla-ros-bridge/catkin_ws rm -rf devel build catkin_make clean catkin_make ``` **附加说明** - 若使用虚拟环境,需确保`empy`安装在系统Python路径 - 避免使用`pip install empy`,ROS Noetic要求通过apt安装的特定版本 - 该错误常见于混合使用ROS二进制包和源码编译包的情况 **验证方法** ```bash # 验证empy版本 apt show python3-empy | grep Version # 正确应显示:Version: 3.3.2-1.1 ``` 完成上述步骤后,重新执行编译过程应可解决该错误。如问题仍然存在,建议检查ROS工作空间的环境配置是否完整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值