private int readAvailable(byte[] bytes) throws IOException,InterruptedException{ int i = 0, a; boolean foundPrefix = false, foundSuffix = false; int ch = inputStream.read(); if(ch < 0)return ch; if (isPreSuffixEnabled) {//找前缀 if (ch != PREFIX) { while (inputStream.available() > 0) { if (inputStream.read() == PREFIX) { foundPrefix = true; break; } } //没找到前缀 if(!foundPrefix) { Log.e(TAG, "readAvailable: can not find prefix!"); return 0; } } foundPrefix = true; } else { bytes[i] = (byte) ch; i++; } while (true) { a = inputStream.available() + i; if(a <= i)break; for (; i < a; i++) { byte b = (byte) inputStream.read(); if (isPreSuffixEnabled && b == SUFFIX) { // Log.d(TAG, "readAvailable: found suffix"); foundSuffix = true; break; } bytes[i] = b; } if(!foundSuffix)Thread.sleep(4); else break; } // Log.d(TAG, "readAvailable: size="+i); return i; } }
时间: 2024-02-10 12:22:34 浏览: 49
这段代码是一个读取流中可用字节数的方法。主要的作用是读取流中的数据,并将其存储在字节数组中。具体来说,该方法首先定义了三个变量: `i`表示当前已经读取的字节数;`a`表示当前可用的字节数量;`foundPrefix`和`foundSuffix`分别表示是否已经找到了前缀和后缀。
接下来,该方法通过调用`inputStream.read()`方法读取流中的一个字节,并对其进行判断。如果读取到的字节小于0,则表示已经读取到了流的结尾,直接返回该值。
如果启用了前缀和后缀检查,那么该方法会判断当前读取的字节是否为前缀。如果不是前缀,则会循环读取流中的字节,直到找到前缀为止,或者流中的数据全部被读取完毕。如果没有找到前缀,则会输出错误日志并返回0。
如果找到了前缀,则将`foundPrefix`置为`true`。接下来,该方法会循环读取流中的字节,并将其存储在字节数组中。如果启用了前缀和后缀检查,则会在读取到后缀时,将`foundSuffix`置为`true`,并跳出循环。如果没有找到后缀,则会调用`Thread.sleep(4)`方法使线程等待4毫秒,并继续循环读取流中的字节。
最后,该方法返回已经读取的字节数。
相关问题
private int readAvailable(byte[] bytes) throws IOException,InterruptedException{ int i = 0, a; boolean foundPrefix = false, foundSuffix = false; int ch = inputStream.read(); if(ch < 0)return ch; if (isPreSuffixEnabled) {//找前缀 if (ch != PREFIX) { while (inputStream.available() > 0) { if (inputStream.read() == PREFIX) { foundPrefix = true; break; } }
这段代码是接收线程中的一个方法,用于读取蓝牙设备发送的数据,并将数据存储到字节数组中。首先定义了一个变量i用于记录字节数组中已经存储的数据长度,以及一个变量a用于记录当前读取到的字节。接着定义了两个标志变量foundPrefix和foundSuffix,用于判断前缀和后缀是否被找到。然后读取输入流中的一个字节,并判断读取的字节是否小于0,如果小于0则表示输入流已经被关闭,返回读取到的字节数。如果启用了前后缀模式,则判断当前读取到的字节是否等于前缀,如果不等于,则循环读取输入流中的数据,直到找到前缀为止。如果找到了前缀,则将foundPrefix标志设置为true。这个方法可以在Android中用于读取蓝牙设备发送的数据,并处理前后缀模式。
public synchronized void write(K key, V value) throws IOException { boolean nullKey = key == null || key instanceof NullWritable; boolean nullValue = value == null || value instanceof NullWritable; if (nullKey && nullValue) { return; } if (!nullKey) { writeObject(key); } if (!(nullKey || nullValue)) { out.write(keyValueSeparator); } if (!nullValue) { writeObject(value); } out.write(newline); } public synchronized void close(TaskAttemptContext context) throws IOException { out.close(); } } public RecordWriter<K, V> getRecordWriter(TaskAttemptContext job ) throws IOException, InterruptedException { Configuration conf = job.getConfiguration(); boolean isCompressed = getCompressOutput(job); String keyValueSeparator= conf.get(SEPERATOR, "\t"); CompressionCodec codec = null; String extension = ""; if (isCompressed) { Class<? extends CompressionCodec> codecClass = getOutputCompressorClass(job, GzipCodec.class); codec = (CompressionCodec) ReflectionUtils.newInstance(codecClass, conf); extension = codec.getDefaultExtension(); } Path file = getDefaultWorkFile(job, extension); FileSystem fs = file.getFileSystem(conf); if (!isCompressed) { FSDataOutputStream fileOut = fs.create(file, false); return new LineRecordWriter<K, V>(fileOut, keyValueSeparator); } else { FSDataOutputStream fileOut = fs.create(file, false); return new LineRecordWriter<K, V>(new DataOutputStream (codec.createOutputStream(fileOut)), keyValueSeparator); } } }请解释以上代码
这段代码是一个 Hadoop 的 MapReduce 程序中的输出部分的代码。主要包括了 `LineRecordWriter` 这个类的实现和 `getRecordWriter()` 方法的实现。
`LineRecordWriter` 实现了 `RecordWriter` 接口,用于将 MapReduce 程序的输出按照行的形式写入到文件中。`write()` 方法用于将键值对写入文件,如果键或值为 null 则不写入。`close()` 方法用于关闭输出流。
`getRecordWriter()` 方法用于获取一个 `RecordWriter` 对象。该方法首先获取配置信息,判断是否需要压缩输出。如果需要压缩输出,则获取压缩编解码器的类并创建一个对应的压缩文件;否则创建一个普通文件。最后返回一个 `LineRecordWriter` 对象,用于写入数据。
总体来说,这段代码实现了 MapReduce 程序的输出功能,支持压缩和非压缩两种格式的输出。
阅读全文