String(byte bytes[], int offset, int length)为什么字节转字符串时需要偏移量和长度?

2019-06-10 16:51:02 +08:00
 rizon

字节转字符串时,为什么会有偏移量这种东西?
偏移之后这一组的字节剩下的东西是什么东西呢?? 哪来的呢?干什么用的呢??

比如在读文件流时,或者读屏幕输入时,为什么会有一些不需要的信息?他们是给谁用的? 为啥不直接过滤掉?

2341 次点击
所在节点    程序员
10 条回复
feiyuanqiu
2019-06-10 17:05:59 +08:00
因为这是给需要从字节数组里取一部分出来构造字符串的场景提供的,你完全可以用另一个构造函数:

public String(byte bytes[]) {
this(bytes, 0, bytes.length);
}
akira
2019-06-10 17:09:48 +08:00
你需要的字符串 并不总是会从头开始的 需要根据实际情况来读取对应的结构
rizon
2019-06-10 17:15:20 +08:00
@feiyuanqiu #1
@akira #2
我想问的就是那些不需要的部分是怎么来的?
rizon
2019-06-10 17:15:46 +08:00
专门为这个提供一个 offset 的概念,而不是让用户自己分割好之后在传进来,而且在流读取的时候也需要用这个。
说明偏移量是一个较底层的原因产生的东西,我想知道的就是他是怎么产生的,是由于计算机的什么导致的?比如是因为 CPU ?
lff0305
2019-06-10 17:46:58 +08:00
比如你读文件要略过若干个字节的头部(比如 BOM )
更多的情况是你从网络读了一些 byte 过来,要略过头尾
littleylv
2019-06-10 17:58:34 +08:00
这种情况非常正常好不好,很多交互信息带了头(例如标志这条信息是什么东西)尾(例如校验位)
pmispig
2019-06-10 18:07:00 +08:00
我感觉这个方法多此一举,我自己会切割好再转。
ArthurRen
2019-06-10 18:09:54 +08:00
楼上这么做会增加内存开销啊
pursuer
2019-06-10 18:16:58 +08:00
@rizon 如果你说的是 Java,用户分割的时候会需要一次内存拷贝,生成 String 的时候需要拷贝一次,加上 offset 就可以只拷贝一次了
C++的 string 就直接传入的 char*,因为用户可以移动 char*指针不需要复制子串
rizon
2019-06-10 23:51:41 +08:00
@littleylv #6
@pursuer #9
ok 明白了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/572521

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX