gpt4 book ai didi

java - 我如何找出从流中读取了多少个字符或字节?

转载 作者:行者123 更新时间:2023-11-30 09:35:54 25 4
gpt4 key购买 nike

Java 有 LineNumberReader这让我可以跟踪我所在的行,但我如何跟踪流中的字节(或字符)位置?

我想要类似 lseek(<fd>,0,SEEK_CUR) 的东西对于 C 中的文件。

编辑:我正在使用 LineNumberReader in = new LineNumberReader(new FileReader(file)) 读取文件我希望能够时不时地打印“已处理文件的 XX%”之类的内容。我知道的最简单的方法是查看 file.length()首先将当前文件位置除以它。

最佳答案

我建议如下扩展 FilterInputStream

public class ByteCountingInputStream extends FilterInputStream {

private long position = 0;

protected ByteCountingInputStream(InputStream in) {
super(in);
}

public long getPosition() {
return position;
}

@Override
public int read() throws IOException {
int byteRead = super.read();
if (byteRead > 0) {
position++;
}
return byteRead;
}

@Override
public int read(byte[] b) throws IOException {
int bytesRead = super.read(b);
if (bytesRead > 0) {
position += bytesRead;
}
return bytesRead;
}

@Override
public int read(byte[] b, int off, int len) throws IOException {
int bytesRead = super.read(b, off, len);
if (bytesRead > 0) {
position += bytesRead;
}
return bytesRead;
}

@Override
public long skip(long n) throws IOException {
long skipped;
skipped = super.skip(n);
position += skipped;
return skipped;
}

@Override
public synchronized void mark(int readlimit) {
return;
}

@Override
public synchronized void reset() throws IOException {
return;
}

@Override
public boolean markSupported() {
return false;
}

}

你会像这样使用它:

File f = new File("filename.txt");
ByteCountingInputStream bcis = new ByteCountingInputStream(new FileInputStream(f));
LineNumberReader lnr = new LineNumberReader(new InputStreamReader(bcis));
int chars = 0;
String line;
while ((line = lnr.readLine()) != null) {
chars += line.length() + 2;
System.out.println("Chars read: " + chars);
System.out.println("Bytes read: " + bcis.getPosition());
}

你会注意到一些事情:

  1. 此版本计算字节数,因为它实现了 InputStream。
  2. 自己在客户端代码中计算字符或字节数可能会更容易。
  3. 此代码将在字节从文件系统读取到缓冲区后立即对其进行计数,即使它们尚未被 LineNumberReader 处理也是如此。您可以将计数字符放在 LineNumberReader 的子类中来解决这个问题。遗憾的是,您无法轻松生成百分比,因为与字节不同,没有廉价的方法可以知道文件中的字符数。

关于java - 我如何找出从流中读取了多少个字符或字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11075709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com