第十九天-Java_IO(流)

本文阐述了字符流的缓冲区技术,包括如何在字符流写入与读取过程中使用缓冲区提高效率,同时介绍了装饰设计模式在增强已有对象功能上的应用。文中详细解释了字符流与字节流的区别,以及如何根据数据类型选择合适的流操作方式。
字符流的缓冲区
缓冲区的出现是为了提高流的操作效率而出现的。
所有在创建缓冲区之前,必须要现有流对象。
对应类:BufferedWriter、BufferedReader


字符流写入缓冲区:
//创建一个字符写入流对象
FileWriter fw = new FileWriter("buf.txt");
//为了提高字符写入流效率,加入缓冲技术。
//只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。
BufferedWriter bufw = new BufferedWriter(fw);
bufw.write("abcd");
//只要用到缓冲区,就必须要刷新。
bufw.flush();
//关闭缓冲区,就是关闭缓冲区中的流对象。
bufw.close();


字符流读取缓冲区:
readLine():读取一行的方法,读完时返回null。


装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义一个类,将已有对象传入,
基于已有功能,并提供加强功能。那么自定义的该类称为装饰类。


装饰类通常会通过构造方法接收被装饰的对象,
并基于被装饰的对象的功能,提供更强的功能。


装饰类与继承:
装饰模式比继承要灵活,避免了继承体系臃肿。而且降低了类与类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能。
所有装饰类和被装饰类通常都属于一个体系中的。


字符流:
FileReader、FileWriter
BufferedReader、bufferedWriter


字节流:
InputStream、OutputStream
BufferedInputStream、BufferedOutputStream


读取键盘录入。
System.out:对应的是标准输出设备,控制台。
System.in:对象的是标准输入设备,键盘。


流操作的基本规律:
1、明确源和目的。
源:输入流。InputStream、Reader
目的:输出流。OutputStream、Writer
2、操作的数据是否为纯文本。
是:字符流。Reader、Writer
否:字节流。InputStream、OutputStream
3、当体系明确后,在明确要使用哪个具体对象。
通过设备来区分:
源设备:内存,营养,键盘。
目的设备:内存,硬盘,控制台。
MAKE lua cd lua/src && make all CFLAGS="-Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 " MYLDFLAGS="" AR="ar rc" make[3]: 进入目录“/root/redis-7.0.12/redis-7.0.12/deps/lua/src” cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lapi.o lapi.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lcode.o lcode.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o ldebug.o ldebug.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o ldo.o ldo.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o ldump.o ldump.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lfunc.o lfunc.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lgc.o lgc.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o llex.o llex.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lmem.o lmem.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lobject.o lobject.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lopcodes.o lopcodes.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lparser.o lparser.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lstate.o lstate.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lstring.o lstring.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o ltable.o ltable.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o ltm.o ltm.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lundump.o lundump.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lvm.o lvm.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lzio.o lzio.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o strbuf.o strbuf.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o fpconv.o fpconv.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lauxlib.o lauxlib.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lbaselib.o lbaselib.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o ldblib.o ldblib.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o liolib.o liolib.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lmathlib.o lmathlib.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o loslib.o loslib.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o ltablib.o ltablib.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lstrlib.o lstrlib.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o loadlib.o loadlib.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o linit.o linit.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lua_cjson.o lua_cjson.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lua_struct.o lua_struct.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lua_cmsgpack.o lua_cmsgpack.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lua_bit.o lua_bit.c ar rc liblua.a lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o strbuf.o fpconv.o lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o lstrlib.o loadlib.o linit.o lua_cjson.o lua_struct.o lua_cmsgpack.o lua_bit.o # DLL needs all object files ranlib liblua.a cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o lua.o lua.c cc -o lua lua.o liblua.a -lm cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o luac.o luac.c cc -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' -DLUA_USE_MKSTEMP -O2 -c -o print.o print.c cc -o luac luac.o print.o liblua.a -lm make[3]: 离开目录“/root/redis-7.0.12/redis-7.0.12/deps/lua/src” MAKE hdr_histogram cd hdr_histogram && make make[3]: 进入目录“/root/redis-7.0.12/redis-7.0.12/deps/hdr_histogram” cc -std=c99 -Wall -Os -g -DHDR_MALLOC_INCLUDE=\"hdr_redis_malloc.h\" -c hdr_histogram.c ar rcs libhdrhistogram.a hdr_histogram.o make[3]: 离开目录“/root/redis-7.0.12/redis-7.0.12/deps/hdr_histogram” MAKE jemalloc cd jemalloc && ./configure --with-version=5.2.1-0-g0 --with-lg-quantum=3 --with-jemalloc-prefix=je_ CFLAGS="-std=gnu99 -Wall -pipe -g3 -O3 -funroll-loops " LDFLAGS="" /bin/sh: ./configure: 权限不够 make[2]: *** [jemalloc] 错误 126 make[2]: 离开目录“/root/redis-7.0.12/redis-7.0.12/deps” make[1]: [persist-settings] 错误 2 (忽略) CC adlist.o In file included from adlist.c:34:0: zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录 #include <jemalloc/jemalloc.h> ^ 编译中断。 make[1]: *** [adlist.o] 错误 1 make[1]: 离开目录“/root/redis-7.0.12/redis-7.0.12/src” make: *** [all] 错误 2 [root@java20241201 redis-7.0.12]# ls -l src/mkreleasehdr.sh -rwxr-xr-x. 1 root root 735 9月 23 19:04 src/mkreleasehdr.sh
最新发布
09-24
<think> 我们正在解决Redis 7.0.12编译过程中的两个问题: 1. `/bin/sh: ./configure: 权限不够` 2. `致命错误:jemalloc/jemalloc.h:没有那个文件或目录` ### 问题分析 1. **权限问题**:在编译过程中,当执行`./configure`脚本时,如果该脚本没有可执行权限,就会报告“权限不够”。这通常发生在从源码包中解压出来的文件权限不正确的情况下。 2. **jemalloc头文件缺失**:Redis默认使用jemalloc作为内存分配器,但如果系统中没有安装jemalloc开发包,或者jemalloc的头文件不在标准路径,编译时就会找不到头文件。 ### 解决方案 #### 步骤1:安装编译依赖 首先确保系统已安装必要的编译工具和库。以CentOS/RHEL为例: ```bash sudo yum groupinstall "Development Tools" sudo yum install -y jemalloc-devel ``` 对于Ubuntu/Debian系统: ```bash sudo apt update sudo apt install -y build-essential libjemalloc-dev ``` #### 步骤2:修复脚本权限 进入Redis源码目录,为所有必要的脚本添加可执行权限: ```bash cd redis-7.0.12 # 修复configure脚本权限 chmod +x configure # 修复src目录下关键脚本权限 chmod +x src/mkreleasehdr.sh # 修复deps/jemalloc目录下配置脚本权限 chmod +x deps/jemalloc/configure ``` #### 步骤3:强制使用jemalloc 如果系统已安装jemalloc但编译时仍找不到头文件,可以显式指定jemalloc路径: ```bash # 清除之前失败的编译结果 make distclean # 使用jemalloc进行编译(关键步骤) make MALLOC=jemalloc ``` #### 步骤4:验证jemalloc安装 检查jemalloc开发包是否安装成功: ```bash # 检查jemalloc头文件是否存在 ls /usr/include/jemalloc/jemalloc.h # 检查jemalloc库文件是否存在 ls /usr/lib*/libjemalloc.so ``` 如果以上文件不存在,可能需要重新安装jemalloc开发包。 ### 完整编译程 ```bash # 1. 安装依赖 sudo yum install -y gcc make jemalloc-devel # 2. 进入源码目录 cd redis-7.0.12 # 3. 修复权限 chmod +x configure chmod +x deps/jemalloc/configure chmod +x src/mkreleasehdr.sh # 4. 编译安装 make MALLOC=jemalloc sudo make install ``` ### 技术要点说明 1. **权限修复** Redis源码包中的部分脚本默认没有可执行权限,需要手动添加[^1]。 2. **jemalloc强制指定** 使用`MALLOC=jemalloc`参数确保编译时链接正确的内存分配器[^3]。 3. **开发包依赖** jemalloc-devel(或libjemalloc-dev)提供编译所需的头文件和链接库。 ### 潜在问题排查 - **错误:`jemalloc.h: No such file or directory`** 解决方案: ```bash # 查找jemalloc.h位置 sudo find / -name jemalloc.h # 如果找到不在标准路径,创建符号链接 sudo ln -s /path/to/jemalloc.h /usr/include/ ``` - **错误:`undefined reference to 'je_malloc'`** 说明链接阶段找不到jemalloc库,确保编译命令包含`-ljemalloc`参数(通过`MALLOC=jemalloc`自动添加)。 ### 编译优化建议 ```bash # 使用更优化的编译选项 make CFLAGS="-march=native -O2" MALLOC=jemalloc ``` §§ 相关问题 §§ 1. 如何验证Redis运行时使用的是jemalloc内存分配器? 2. Redis编译安装后如何配置为系统服务? 3. 如何为Redis配置持久化策略? 4. Redis集群部署需要修改哪些关键参数? 5. 生产环境中Redis性能调优有哪些常用方法?[^4] [^1]: Redis编译权限问题参考官方文档: https://redis.io/docs/getting-started/installation/install-redis-from-source/ [^3]: 内存分配器选择指南: https://engineering.linkedin.com/blog/2015/05/improving-performance-with-jemalloc [^4]: Redis生产环境优化: https://redis.io/topics/latency </think> ### 解决 Redis 7.0.12 编译错误的完整方案 #### 🔍 问题分析 1. **`/bin/sh: ./configure: 权限不够`** 编译脚本缺少可执行权限,常见于源码包解压后权限丢失的情况。 2. **`致命错误:jemalloc/jemalloc.h:没有那个文件或目录`** 系统缺少 jemalloc 开发库或头文件,需安装依赖并显式启用 jemalloc。 --- ### ✅ 分步解决方案 #### 第一步:修复权限问题 ```bash # 进入 Redis 源码目录 cd redis-7.0.12 # 授予关键脚本执行权限(核心步骤) chmod +x configure chmod +x deps/jemalloc/configure # 特别注意此文件[^1] chmod +x src/mkreleasehdr.sh # 验证权限 ls -l configure deps/jemalloc/configure ``` *预期输出*:`-rwxr-xr-x`(含 `x` 表示成功) #### 第二步:解决 jemalloc 依赖 ```bash # 安装 jemalloc 开发库(CentOS/RHEL) sudo yum install -y jemalloc jemalloc-devel # Ubuntu/Debian 系统使用 # sudo apt install -y libjemalloc-dev # 清理旧编译文件 make distclean ``` #### 第三步:显式启用 jemalloc 编译 ```bash # 关键编译命令(必须指定内存分配器) make MALLOC=jemalloc ``` #### 第四步:完整安装程 ```bash # 1. 安装基础编译工具 sudo yum install -y gcc make automake autoconf # 2. 修复所有脚本权限 chmod +x configure src/mkreleasehdr.sh deps/*/configure # 3. 编译安装 make MALLOC=jemalloc sudo make install PREFIX=/opt/redis ``` --- ### 💡 关键技术点 1. **权限修复优先级** `deps/jemalloc/configure` 权限缺失是导致 `jemalloc.h` 错误的常见原因[^1],必须显式修复: $$ \text{chmod} +x \text{deps/jemalloc/configure}$$ 2. **jemalloc 显式启用** Redis 默认尝试使用 jemalloc,但需通过编译参数强制指定: $$ \text{make MALLOC=jemalloc}$$ 3. **依赖验证命令** ```bash # 检查 jemalloc 头文件 ls /usr/include/jemalloc/jemalloc.h # 验证编译器路径 which cc ``` --- ### ⚠️ 常见错误排查 | 错误现象 | 解决方案 | |---------|---------| | `cc: not found` | 安装 gcc: `sudo yum install gcc` | | `jemalloc.h missing` | 检查 `jemalloc-devel` 是否安装 | | 权限修复后仍报错 | 执行 `make distclean` 彻底清理 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值