Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 扩展阅读器,如何返回“我的”;读“什么?”;?_Java - Fatal编程技术网

Java 扩展阅读器,如何返回“我的”;读“什么?”;?

Java 扩展阅读器,如何返回“我的”;读“什么?”;?,java,Java,作为我的Java课程的一部分,我编写了一个“zip”编写器和阅读器——就像哈夫曼算法一样 我的类扩展了Reader,并有一个对象读取器r。 在我的主要方法中,我有以下几行: input = new BufferedReader(new HuffmanReader(new FileReader("output.hff"))); String str = input.readLine(); 当然,解压后,它应该返回我写入文件的解压字符串。但是它返回文件的第一行 我的阅读功能: public int

作为我的Java课程的一部分,我编写了一个“zip”编写器和阅读器——就像哈夫曼算法一样

我的类扩展了Reader,并有一个对象读取器r。 在我的主要方法中,我有以下几行:

input = new BufferedReader(new HuffmanReader(new FileReader("output.hff")));
String str = input.readLine();
当然,解压后,它应该返回我写入文件的解压字符串。但是它返回文件的第一行

我的阅读功能:

public int read(char[] cbuf, int off, int len) throws IOException {
    //...
    r.read(buffer,0,8192)
    //does the decompress process
    String fnlStr = ... //The final result
    cbuf = fnlStr.toCharArray();
    //close streams
    return cbuf.length;
}
“我的调试”窗口显示以下内容:

HuffmanReader.read(char[], int, int) line: 23   
BufferedReader.fill() line: not available   
BufferedReader.readLine(boolean) line: not available    
BufferedReader.readLine() line: not available   
Run.main(String[]) line: 23

它调用我的read函数两次。如何阻止bufferReader再次调用读取函数?

您只读取第一行。将第一部分更改为类似以下内容:

input = new BufferedReader(new HuffmanReader(new FileReader("output.hff")));
Arraylist<String> list = new ArrayList<String>();
String line;

while ((line = reader.readLine()) != null) {
    list.add(line);
}
input=newbufferedreader(newhuffmanreader(newfilereader)(“output.hff”));
Arraylist=新建Arraylist();
弦线;
而((line=reader.readLine())!=null){
列表。添加(行);
}

此外,要修复方法被调用两次的问题,请在方法中完成操作后,生成一个布尔值并将其设置为true。然后在该方法的开头,检查该布尔值是否为真。如果是,则从该方法返回,这样它就不会再执行之后的操作。

您不会像通常那样返回从该方法读取的数据。相反,当调用
read
时,调用者会向您提供数组
cbuf
,它本质上是一块内存的地址,并告诉您将
len
char
写入其中

当您执行
cbuf=fnlStr.toCharArray()
时,您只是将该地址的本地副本替换为另一个地址,但实际上并没有更改要写入的内存。您需要在
for
循环中给定的数组上迭代并写入,或者在构建了另一个包含结果的缓冲区时使用

例如,以下
read
方法将始终读取
“Test\n”

用解压缩的字符串替换
“Test\n”
文本应该可以开始了。当然,您仍然需要管理您已经消耗了多少资源


至于
BufferedReader
调用
read
两次:你不应该在意它被调用的频率。只需从底层源获取数据,将其写入
cbuf
,并返回已写入的
char
s的数量。如果没有剩余内容可读取,则返回
-1
以发出流结束的信号(在这种情况下,
BufferedReader
将停止调用
read


另外,
Reader
用于读取字符流,而(基本上是一样的,只是使用
byte[]
而不是
char[]
并且不使用字符集)。由于压缩文件是二进制文件,您可能需要将
文件读取器
切换到
文件输入流


如果出于某种原因,你编码的字符集与解码的字符集不同,我可以想象出奇怪的错误。或者,如果UTF-16中的一个16位代码单元需要UTF-8中的3个8位代码单元,您可能会使用比您想象的更多的空间。

1。在 Read()/Cuth>函数中,你会考虑<代码> Out<<代码>和<代码> Le<代码>吗?2.你需要BufferedReader吗(没有它你就不能测试吗)?你从
input
读取数据的唯一地方是
input.readLine()
,它自然只能读取一行数据。我有点惊讶,您的
read
函数居然可以工作,因为您实际上并没有写入传入的缓冲区,您只是将一个新缓冲区分配给
cbuf
。您也没有使用
r.read()返回的计数.
此代码不可能工作。当我从文件中读取时,我将读取到临时缓冲区中,直到8192个字符。如果超过8192,它会将其复制到传递给解压缩函数的字符串中,并读取下一个字符。作为练习的一部分,我不能改变主要内容。我不知道如何写入我的BufferedReader-这就是我所要求的。或者只调用该方法一次;-)@ImBatman64您好,我之前尝试过布尔运算,但没有成功,因为我不知道如何将结果写入缓冲区。当它下次出现时,它返回到String str一个带有一些空格的字符串。我不能改变主要部分——这是练习的一部分。BufferedReader正在尝试再次读取,尽管它应该只读取一行。@RoeiJacobovich您到底在哪里调用该方法?@ImBatman64,正如我在上面为主要部分所写的那样。我的input.readLine()调用我的read函数两次。RoeiJacobovich你能把完整的源代码发布到某个地方让我测试一下吗?这会很有帮助的。非常感谢!那是我的问题。它工作得很好!我知道读者的问题,这是我们这个练习的限制。非常感谢。
public int read(char[] cbuf, int off, int len) throws IOException {
    char[] result = "Test\n".toCharArray();
    int numRead = Math.min(len, result.length);
    System.arraycopy(result, 0, cbuf, off, numRead);
    return numRead;
}