2010-07-24 34 views
4

我正在用JAVA(J2ME准确地)写一个自定义存档格式。存档工作正常,但是我在解压缩时遇到了一些问题。Java的DataInputStream.readUTF和读取的字节数

如何通过readUTF方法读取UTF8字符串时读取多少字节?我知道使用writeUTF保存的字符串的前两个字节是字符串长度的短值,但我想要一个更好的解决方案。

或者有什么方法可以知道直到DataInputStream结束时剩下多少个字节(available方法似乎没有返回有意义的值)。该流通过FileConnection打开,即FileConnection.openDataInputStream

谢谢你们!

回答

4

我无法直接看到使用CLDC API实现此目的的方法。然而,一个简单的解决方案是推出自己的“CountingInputStream”,它扩展了InputStream并计算读取的字节数。你基本上只需要重写三个读取方法。

文件大小通过FileConnection可用。

+0

我知道'fileSize()'。我同意'CountingInputStream',但这看起来很丑陋(至少对我来说)。 – 2010-07-24 13:48:41

+0

我明白你的观点,但我不认为这很丑陋。这样的类相当有用,并且绝对可重用,在FileConnections之外的其他情况下也是如此。即使它稍微丑陋,它也被封装并存放在一个小班中。 – aioobe 2010-07-25 09:04:16

1

available()方法返回记录返回的内容,这不是您正在尝试使用它的内容。看到Javadoc。

您可以编写自己的字节计数FilterInputStream并将其放在数据输入流和基础流之间。但是您必须从源中获取源的总字节数,该信息不可用于任何输入流。

+0

据我所知,FilterInputStream中的不可用MID上的个人资料。 – aioobe 2010-07-24 13:20:39

+0

真的不重要,你可以轻松地自己写下它。 – EJP 2010-07-24 13:22:13

+0

你也真的需要这些字节数吗?当你到达流的末尾时,你将得到EOF指示... – EJP 2010-07-24 13:24:54

2

这可能有点晚,但我最近一直在一些地方,我需要知道,有一直读取的字节数,而不是有多少是留下被读取,如这个问题问。但是你可以从我得到的解决方案中得到这个数字。我想知道读取的字节数量,以便我可以监视下载的进度(以防它花了一段时间)。

我最初只是使用DataInputStream#readFully()来下载文件。

buffer = new byte[length]; 
in.readFully(buffer); 

但有时我被留下等待50的任何地方 - 60秒下载完成,这取决于大小。我想实时更新事情的进展情况,所以我改为使用常规的DataInputStream#read(byte [] b,int off,int len)。所以在最后告诉我是一个有的System.out每当我跨越过一个个百分点:

buffer = new byte[length]; 
int totalRead = 0; 
int percentage = 0; 

while (totalRead < length) 
{ 
    int bytesRead = in.read(buffer, totalRead, (length - totalRead)); 

    if (bytesRead < 0) 
     throw new IOException("Data stream ended prematurely"); 

    totalRead += bytesRead; 
    double progress = ((totalRead*1.0)/length) * 100; 
    if ((int)progress > percentage) 
    { 
     percentage = (int)progress; 
     System.out.println("Downloading: " + percentage + "%"); 
    } 
} 

知道有多少字节要被读取,一些小的修改可到最后的例子进行说明。有一个跟踪变量来代替我的百分比,例如:

buffer = new byte[length]; 
int totalRead = 0; 
int bytesLeft= 0; 

while (totalRead < length) 
{ 
    bytesLeft = length - totalRead; 
    int bytesRead = in.read(buffer, totalRead, bytesLeft); 

    if (bytesRead < 0) 
     throw new IOException("Data stream ended prematurely"); 

    totalRead += bytesRead; 
    System.out.println("Bytes left to read: " + bytesLeft); 
} 
0

这是一个相当古老的问题,但我会后我的解决方案,因为它可能帮助别人:

其实是有一个方便的CountingInputStream在Apache的百科全书IO http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/input/CountingInputStream.html

它从java.io.FilterInputStream中衍生包装,所以你基本上可以将其套在任何标准输入流。

在你的情况下,假设DataInputStream类变量表示你一起工作流:

CountingInputStream counter = new CountingInputStream(dataInputStream); 
dataInputStream = new DataInputStream(counter); 
... 
counter.getByteCount() //this returns num of bytes read from dataInputStream