因为做毕业设计的需要,要用到 InputStream ,需要自己实现一个 InputStream 。因为 InputStream 是抽象类,已经有骨架实现,只需要实现 int read() 方法即可。
一开始是这样写的,
public int read(){
//此处略去若干字
byte b=...
//此处略去若干字
return (int)b ;
}
可是发现不对,流传着传着还没到结尾就完了。感觉很蹊跷,这个问题困扰我累计10小时,左思右想不得结果。api是这样解释 read 方法的
引用
从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。
看到这个我有些纳闷,byte 的取值范围是从-128 到 127,但他让我返回 0 到 255。
问题在于 将 byte 直接 转换为 int 值是不发生改变的。比如 -1 的 byte 转换 为 int 还为 -1。但如果将 -1 返回,那么就表示到达 流的结尾。所以应该将 byte 转换 为 0 到 255 范围的 int。但具体怎么转呢,我一开始是直接将 byte 加 128 然后 转为 int的。可是经过验证是错的。那具体应该怎么转呢? 正不行,倒着来。因为客户端在使用 read 方法是这样使用的
int i=in.read();
byte b=(byte)i;
看他们转换结果,反着来就可以了。经过测试 将 int 转换为 byte,当 int 在 0 到 127 范围内值是相等的;当 int 在 128 到 255 范围内,对应 byte 的 -128 到 -1,相当于减了个 256。所以猜想应该这样实现read 方法
public int read(){
//此处略去若干字
byte b=...
//此处略去若干字
if(b<0){
b=b+256;
}
return (int)b ;
}
。经验证正确。
分享到:
相关推荐
// 注意在这个地方进行了码制的转换,确保字节在0-255之间 int l = word_uni[j++] & 0xFF; char c = (char) (k + (l )); // 把高位和低位数组装起来 stringbuffer.append(c); } strReturn = stringbuffer....
- InputStream的read()方法用于读取单个字节,skip()方法跳过指定字节数,mark()和reset()方法用于设置和回溯读取位置,close()方法用于关闭流。 - OutputStream的write()方法用于写入单个字节,flush()方法刷新...
params)**:这是真正执行后台任务的地方,必须在这个方法中执行耗时操作,参数Params就是从execute()方法传入的任务参数。此方法运行在后台线程,不能更新UI。 3. **publishProgress(Progress... values)**:当需要...
- 方法抛出`Exception`,需要在调用该方法的地方进行捕获处理。 - 返回值为上传后的新文件名。 #### 四、代码实现细节 1. **路径创建**: - `File uploadFile = new File(dir);` 创建或获取目标目录对象。 - `...
在Android应用开发中,`assets`文件夹是一个特殊的地方,用于存放非结构化的数据文件,如文本、音频、视频或任何其他类型的数据。这个文件夹不在应用的资源ID系统中,因此不能通过R类直接访问,但我们可以使用`...
在Android开发中,`Assets`文件夹是一个特殊的地方,用于存放应用程序中需要的非资源文件,比如数据库文件、配置文件、大文本数据等。这些文件不会被编译进APK的R类,而是以原始格式存储,允许在运行时通过...
5. **打开数据库**:在需要使用数据库的地方,通过`getWritableDatabase()`或`getReadableDatabase()`方法打开已复制的数据库。这样,应用就可以像操作普通SQLite数据库一样进行查询、插入、更新和删除等操作了。 ...
注意,`assets`目录是存放原始资源的地方,这些资源在运行时可以通过`AssetManager`访问。 然后,在应用启动时,你需要将`assets`目录下的数据库复制到应用的`data/data/your_package_name/databases/`目录下,因为...
需要注意的是,由于权限限制,可能需要在运行时请求`READ_EXTERNAL_STORAGE`和`WRITE_EXTERNAL_STORAGE`权限。 4. **文件操作**: Android提供了`java.io`和`java.nio`包下的类来处理文件操作,如File、...
4. 获取和释放连接:在需要访问数据库的地方,调用getConnection()方法获取连接,使用完毕后调用close()方法归还连接。 下载附件功能通常涉及到HTTP协议和文件I/O操作。在Java中,可以使用HttpURLConnection或者...
3. **重写paint()方法**:Canvas的核心在于它的paint()方法,这是绘制图形的地方。我们需要在paint()方法中调用Graphics类的方法来绘制图片。获取Canvas的Graphics对象,然后使用drawImage()方法将图片绘制到Canvas...
while ((length = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, length); publishedProgress(downloadedBytes += length); } inputStream.close(); outputStream.close(); } catch ...
在Java开发中,有时我们需要将资源文件如图片嵌入到JAR(Java Archive)...在实际项目中,这通常是通过封装在静态方法或工具类中,以便在多个地方复用。对于开发者来说,掌握这种技巧能提高代码的可移植性和可维护性。
需要注意,读取文件时文件必须存在并可读,写入文件时,如果文件已存在,会覆盖原有内容。 3. 缓冲流(BufferedInputStream和BufferedOutputStream) 为了提高I/O操作的效率,Java引入了缓冲流。...
在进行Java IO操作时,需要注意异常处理。很多IO方法可能会抛出IOException,一般情况下,可以在方法签名中声明抛出该异常,或者在调用这些方法的地方捕获并处理异常。 总结来说,Java IO涵盖了从文件操作到数据流...
在Android开发中,`assets`目录是一个特殊的地方,用于存储应用程序需要但不通过资源ID访问的非结构化数据。这个目录下的文件不会被编译或压缩,而是原封不动地打包到APK中,可以在运行时通过AssetManager访问。本文...
1. **初始化DiskLruCache**: 首先在应用的`onCreate()`方法或者合适的地方实例化DiskLruCache。需要提供缓存目录路径、最大缓存大小(以字节为单位)、每个缓存项的值的数量(通常是4,对应键值对:key, value, ...
image = ImageIO.read(inputStream); } catch (IOException e) { e.printStackTrace(); } return image; } ``` 2. **图像转字符串** 将图像转换为字符串,最常见的做法是将图像数据编码成Base64格式。这...
需要注意的是,自Android 6.0(API级别23)开始,写入外部存储权限需要动态获取,所以在运行时需要检查并请求相应的权限。此外,从Android 3.0(API级别11)开始,推荐使用`DownloadManager`类来处理文件下载,因为...
这里需要注意的是,如果应用程序需要访问外部存储(如SD卡)上的文件,必须在AndroidManifest.xml文件中添加相应的权限: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ``...